@ditojs/ui 3.0.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4300,5 +4300,3 @@ var ns = ts, rs = (e, t) => Object.assign(e.style, t), is = (e) => setTimeout(e,
4300
4300
  };
4301
4301
  //#endregion
4302
4302
  export { Pa as DitoButton, lo as DitoCalendar, Do as DitoDatePicker, Ho as DitoDateTimePicker, Co as DitoIcon, xo as DitoInput, Yo as DitoPagination, es as DitoSwitch, zo as DitoTimePicker, vo as DitoTrigger, ns as TransitionHeight, uo as addEvents, Ia as alterDate, fo as combineEvents, Fa as describeDate, Ra as getDatePartAtPosition, po as getKey, mo as getKeyNavigation, To as getSelection, Da as hasSlotContent, Ea as hasVNodeContent, La as parseDate, Oa as raw, wo as setSelection };
4303
-
4304
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS5lcy5qcyIsIm5hbWVzIjpbImhhc093blByb3BlcnR5IiwiaXNTdHJpbmciLCJoeXBoZW5hdGUiLCJpc1JlZiIsIndhcm4iLCJpc1N0cmluZyIsIndhdGNoJDEiLCJfaG9pc3RlZF8xIiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzMiLCJfaG9pc3RlZF80IiwicmVuZGVyIiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfbWVyZ2VQcm9wcyIsIl9yZW5kZXJTbG90IiwiX2NyZWF0ZUNvbW1lbnRWTm9kZSIsIl9jcmVhdGVUZXh0Vk5vZGUiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX3NmY19tYWluIiwiX3NmY19yZW5kZXIiLCJfaG9pc3RlZF8xIiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzMiLCJfaG9pc3RlZF80IiwiX2hvaXN0ZWRfNSIsIl9ob2lzdGVkXzYiLCJfaG9pc3RlZF83IiwiX2hvaXN0ZWRfOCIsIl9ob2lzdGVkXzkiLCJfaG9pc3RlZF8xMCIsInJlbmRlciIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9GcmFnbWVudCIsIl90b0Rpc3BsYXlTdHJpbmciLCJfcmVuZGVyTGlzdCIsIl9ub3JtYWxpemVDbGFzcyIsIl9jcmVhdGVDb21tZW50Vk5vZGUiLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsIl9ob2lzdGVkXzEiLCJyZW5kZXIiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ub3JtYWxpemVDbGFzcyIsIl9yZW5kZXJTbG90IiwiX2NyZWF0ZUNvbW1lbnRWTm9kZSIsIl9jcmVhdGVWTm9kZSIsIl9UcmFuc2l0aW9uIiwiX3dpdGhDdHgiLCJfd2l0aERpcmVjdGl2ZXMiLCJfbm9ybWFsaXplU3R5bGUiLCJfdlNob3ciLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsIl9ob2lzdGVkXzEiLCJyZW5kZXIiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9ub3JtYWxpemVDbGFzcyIsIl9yZW5kZXJTbG90IiwiX3dpdGhEaXJlY3RpdmVzIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9tZXJnZVByb3BzIiwiX3ZNb2RlbER5bmFtaWMiLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsInJlbmRlciIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX25vcm1hbGl6ZUNsYXNzIiwiX3NmY19tYWluIiwiX3NmY19yZW5kZXIiLCJyZW5kZXIiLCJfcmVzb2x2ZUNvbXBvbmVudCIsIl9vcGVuQmxvY2siLCJfY3JlYXRlQmxvY2siLCJfbWVyZ2VQcm9wcyIsIl93aXRoQ3R4IiwiX3JlbmRlclNsb3QiLCJfd2l0aE1vZGlmaWVycyIsIl9jcmVhdGVWTm9kZSIsIl9zZmNfbWFpbiIsIl9zZmNfcmVuZGVyIiwiX2hvaXN0ZWRfMSIsIl9ob2lzdGVkXzIiLCJfaG9pc3RlZF8zIiwiX2hvaXN0ZWRfNCIsIl9ob2lzdGVkXzUiLCJyZW5kZXIiLCJfcmVzb2x2ZUNvbXBvbmVudCIsIl9vcGVuQmxvY2siLCJfY3JlYXRlQmxvY2siLCJfbWVyZ2VQcm9wcyIsIl93aXRoQ3R4IiwiX3JlbmRlclNsb3QiLCJfd2l0aE1vZGlmaWVycyIsIl9jcmVhdGVWTm9kZSIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX0ZyYWdtZW50IiwiX3JlbmRlckxpc3QiLCJfbm9ybWFsaXplQ2xhc3MiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2NyZWF0ZUNvbW1lbnRWTm9kZSIsIl9zZmNfbWFpbiIsIl9zZmNfcmVuZGVyIiwiX2hvaXN0ZWRfMSIsInJlbmRlciIsIl9yZXNvbHZlQ29tcG9uZW50IiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX25vcm1hbGl6ZUNsYXNzIiwiX2NyZWF0ZVZOb2RlIiwiX21lcmdlUHJvcHMiLCJfd2l0aE1vZGlmaWVycyIsIl93aXRoQ3R4IiwiX3JlbmRlclNsb3QiLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsIl9ob2lzdGVkXzEiLCJfaG9pc3RlZF8yIiwiX2hvaXN0ZWRfMyIsInJlbmRlciIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX0ZyYWdtZW50IiwiX2NyZWF0ZVRleHRWTm9kZSIsIl90b0Rpc3BsYXlTdHJpbmciLCJfY3JlYXRlQ29tbWVudFZOb2RlIiwiX3JlbmRlckxpc3QiLCJfbm9ybWFsaXplQ2xhc3MiLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX25vcm1hbGl6ZUNsYXNzIiwiX25vcm1hbGl6ZVN0eWxlIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl93aXRoRGlyZWN0aXZlcyIsIl9tZXJnZVByb3BzIiwiX3ZNb2RlbENoZWNrYm94IiwiX3JlbmRlclNsb3QiLCJfY3JlYXRlVGV4dFZOb2RlIiwiX3RvRGlzcGxheVN0cmluZyIsIl9jcmVhdGVDb21tZW50Vk5vZGUiLCJfc2ZjX21haW4iLCJfc2ZjX3JlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJtYWtlTWFwIiwibWFwIiwia2V5Iiwic3RyIiwidmFsIiwiRU1QVFlfT0JKIiwiRU1QVFlfQVJSIiwiTk9PUCIsImlzT24iLCJpc01vZGVsTGlzdGVuZXIiLCJleHRlbmQiLCJoYXNPd25Qcm9wZXJ0eSQxIiwiaGFzT3duIiwiaXNBcnJheSIsImlzTWFwIiwidG9UeXBlU3RyaW5nIiwiaXNTZXQiLCJpc0RhdGUiLCJpc0Z1bmN0aW9uIiwiaXNTdHJpbmckMSIsImlzU3ltYm9sIiwiaXNPYmplY3QiLCJpc1Byb21pc2UiLCJvYmplY3RUb1N0cmluZyIsInZhbHVlIiwidG9SYXdUeXBlIiwiaXNQbGFpbk9iamVjdCIsImlzSW50ZWdlcktleSIsImNhY2hlU3RyaW5nRnVuY3Rpb24iLCJjYWNoZSIsImZuIiwiY2FtZWxpemVSRSIsImNhbWVsaXplIiwiYyIsImNhcGl0YWxpemUiLCJ0b0hhbmRsZXJLZXkiLCJoYXNDaGFuZ2VkIiwib2xkVmFsdWUiLCJpbnZva2VBcnJheUZucyIsImFyZyIsImkiLCJmbnMiLCJkZWYiLCJvYmoiLCJsb29zZVRvTnVtYmVyIiwibiIsInRvTnVtYmVyIiwiX2dsb2JhbFRoaXMiLCJnZXRHbG9iYWxUaGlzIiwibm9ybWFsaXplU3R5bGUiLCJyZXMiLCJpdGVtIiwibm9ybWFsaXplZCIsInBhcnNlU3RyaW5nU3R5bGUiLCJsaXN0RGVsaW1pdGVyUkUiLCJwcm9wZXJ0eURlbGltaXRlclJFIiwic3R5bGVDb21tZW50UkUiLCJyZXQiLCJjc3NUZXh0IiwibWF0Y2giLCJ0bXAiLCJub3JtYWxpemVDbGFzcyIsIm5hbWUiLCJsb29zZUNvbXBhcmVBcnJheXMiLCJhIiwiYiIsImVxdWFsIiwibG9vc2VFcXVhbCIsInNlZW4iLCJsb29zZUNvbXBhcmVDb2xsZWN0aW9ucyIsImNhbmRpZGF0ZXMiLCJtYXRjaGVkIiwiaW5kZXgiLCJsb29zZUNvbXBhcmVPYmplY3RzIiwiYVZhbGlkVHlwZSIsImJWYWxpZFR5cGUiLCJhSGFzS2V5IiwiYkhhc0tleSIsImxvb3NlQ29tcGFyZU5lc3RlZCIsInNlZW5BIiwic2VlbkIiLCJjb21wYXJlIiwibG9vc2VJbmRleE9mIiwiYXJyIiwiaXNSZWYkMSIsIlwiX192X2lzUmVmXCIiLCJ0b0Rpc3BsYXlTdHJpbmciLCJyZXBsYWNlciIsIl9rZXkiLCJ2YWwyIiwic3RyaW5naWZ5U3ltYm9sIiwiZW50cmllcyIsInYiLCJ3YXJuJDIiLCJhcmdzIiwibXNnIiwiYWN0aXZlU3ViIiwicGF1c2VkUXVldWVFZmZlY3RzIiwiUmVhY3RpdmVFZmZlY3QiLCJiYXRjaCIsImNsZWFudXBFZmZlY3QiLCJwcmVwYXJlRGVwcyIsInByZXZFZmZlY3QiLCJwcmV2U2hvdWxkVHJhY2siLCJzaG91bGRUcmFjayIsImNsZWFudXBEZXBzIiwibGluayIsImlzRGlydHkiLCJiYXRjaERlcHRoIiwiYmF0Y2hlZFN1YiIsImJhdGNoZWRDb21wdXRlZCIsImlzQ29tcHV0ZWQiLCJzdWIiLCJzdGFydEJhdGNoIiwiZW5kQmF0Y2giLCJuZXh0IiwiZXJyb3IiLCJlIiwiZXJyIiwiaGVhZCIsInRhaWwiLCJwcmV2IiwicmVtb3ZlU3ViIiwicmVtb3ZlRGVwIiwicmVmcmVzaENvbXB1dGVkIiwiY29tcHV0ZWQiLCJnbG9iYWxWZXJzaW9uIiwiZGVwIiwicHJldlN1YiIsIm5leHRTdWIiLCJsIiwic29mdCIsInByZXZEZXAiLCJuZXh0RGVwIiwidHJhY2tTdGFjayIsInBhdXNlVHJhY2tpbmciLCJyZXNldFRyYWNraW5nIiwibGFzdCIsImNsZWFudXAiLCJMaW5rIiwiRGVwIiwiYWRkU3ViIiwiZGVidWdJbmZvIiwiY3VycmVudFRhaWwiLCJ0YXJnZXRNYXAiLCJJVEVSQVRFX0tFWSIsIk1BUF9LRVlfSVRFUkFURV9LRVkiLCJBUlJBWV9JVEVSQVRFX0tFWSIsInRyYWNrIiwiZGVwc01hcCIsInRhcmdldCIsInRyaWdnZXIiLCJydW4iLCJ0eXBlIiwidGFyZ2V0SXNBcnJheSIsImlzQXJyYXlJbmRleCIsIm5ld0xlbmd0aCIsIm5ld1ZhbHVlIiwia2V5MiIsInJlYWN0aXZlUmVhZEFycmF5IiwicmF3IiwiYXJyYXkiLCJ0b1JlYWRvbmx5IiwidG9SZWFjdGl2ZSIsInNoYWxsb3dSZWFkQXJyYXkiLCJ0b1dyYXBwZWQiLCJhcnJheUluc3RydW1lbnRhdGlvbnMiLCJpdGVyYXRvciIsIngiLCJhcHBseSIsInRoaXNBcmciLCJzZWFyY2hQcm94eSIsInNlcGFyYXRvciIsIm5vVHJhY2tpbmciLCJyZWR1Y2UiLCJjb21wYXJlciIsInNlbGYiLCJpdGVyIiwibWV0aG9kIiwicmVzdWx0Iiwid3JhcFZhbHVlIiwiYXJyYXlQcm90byIsIm5lZWRzV3JhcCIsIm1ldGhvZEZuIiwicmVzdWx0MiIsIndyYXBwZWRGbiIsIndyYXBwZWRSZXRGbiIsIndyYXBJbml0aWFsQWNjdW11bGF0b3IiLCJhY2MiLCJpc05vblRyYWNrYWJsZUtleXMiLCJidWlsdEluU3ltYm9scyIsImhhc093blByb3BlcnR5IiwiQmFzZVJlYWN0aXZlSGFuZGxlciIsIl9pc1JlYWRvbmx5IiwiX2lzU2hhbGxvdyIsIlwiX192X3NraXBcIiIsImlzUmVhZG9ubHkyIiwiaXNTaGFsbG93MiIsInJlY2VpdmVyIiwic2hhbGxvd1JlYWRvbmx5TWFwIiwicmVhZG9ubHlNYXAiLCJzaGFsbG93UmVhY3RpdmVNYXAiLCJyZWFjdGl2ZU1hcCIsIk11dGFibGVSZWFjdGl2ZUhhbmRsZXIiLCJpc0FycmF5V2l0aEludGVnZXJLZXkiLCJpc09sZFZhbHVlUmVhZG9ubHkiLCJoYWRLZXkiLCJSZWFkb25seVJlYWN0aXZlSGFuZGxlciIsIm11dGFibGVIYW5kbGVycyIsInJlYWRvbmx5SGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlIYW5kbGVycyIsInRvU2hhbGxvdyIsImdldFByb3RvIiwiY3JlYXRlSXRlcmFibGVNZXRob2QiLCJcIl9fdl9yYXdcIiIsInJhd1RhcmdldCIsInRhcmdldElzTWFwIiwiaXNQYWlyIiwiaXNLZXlPbmx5IiwiaW5uZXJJdGVyYXRvciIsIndyYXAiLCJkb25lIiwiY3JlYXRlUmVhZG9ubHlNZXRob2QiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25zIiwiaW5zdHJ1bWVudGF0aW9ucyIsInJhd0tleSIsInJlYWRvbmx5Iiwic2hhbGxvdyIsImhhcyIsIm9ic2VydmVkIiwiY2FsbGJhY2siLCJwcm90byIsInJhd1ZhbHVlIiwidmFsdWVUb0FkZCIsImNoZWNrSWRlbnRpdHlLZXlzIiwiZ2V0IiwiaGFkSXRlbXMiLCJvbGRUYXJnZXQiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIiLCJtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzIiwicmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJ0YXJnZXRUeXBlTWFwIiwicmF3VHlwZSIsInJlYWN0aXZlIiwiY3JlYXRlUmVhY3RpdmVPYmplY3QiLCJzaGFsbG93UmVhZG9ubHkiLCJcIl9fdl9pc1JlYWN0aXZlXCIiLCJleGlzdGluZ1Byb3h5IiwicHJveHlNYXAiLCJ0YXJnZXRUeXBlIiwicHJveHkiLCJjb2xsZWN0aW9uSGFuZGxlcnMiLCJiYXNlSGFuZGxlcnMiLCJpc1JlYWN0aXZlIiwiaXNSZWFkb25seSIsIlwiX192X2lzUmVhZG9ubHlcIiIsImlzU2hhbGxvdyIsIlwiX192X2lzU2hhbGxvd1wiIiwiaXNQcm94eSIsInRvUmF3IiwibWFya1JhdyIsImlzUmVmIiwiciIsInVucmVmIiwicmVmMiIsInNoYWxsb3dVbndyYXBIYW5kbGVycyIsInByb3h5UmVmcyIsIm9iamVjdFdpdGhSZWZzIiwiSU5JVElBTF9XQVRDSEVSX1ZBTFVFIiwiY2xlYW51cE1hcCIsImFjdGl2ZVdhdGNoZXIiLCJvbldhdGNoZXJDbGVhbnVwIiwib3duZXIiLCJjbGVhbnVwcyIsImNsZWFudXBGbiIsImZhaWxTaWxlbnRseSIsIndhdGNoIiwib3B0aW9ucyIsIndhcm5JbnZhbGlkU291cmNlIiwicyIsInJlYWN0aXZlR2V0dGVyIiwiZGVlcCIsInNvdXJjZTIiLCJ0cmF2ZXJzZSIsImVmZmVjdCIsImdldHRlciIsImJvdW5kQ2xlYW51cCIsImZvcmNlVHJpZ2dlciIsImlzTXVsdGlTb3VyY2UiLCJzb3VyY2UiLCJjYWxsIiwiY2IiLCJjdXJyZW50RWZmZWN0IiwiYmFzZUdldHRlciIsImRlcHRoIiwid2F0Y2hIYW5kbGUiLCJvbmNlIiwiX2NiIiwiam9iIiwiaW1tZWRpYXRlRmlyc3RSdW4iLCJjdXJyZW50V2F0Y2hlciIsImF1Z21lbnRKb2IiLCJzY2hlZHVsZXIiLCJjbGVhbnVwMiIsImltbWVkaWF0ZSIsInN0YWNrIiwicHVzaFdhcm5pbmdDb250ZXh0Iiwidm5vZGUiLCJwb3BXYXJuaW5nQ29udGV4dCIsImlzV2FybmluZyIsIndhcm4kMSIsImluc3RhbmNlIiwiYXBwV2FybkhhbmRsZXIiLCJ0cmFjZSIsImdldENvbXBvbmVudFRyYWNlIiwiZm9ybWF0Q29tcG9uZW50TmFtZSIsIndhcm5BcmdzIiwiZm9ybWF0VHJhY2UiLCJjdXJyZW50Vk5vZGUiLCJub3JtYWxpemVkU3RhY2siLCJwYXJlbnRJbnN0YW5jZSIsImxvZ3MiLCJmb3JtYXRUcmFjZUVudHJ5IiwiZW50cnkiLCJwb3N0Zml4IiwicmVjdXJzZUNvdW50IiwiaXNSb290Iiwib3BlbiIsImNsb3NlIiwiZm9ybWF0UHJvcHMiLCJrZXlzIiwicHJvcHMiLCJmb3JtYXRQcm9wIiwiYXNzZXJ0TnVtYmVyIiwiRXJyb3JUeXBlU3RyaW5ncyQxIiwiXCJzcFwiIiwiXCJiY1wiIiwiXCJjXCIiLCJcImJtXCIiLCJcIm1cIiIsIlwiYnVcIiIsIlwidVwiIiwiXCJidW1cIiIsIlwidW1cIiIsIlwiYVwiIiwiXCJkYVwiIiwiXCJlY1wiIiwiXCJydGNcIiIsIlwicnRnXCIiLCJjYWxsV2l0aEVycm9ySGFuZGxpbmciLCJjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyIsInZhbHVlcyIsImhhbmRsZUVycm9yIiwiY29udGV4dFZOb2RlIiwiY3VyIiwiZXhwb3NlZEluc3RhbmNlIiwiZXJyb3JJbmZvIiwiZXJyb3JDYXB0dXJlZEhvb2tzIiwiZXJyb3JIYW5kbGVyIiwidGhyb3dJbkRldiIsInRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb24iLCJsb2dFcnJvciIsImluZm8iLCJ0aHJvd0luUHJvZCIsInF1ZXVlIiwiZmx1c2hJbmRleCIsInBlbmRpbmdQb3N0Rmx1c2hDYnMiLCJhY3RpdmVQb3N0Rmx1c2hDYnMiLCJwb3N0Rmx1c2hJbmRleCIsInJlc29sdmVkUHJvbWlzZSIsImN1cnJlbnRGbHVzaFByb21pc2UiLCJSRUNVUlNJT05fTElNSVQiLCJuZXh0VGljayIsInAiLCJmaW5kSW5zZXJ0aW9uSW5kZXgiLCJzdGFydCIsImVuZCIsIm1pZGRsZSIsIm1pZGRsZUpvYiIsIm1pZGRsZUpvYklkIiwiZ2V0SWQiLCJpZCIsInF1ZXVlSm9iIiwiam9iSWQiLCJsYXN0Sm9iIiwicXVldWVGbHVzaCIsImZsdXNoSm9icyIsInF1ZXVlUG9zdEZsdXNoQ2IiLCJmbHVzaFBvc3RGbHVzaENicyIsImRlZHVwZWQiLCJjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMiLCJjaGVjayIsImNvdW50IiwiY29tcG9uZW50TmFtZSIsImdldENvbXBvbmVudE5hbWUiLCJpc0htclVwZGF0aW5nIiwiaG1yRGlydHlDb21wb25lbnRzIiwidHJ5V3JhcCIsImNyZWF0ZVJlY29yZCIsInJlcmVuZGVyIiwicmVsb2FkIiwibm9ybWFsaXplQ2xhc3NDb21wb25lbnQiLCJpbml0aWFsRGVmIiwiaXNDbGFzc0NvbXBvbmVudCIsImNvbXBvbmVudCIsInJlY29yZCIsIm5ld1JlbmRlciIsIm5ld0NvbXAiLCJ1cGRhdGVDb21wb25lbnREZWYiLCJpbnN0YW5jZXMiLCJvbGRDb21wIiwiZGlydHlJbnN0YW5jZXMiLCJidWZmZXIiLCJlbWl0JDEiLCJkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQiLCJjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2siLCJob29rIiwiY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwiY3VycmVudFNjb3BlSWQiLCJzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UiLCJ3aXRoQ3R4IiwiY3R4IiwicmVuZGVyRm5XaXRoQ29udGV4dCIsInNldEJsb2NrVHJhY2tpbmciLCJwcmV2SW5zdGFuY2UiLCJwcmV2U3RhY2tTaXplIiwiYmxvY2tTdGFjayIsIndpdGhEaXJlY3RpdmVzIiwiZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2UiLCJiaW5kaW5ncyIsImRpcmVjdGl2ZXMiLCJkaXIiLCJtb2RpZmllcnMiLCJpbmplY3QiLCJnZXRDdXJyZW50SW5zdGFuY2UiLCJjdXJyZW50QXBwIiwicHJvdmlkZXMiLCJ0cmVhdERlZmF1bHRBc0ZhY3RvcnkiLCJkZWZhdWx0VmFsdWUiLCJzc3JDb250ZXh0S2V5IiwidXNlU1NSQ29udGV4dCIsImRvV2F0Y2giLCJiYXNlV2F0Y2hPcHRpb25zIiwicnVuc0ltbWVkaWF0ZWx5IiwiZmx1c2giLCJzc3JDbGVhbnVwIiwiaXNJblNTUkNvbXBvbmVudFNldHVwIiwid2F0Y2hTdG9wSGFuZGxlIiwiY3VycmVudEluc3RhbmNlIiwiaXNQcmUiLCJpc0ZpcnN0UnVuIiwiaW5zdGFuY2VXYXRjaCIsInB1YmxpY1RoaXMiLCJjcmVhdGVQYXRoR2V0dGVyIiwicmVzZXQiLCJzZXRDdXJyZW50SW5zdGFuY2UiLCJzZWdtZW50cyIsInBhdGgiLCJpc1RlbGVwb3J0IiwibGVhdmVDYktleSIsImVudGVyQ2JLZXkiLCJ1c2VUcmFuc2l0aW9uU3RhdGUiLCJzdGF0ZSIsIm9uTW91bnRlZCIsIm9uQmVmb3JlVW5tb3VudCIsIlRyYW5zaXRpb25Ib29rVmFsaWRhdG9yIiwiQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJyZWN1cnNpdmVHZXRTdWJ0cmVlIiwic3ViVHJlZSIsIkJhc2VUcmFuc2l0aW9uSW1wbCIsImNoaWxkcmVuIiwic2xvdHMiLCJnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4iLCJjaGlsZCIsImZpbmROb25Db21tZW50Q2hpbGQiLCJjcmVhdGVDb21tZW50Vk5vZGUiLCJyYXdQcm9wcyIsIm1vZGUiLCJlbXB0eVBsYWNlaG9sZGVyIiwiaW5uZXJDaGlsZCIsImdldElubmVyQ2hpbGQkMSIsImVudGVySG9va3MiLCJyZXNvbHZlVHJhbnNpdGlvbkhvb2tzIiwiaG9va3MiLCJDb21tZW50Iiwic2V0VHJhbnNpdGlvbkhvb2tzIiwib2xkSW5uZXJDaGlsZCIsImlzU2FtZVZOb2RlVHlwZSIsImxlYXZpbmdIb29rcyIsImxlYXZpbmdWTm9kZXNDYWNoZSIsImdldExlYXZpbmdOb2Rlc0ZvclR5cGUiLCJlYXJseVJlbW92ZSIsImRlbGF5ZWRMZWF2ZSIsImhhc0ZvdW5kIiwiQmFzZVRyYW5zaXRpb24iLCJsZWF2aW5nVk5vZGVzIiwiY2FsbEhvb2siLCJjYWxsQXN5bmNIb29rIiwiaG9vazIiLCJvbkJlZm9yZUVudGVyIiwiYXBwZWFyIiwib25CZWZvcmVBcHBlYXIiLCJlbCIsImxlYXZpbmdWTm9kZSIsIm9uRW50ZXIiLCJhZnRlckhvb2siLCJvbkFmdGVyRW50ZXIiLCJjYW5jZWxIb29rIiwib25FbnRlckNhbmNlbGxlZCIsIm9uQXBwZWFyIiwib25BZnRlckFwcGVhciIsIm9uQXBwZWFyQ2FuY2VsbGVkIiwiY2FsbGVkIiwiY2FuY2VsbGVkIiwicmVtb3ZlIiwib25CZWZvcmVMZWF2ZSIsIm9uTGVhdmVDYW5jZWxsZWQiLCJvbkFmdGVyTGVhdmUiLCJvbkxlYXZlIiwiaG9va3MyIiwidm5vZGUyIiwicG9zdENsb25lIiwiaXNLZWVwQWxpdmUiLCJjbG9uZVZOb2RlIiwic2hhcGVGbGFnIiwia2V5ZWRGcmFnbWVudENvdW50IiwicGFyZW50S2V5IiwiRnJhZ21lbnQiLCJrZWVwQ29tbWVudCIsImlzQXN5bmNXcmFwcGVyIiwiaW5qZWN0SG9vayIsIndyYXBwZWRIb29rIiwicHJlcGVuZCIsImNyZWF0ZUhvb2siLCJsaWZlY3ljbGUiLCJDT01QT05FTlRTIiwicmVzb2x2ZUNvbXBvbmVudCIsInJlc29sdmVBc3NldCIsIm1heWJlU2VsZlJlZmVyZW5jZSIsIk5VTExfRFlOQU1JQ19DT01QT05FTlQiLCJDb21wb25lbnQiLCJzZWxmTmFtZSIsInJlc29sdmUiLCJ3YXJuTWlzc2luZyIsImV4dHJhIiwicmVnaXN0cnkiLCJyZW5kZXJMaXN0IiwiY2FjaGVkIiwic291cmNlSXNBcnJheSIsInNvdXJjZUlzUmVhY3RpdmVBcnJheSIsImlzUmVhZG9ubHlTb3VyY2UiLCJyZW5kZXJJdGVtIiwicmVuZGVyU2xvdCIsInNsb3RQcm9wcyIsImJyYW5jaEtleSIsImhhc1Byb3BzIiwib3BlbkJsb2NrIiwiY3JlYXRlQmxvY2siLCJjcmVhdGVWTm9kZSIsImZhbGxiYWNrIiwic2xvdCIsInJlbmRlcmVkIiwidmFsaWRTbG90Q29udGVudCIsImVuc3VyZVZhbGlkVk5vZGUiLCJzbG90S2V5Iiwibm9TbG90dGVkIiwidm5vZGVzIiwiaXNWTm9kZSIsImdldFB1YmxpY0luc3RhbmNlIiwiaXNTdGF0ZWZ1bENvbXBvbmVudCIsInJlc29sdmVEZXZSb290RWwiLCJmb3VuZCIsInJvb3QiLCJmaWx0ZXJTaW5nbGVSb290Iiwic3VzcGVuc2UiLCJnZXREZXZSb290RnJhZ21lbnRFbCIsInB1YmxpY1Byb3BlcnRpZXNNYXAiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsInVzZVNsb3RzIiwiZ2V0Q29udGV4dCIsImNhbGxlZEZ1bmN0aW9uTmFtZSIsImNyZWF0ZVNldHVwQ29udGV4dCIsIm5vcm1hbGl6ZVByb3BzT3JFbWl0cyIsImJhc2UiLCJleHRlbmRzT3B0aW9ucyIsImdsb2JhbE1peGlucyIsInJlc29sdmVkIiwibWl4aW5zIiwibWVyZ2VPcHRpb25zIiwibSIsIm9wdGlvbk1lcmdlU3RyYXRlZ2llcyIsImZyb20iLCJ0byIsInN0cmF0cyIsImFzTWl4aW4iLCJzdHJhdCIsImludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHMiLCJtZXJnZURhdGFGbiIsIm1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyIsIm1lcmdlT2JqZWN0T3B0aW9ucyIsIm1lcmdlQXNBcnJheSIsIm1lcmdlV2F0Y2hPcHRpb25zIiwibWVyZ2VJbmplY3QiLCJub3JtYWxpemVJbmplY3QiLCJtZXJnZWQiLCJzaW5nbGVSb290IiwicmVjdXJzZSIsImludGVybmFsT2JqZWN0UHJvdG8iLCJpc0ludGVybmFsT2JqZWN0IiwicXVldWVQb3N0UmVuZGVyRWZmZWN0IiwicXVldWVFZmZlY3RXaXRoU3VzcGVuc2UiLCJpc1N1c3BlbnNlIiwiVGV4dCIsImN1cnJlbnRCbG9jayIsImRpc2FibGVUcmFja2luZyIsImNsb3NlQmxvY2siLCJpc0Jsb2NrVHJlZUVuYWJsZWQiLCJpblZPbmNlIiwic2V0dXBCbG9jayIsImNyZWF0ZUVsZW1lbnRCbG9jayIsImNyZWF0ZUJhc2VWTm9kZSIsInBhdGNoRmxhZyIsImR5bmFtaWNQcm9wcyIsIm4yIiwibjEiLCJjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIiwiX2NyZWF0ZVZOb2RlIiwibm9ybWFsaXplS2V5Iiwibm9ybWFsaXplUmVmIiwicmVmIiwicmVmX2tleSIsInJlZl9mb3IiLCJuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiIsIm5vcm1hbGl6ZUNoaWxkcmVuIiwib3ZlcndyaXRpbmdQcm9wIiwiaGFzQ29udGVudENoaWxkcmVuIiwiaXNCbG9ja05vZGUiLCJjbG9uZWQiLCJndWFyZFJlYWN0aXZlUHJvcHMiLCJrbGFzcyIsInN0eWxlIiwibWVyZ2VkUHJvcHMiLCJleHRyYVByb3BzIiwibWVyZ2VQcm9wcyIsIm1lcmdlUmVmIiwiZGVlcENsb25lVk5vZGUiLCJ0cmFuc2l0aW9uIiwiY2xvbmVUcmFuc2l0aW9uIiwiY3JlYXRlVGV4dFZOb2RlIiwidGV4dCIsImZsYWciLCJhc0Jsb2NrIiwic2xvdEZsYWciLCJ0b01lcmdlIiwiZXhpc3RpbmciLCJpbmNvbWluZyIsImludGVybmFsU2V0Q3VycmVudEluc3RhbmNlIiwiZyIsInJlZ2lzdGVyR2xvYmFsU2V0dGVyIiwic2V0dGVycyIsInNldHRlciIsInNldCIsImF0dHJzUHJveHlIYW5kbGVycyIsImdldFNsb3RzUHJveHkiLCJleHBvc2UiLCJleHBvc2VkIiwiZXhwb3NlZFR5cGUiLCJhdHRyc1Byb3h5Iiwic2xvdHNQcm94eSIsImV2ZW50IiwiY2xhc3NpZnlSRSIsImNsYXNzaWZ5IiwiaW5jbHVkZUluZmVycmVkIiwiaW5mZXJGcm9tUmVnaXN0cnkiLCJoIiwicHJvcHNPckNoaWxkcmVuIiwiaW5pdEN1c3RvbUZvcm1hdHRlciIsInZ1ZVN0eWxlIiwibnVtYmVyU3R5bGUiLCJzdHJpbmdTdHlsZSIsImtleXdvcmRTdHlsZSIsImZvcm1hdHRlciIsImdlblJlZkZsYWciLCJmb3JtYXRWYWx1ZSIsImZvcm1hdEluc3RhbmNlIiwiYmxvY2tzIiwiY3JlYXRlSW5zdGFuY2VCbG9jayIsImV4dHJhY3RLZXlzIiwiaW5qZWN0ZWQiLCJhc1JhdyIsIkNvbXAiLCJleHRyYWN0ZWQiLCJpc0tleU9mVHlwZSIsIm9wdHMiLCJ3YXJuIiwiVFJBTlNJVElPTiIsIkFOSU1BVElPTiIsInZ0Y0tleSIsIkRPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiVHJhbnNpdGlvbiIsInQiLCJyZXNvbHZlVHJhbnNpdGlvblByb3BzIiwiaDIiLCJoYXNFeHBsaWNpdENhbGxiYWNrIiwiYmFzZVByb3BzIiwiZW50ZXJGcm9tQ2xhc3MiLCJlbnRlckFjdGl2ZUNsYXNzIiwiZW50ZXJUb0NsYXNzIiwiZHVyYXRpb25zIiwibm9ybWFsaXplRHVyYXRpb24iLCJkdXJhdGlvbiIsImVudGVyRHVyYXRpb24iLCJsZWF2ZUR1cmF0aW9uIiwiZmluaXNoRW50ZXIiLCJpc0NhbmNlbGxlZCIsInJlbW92ZVRyYW5zaXRpb25DbGFzcyIsImlzQXBwZWFyIiwiYXBwZWFyVG9DbGFzcyIsImFwcGVhckFjdGl2ZUNsYXNzIiwiZmluaXNoTGVhdmUiLCJsZWF2ZUZyb21DbGFzcyIsImxlYXZlVG9DbGFzcyIsImxlYXZlQWN0aXZlQ2xhc3MiLCJtYWtlRW50ZXJIb29rIiwibmV4dEZyYW1lIiwiYXBwZWFyRnJvbUNsYXNzIiwiYWRkVHJhbnNpdGlvbkNsYXNzIiwid2hlblRyYW5zaXRpb25FbmRzIiwiZm9yY2VSZWZsb3ciLCJOdW1iZXJPZiIsImNscyIsIl92dGMiLCJlbmRJZCIsInJlc29sdmVJZk5vdFN0YWxlIiwiZXhwbGljaXRUaW1lb3V0IiwiZ2V0VHJhbnNpdGlvbkluZm8iLCJleHBlY3RlZFR5cGUiLCJlbmRFdmVudCIsImVuZGVkIiwib25FbmQiLCJwcm9wQ291bnQiLCJ0aW1lb3V0Iiwic3R5bGVzIiwiZ2V0U3R5bGVQcm9wZXJ0aWVzIiwidHJhbnNpdGlvbkRlbGF5cyIsInRyYW5zaXRpb25EdXJhdGlvbnMiLCJ0cmFuc2l0aW9uVGltZW91dCIsImdldFRpbWVvdXQiLCJhbmltYXRpb25EZWxheXMiLCJhbmltYXRpb25EdXJhdGlvbnMiLCJhbmltYXRpb25UaW1lb3V0IiwiaGFzVHJhbnNmb3JtIiwiZGVsYXlzIiwidG9NcyIsImQiLCJ2U2hvd09yaWdpbmFsRGlzcGxheSIsInZTaG93SGlkZGVuIiwidlNob3ciLCJzZXREaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZXIiLCJnZXRNb2RlbEFzc2lnbmVyIiwib25Db21wb3NpdGlvblN0YXJ0Iiwib25Db21wb3NpdGlvbkVuZCIsImFzc2lnbktleSIsImluaXRpYWxWYWx1ZUtleSIsImNhc3RWYWx1ZSIsInRyaW0iLCJudW1iZXIiLCJ2TW9kZWxUZXh0IiwiY2FzdFRvTnVtYmVyIiwibGF6eSIsImluaXRpYWxWYWx1ZSIsImVsVmFsdWUiLCJyb290Tm9kZSIsInZNb2RlbENoZWNrYm94IiwibW9kZWxWYWx1ZSIsImVsZW1lbnRWYWx1ZSIsImdldFZhbHVlIiwiY2hlY2tlZCIsImFzc2lnbiIsImZpbHRlcmVkIiwiZ2V0Q2hlY2tib3hWYWx1ZSIsInNldENoZWNrZWQiLCJiaW5kaW5nIiwidk1vZGVsUmFkaW8iLCJ2TW9kZWxTZWxlY3QiLCJzZWxlY3RlZFZhbCIsIm8iLCJtdWx0aXBsZSIsImFzc2lnbmVkVmFsdWUiLCJwZW5kaW5nIiwiaXNTYW1lU2VsZWN0VmFsdWUiLCJzZXRTZWxlY3RlZCIsImlzTXVsdGlwbGUiLCJpc0FycmF5VmFsdWUiLCJvcHRpb24iLCJvcHRpb25WYWx1ZSIsIm9wdGlvblR5cGUiLCJ2TW9kZWxEeW5hbWljIiwicHJldlZOb2RlIiwicmVzb2x2ZUR5bmFtaWNNb2RlbCIsInRhZ05hbWUiLCJjYWxsTW9kZWxIb29rIiwic3lzdGVtTW9kaWZpZXJzIiwibW9kaWZpZXJHdWFyZHMiLCJ3aXRoTW9kaWZpZXJzIiwiY2FjaGVLZXkiLCJndWFyZCIsImluaXREZXYiLCJoYXNWTm9kZUNvbnRlbnQiLCJhc0FycmF5IiwiaGFzU2xvdENvbnRlbnQiLCJpc1N0cmluZyIsIl9ob2lzdGVkXzEkNyIsIl9ob2lzdGVkXzIkNCIsIl9ob2lzdGVkXzMkNCIsIl9ob2lzdGVkXzQkMyIsInJlbmRlciQ5IiwiJG9wdGlvbnMiLCIkcHJvcHMiLCJfY3R4IiwiX3BsdWdpbl92dWVfZXhwb3J0X2hlbHBlcl9kZWZhdWx0Iiwic2ZjIiwiRGl0b0J1dHRvbl9kZWZhdWx0IiwiXyIsImF0dHJpYnV0ZXMiLCJkZXNjcmliZURhdGUiLCJkYXRlIiwiYWx0ZXJEYXRlIiwib3ZlcnJpZGVzIiwicGFyc2VEYXRlIiwidGltZURlZmF1bHQiLCJ0aW1lIiwicGVyaW9kIiwic3RyaW5nIiwiZGF5Iiwic2VwMSIsIm1vbnRoIiwic2VwMiIsInllYXIiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJnZXREYXRlUGFydHMiLCJsb2NhbGUiLCJwbSIsImdldE1vbnRoSW5kZXgiLCJpc1ZhbGlkVGltZVBhcnQiLCJwYXJ0IiwiZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIiwicGFydHMiLCJnZXRQb3NpdGlvbiIsInBvcyIsInBvc2l0aW9uIiwibGVuZ3RoIiwib2Zmc2V0IiwiaXNVUyIsInNob3J0Rm9ybWF0IiwibG9uZ0Zvcm1hdCIsIl9ob2lzdGVkXzEkNiIsIl9ob2lzdGVkXzIkMyIsIl9ob2lzdGVkXzMkMyIsIl9ob2lzdGVkXzQkMiIsIl9ob2lzdGVkXzUkMiIsIl9ob2lzdGVkXzYkMSIsIl9ob2lzdGVkXzckMSIsIl9ob2lzdGVkXzgkMSIsIl9ob2lzdGVkXzkkMSIsIl9ob2lzdGVkXzEwJDEiLCJfaG9pc3RlZF8xMSIsIl9ob2lzdGVkXzEyIiwiX2hvaXN0ZWRfMTMiLCJfaG9pc3RlZF8xNCIsIl9ob2lzdGVkXzE1IiwiX2hvaXN0ZWRfMTYiLCJfaG9pc3RlZF8xNyIsIl9ob2lzdGVkXzE4IiwicmVuZGVyJDgiLCIkZGF0YSIsIl9jYWNoZSIsIndlZWtkYXkiLCJfc2ZjX21haW4kOSIsImdldExvY2FsZU5hbWVzIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsIkRpdG9DYWxlbmRhcl9kZWZhdWx0IiwiYWRkRXZlbnRzIiwidGFyZ2V0cyIsImV2ZW50cyIsImNvbWJpbmVFdmVudHMiLCJnZXRLZXkiLCJnZXRLZXlOYXZpZ2F0aW9uIiwiZ2V0VGFyZ2V0IiwiX2hvaXN0ZWRfMSQ1IiwicmVuZGVyJDciLCJEaXRvVHJpZ2dlcl9kZWZhdWx0IiwiY2xhc3NlcyIsImh5cGhlbmF0ZSIsInNob3ciLCJwb3B1cCIsImJvdW5kcyIsInRyaWdnZXJMZWZ0IiwidHJpZ2dlclRvcCIsInRyaWdnZXJXaWR0aCIsInRyaWdnZXJIZWlnaHQiLCJwb3B1cFdpZHRoIiwicG9wdXBIZWlnaHQiLCJwYXJ0MSIsInBhcnQyIiwid2luV2lkdGgiLCJ3aW5IZWlnaHQiLCJsZWZ0IiwidG9wIiwidHJpZ2dlckJvdW5kcyIsInBhcmVudCIsImlucHV0IiwiX2hvaXN0ZWRfMSQ0IiwicmVuZGVyJDYiLCIkZXZlbnQiLCJEaXRvSW5wdXRfZGVmYXVsdCIsImdldExlbmd0aCIsInNpemUiLCJtaW4iLCJtYXgiLCJyZW5kZXIkNSIsIkRpdG9JY29uX2RlZmF1bHQiLCJwcmVmaXgiLCJzZXRTZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJyZW5kZXIkNCIsIl9jb21wb25lbnRfRGl0b0ljb24iLCJfY29tcG9uZW50X0RpdG9JbnB1dCIsIl9jb21wb25lbnRfRGl0b0NhbGVuZGFyIiwiX2NvbXBvbmVudF9EaXRvVHJpZ2dlciIsIkRpdG9EYXRlUGlja2VyX2RlZmF1bHQiLCJkZWZhdWx0Rm9ybWF0cyIsImZvcm1hdCIsImZvY3VzIiwiZ2V0RGF0ZVBhcnQiLCJjYWxlbmRhciIsInRvZ2dsZSIsIl9ob2lzdGVkXzEkMyIsIl9ob2lzdGVkXzIkMiIsIl9ob2lzdGVkXzMkMiIsIl9ob2lzdGVkXzQkMSIsIl9ob2lzdGVkXzUkMSIsIl9ob2lzdGVkXzYiLCJfaG9pc3RlZF83IiwiX2hvaXN0ZWRfOCIsIl9ob2lzdGVkXzkiLCJfaG9pc3RlZF8xMCIsInJlbmRlciQzIiwiRGl0b1RpbWVQaWNrZXJfZGVmYXVsdCIsInNlbGVjdGlvbiIsInNjcm9sbCIsImxpbmVIZWlnaHQiLCJkaXN0YW5jZSIsInNtb290aCIsImlzRGlnaXQiLCJjaGFyIiwiX2hvaXN0ZWRfMSQyIiwicmVuZGVyJDIiLCJfY29tcG9uZW50X0RpdG9EYXRlUGlja2VyIiwiX2NvbXBvbmVudF9EaXRvVGltZVBpY2tlciIsIkRpdG9EYXRlVGltZVBpY2tlcl9kZWZhdWx0IiwiYXNzaWduRGVlcGx5IiwiX2hvaXN0ZWRfMSQxIiwiX2hvaXN0ZWRfMiQxIiwiX2hvaXN0ZWRfMyQxIiwiX2hvaXN0ZWRfNCIsIl9ob2lzdGVkXzUiLCJyZW5kZXIkMSIsImJ1dHRvbiIsIkRpdG9QYWdpbmF0aW9uX2RlZmF1bHQiLCJzaG93TGVuZ3RoIiwic2hvd1ByZXYiLCJzaG93TmV4dCIsIm51bVBhZ2VzIiwiY3VycmVudFBhZ2UiLCJidXR0b25zIiwicGFnZSIsIl9ob2lzdGVkXzEiLCJfaG9pc3RlZF8yIiwiX2hvaXN0ZWRfMyIsInJlbmRlciIsIkRpdG9Td2l0Y2hfZGVmYXVsdCIsInVuY2hlY2tlZCIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwiX3NmY19tYWluIiwic2V0U3R5bGUiLCJlbGVtZW50IiwibmV4dFRpbWVvdXQiLCJmb3JjZVJlcGFpbnQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9zaGFyZWQvZGlzdC9zaGFyZWQuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9yZWFjdGl2aXR5L2Rpc3QvcmVhY3Rpdml0eS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtY29yZS9kaXN0L3J1bnRpbWUtY29yZS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtZG9tL2Rpc3QvcnVudGltZS1kb20uZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLWJ1bmRsZXIuanMiLCIuLi9zcmMvdXRpbHMvdnVlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0J1dHRvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQnV0dG9uLnZ1ZSIsIi4uL3NyYy91dGlscy9kYXRlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0NhbGVuZGFyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DYWxlbmRhci52dWUiLCIuLi9zcmMvdXRpbHMvZXZlbnQuanMiLCIuLi9zcmMvdXRpbHMvdHJpZ2dlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9JbnB1dC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvSW5wdXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0ljb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0ljb24udnVlIiwiLi4vc3JjL3V0aWxzL3NlbGVjdGlvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EYXRlUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EYXRlUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EYXRlVGltZVBpY2tlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvRGF0ZVRpbWVQaWNrZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1N3aXRjaC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU3dpdGNoLnZ1ZSIsIi4uL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiogQHZ1ZS9zaGFyZWQgdjMuNS40M1xuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIG1ha2VNYXAoc3RyKSB7XG4gIGNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzdHIuc3BsaXQoXCIsXCIpKSBtYXBba2V5XSA9IDE7XG4gIHJldHVybiAodmFsKSA9PiB2YWwgaW4gbWFwO1xufVxuXG5jb25zdCBFTVBUWV9PQkogPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gT2JqZWN0LmZyZWV6ZSh7fSkgOiB7fTtcbmNvbnN0IEVNUFRZX0FSUiA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBPYmplY3QuZnJlZXplKFtdKSA6IFtdO1xuY29uc3QgTk9PUCA9ICgpID0+IHtcbn07XG5jb25zdCBOTyA9ICgpID0+IGZhbHNlO1xuY29uc3QgaXNPbiA9IChrZXkpID0+IGtleS5jaGFyQ29kZUF0KDApID09PSAxMTEgJiYga2V5LmNoYXJDb2RlQXQoMSkgPT09IDExMCAmJiAvLyB1cHBlcmNhc2UgbGV0dGVyXG4oa2V5LmNoYXJDb2RlQXQoMikgPiAxMjIgfHwga2V5LmNoYXJDb2RlQXQoMikgPCA5Nyk7XG5jb25zdCBpc01vZGVsTGlzdGVuZXIgPSAoa2V5KSA9PiBrZXkuc3RhcnRzV2l0aChcIm9uVXBkYXRlOlwiKTtcbmNvbnN0IGV4dGVuZCA9IE9iamVjdC5hc3NpZ247XG5jb25zdCByZW1vdmUgPSAoYXJyLCBlbCkgPT4ge1xuICBjb25zdCBpID0gYXJyLmluZGV4T2YoZWwpO1xuICBpZiAoaSA+IC0xKSB7XG4gICAgYXJyLnNwbGljZShpLCAxKTtcbiAgfVxufTtcbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmNvbnN0IGhhc093biA9ICh2YWwsIGtleSkgPT4gaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XG5jb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmNvbnN0IGlzTWFwID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBNYXBdXCI7XG5jb25zdCBpc1NldCA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgU2V0XVwiO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiO1xuY29uc3QgaXNSZWdFeHAgPSAodmFsKSA9PiB0b1R5cGVTdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBpc1N0cmluZyA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCI7XG5jb25zdCBpc1N5bWJvbCA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwic3ltYm9sXCI7XG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiO1xuY29uc3QgaXNQcm9taXNlID0gKHZhbCkgPT4ge1xuICByZXR1cm4gKGlzT2JqZWN0KHZhbCkgfHwgaXNGdW5jdGlvbih2YWwpKSAmJiBpc0Z1bmN0aW9uKHZhbC50aGVuKSAmJiBpc0Z1bmN0aW9uKHZhbC5jYXRjaCk7XG59O1xuY29uc3Qgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9UeXBlU3RyaW5nID0gKHZhbHVlKSA9PiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbmNvbnN0IHRvUmF3VHlwZSA9ICh2YWx1ZSkgPT4ge1xuICByZXR1cm4gdG9UeXBlU3RyaW5nKHZhbHVlKS5zbGljZSg4LCAtMSk7XG59O1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgT2JqZWN0XVwiO1xuY29uc3QgaXNJbnRlZ2VyS2V5ID0gKGtleSkgPT4gaXNTdHJpbmcoa2V5KSAmJiBrZXkgIT09IFwiTmFOXCIgJiYga2V5WzBdICE9PSBcIi1cIiAmJiBcIlwiICsgcGFyc2VJbnQoa2V5LCAxMCkgPT09IGtleTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcm9wID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIC8vIHRoZSBsZWFkaW5nIGNvbW1hIGlzIGludGVudGlvbmFsIHNvIGVtcHR5IHN0cmluZyBcIlwiIGlzIGFsc28gaW5jbHVkZWRcbiAgXCIsa2V5LHJlZixyZWZfZm9yLHJlZl9rZXksb25Wbm9kZUJlZm9yZU1vdW50LG9uVm5vZGVNb3VudGVkLG9uVm5vZGVCZWZvcmVVcGRhdGUsb25Wbm9kZVVwZGF0ZWQsb25Wbm9kZUJlZm9yZVVubW91bnQsb25Wbm9kZVVubW91bnRlZFwiXG4pO1xuY29uc3QgaXNCdWlsdEluRGlyZWN0aXZlID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIFwiYmluZCxjbG9hayxlbHNlLWlmLGVsc2UsZm9yLGh0bWwsaWYsbW9kZWwsb24sb25jZSxwcmUsc2hvdyxzbG90LHRleHQsbWVtb1wiXG4pO1xuY29uc3QgY2FjaGVTdHJpbmdGdW5jdGlvbiA9IChmbikgPT4ge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKChzdHIpID0+IHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgfSk7XG59O1xuY29uc3QgY2FtZWxpemVSRSA9IC8tXFx3L2c7XG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oXG4gIChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgKGMpID0+IGMuc2xpY2UoMSkudG9VcHBlckNhc2UoKSk7XG4gIH1cbik7XG5jb25zdCBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG5jb25zdCBoeXBoZW5hdGUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKFxuICAoc3RyKSA9PiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgXCItJDFcIikudG9Mb3dlckNhc2UoKVxuKTtcbmNvbnN0IGNhcGl0YWxpemUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn0pO1xuY29uc3QgdG9IYW5kbGVyS2V5ID0gY2FjaGVTdHJpbmdGdW5jdGlvbihcbiAgKHN0cikgPT4ge1xuICAgIGNvbnN0IHMgPSBzdHIgPyBgb24ke2NhcGl0YWxpemUoc3RyKX1gIDogYGA7XG4gICAgcmV0dXJuIHM7XG4gIH1cbik7XG5jb25zdCBoYXNDaGFuZ2VkID0gKHZhbHVlLCBvbGRWYWx1ZSkgPT4gIU9iamVjdC5pcyh2YWx1ZSwgb2xkVmFsdWUpO1xuY29uc3QgaW52b2tlQXJyYXlGbnMgPSAoZm5zLCAuLi5hcmcpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOyBpKyspIHtcbiAgICBmbnNbaV0oLi4uYXJnKTtcbiAgfVxufTtcbmNvbnN0IGRlZiA9IChvYmosIGtleSwgdmFsdWUsIHdyaXRhYmxlID0gZmFsc2UpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlLFxuICAgIHZhbHVlXG4gIH0pO1xufTtcbmNvbnN0IGxvb3NlVG9OdW1iZXIgPSAodmFsKSA9PiB7XG4gIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG47XG59O1xuY29uc3QgdG9OdW1iZXIgPSAodmFsKSA9PiB7XG4gIGNvbnN0IG4gPSBpc1N0cmluZyh2YWwpID8gTnVtYmVyKHZhbCkgOiBOYU47XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG47XG59O1xubGV0IF9nbG9iYWxUaGlzO1xuY29uc3QgZ2V0R2xvYmFsVGhpcyA9ICgpID0+IHtcbiAgcmV0dXJuIF9nbG9iYWxUaGlzIHx8IChfZ2xvYmFsVGhpcyA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDoge30pO1xufTtcbmNvbnN0IGlkZW50UkUgPSAvXltfJGEtekEtWlxceEEwLVxcdUZGRkZdW18kYS16QS1aMC05XFx4QTAtXFx1RkZGRl0qJC87XG5mdW5jdGlvbiBnZW5Qcm9wc0FjY2Vzc0V4cChuYW1lKSB7XG4gIHJldHVybiBpZGVudFJFLnRlc3QobmFtZSkgPyBgX19wcm9wcy4ke25hbWV9YCA6IGBfX3Byb3BzWyR7SlNPTi5zdHJpbmdpZnkobmFtZSl9XWA7XG59XG5mdW5jdGlvbiBnZW5DYWNoZUtleShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHNvdXJjZSArIEpTT04uc3RyaW5naWZ5KFxuICAgIG9wdGlvbnMsXG4gICAgKF8sIHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiID8gdmFsLnRvU3RyaW5nKCkgOiB2YWxcbiAgKTtcbn1cblxuY29uc3QgUGF0Y2hGbGFncyA9IHtcbiAgXCJURVhUXCI6IDEsXG4gIFwiMVwiOiBcIlRFWFRcIixcbiAgXCJDTEFTU1wiOiAyLFxuICBcIjJcIjogXCJDTEFTU1wiLFxuICBcIlNUWUxFXCI6IDQsXG4gIFwiNFwiOiBcIlNUWUxFXCIsXG4gIFwiUFJPUFNcIjogOCxcbiAgXCI4XCI6IFwiUFJPUFNcIixcbiAgXCJGVUxMX1BST1BTXCI6IDE2LFxuICBcIjE2XCI6IFwiRlVMTF9QUk9QU1wiLFxuICBcIk5FRURfSFlEUkFUSU9OXCI6IDMyLFxuICBcIjMyXCI6IFwiTkVFRF9IWURSQVRJT05cIixcbiAgXCJTVEFCTEVfRlJBR01FTlRcIjogNjQsXG4gIFwiNjRcIjogXCJTVEFCTEVfRlJBR01FTlRcIixcbiAgXCJLRVlFRF9GUkFHTUVOVFwiOiAxMjgsXG4gIFwiMTI4XCI6IFwiS0VZRURfRlJBR01FTlRcIixcbiAgXCJVTktFWUVEX0ZSQUdNRU5UXCI6IDI1NixcbiAgXCIyNTZcIjogXCJVTktFWUVEX0ZSQUdNRU5UXCIsXG4gIFwiTkVFRF9QQVRDSFwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiTkVFRF9QQVRDSFwiLFxuICBcIkRZTkFNSUNfU0xPVFNcIjogMTAyNCxcbiAgXCIxMDI0XCI6IFwiRFlOQU1JQ19TTE9UU1wiLFxuICBcIkRFVl9ST09UX0ZSQUdNRU5UXCI6IDIwNDgsXG4gIFwiMjA0OFwiOiBcIkRFVl9ST09UX0ZSQUdNRU5UXCIsXG4gIFwiQ0FDSEVEXCI6IC0xLFxuICBcIi0xXCI6IFwiQ0FDSEVEXCIsXG4gIFwiQkFJTFwiOiAtMixcbiAgXCItMlwiOiBcIkJBSUxcIlxufTtcbmNvbnN0IFBhdGNoRmxhZ05hbWVzID0ge1xuICBbMV06IGBURVhUYCxcbiAgWzJdOiBgQ0xBU1NgLFxuICBbNF06IGBTVFlMRWAsXG4gIFs4XTogYFBST1BTYCxcbiAgWzE2XTogYEZVTExfUFJPUFNgLFxuICBbMzJdOiBgTkVFRF9IWURSQVRJT05gLFxuICBbNjRdOiBgU1RBQkxFX0ZSQUdNRU5UYCxcbiAgWzEyOF06IGBLRVlFRF9GUkFHTUVOVGAsXG4gIFsyNTZdOiBgVU5LRVlFRF9GUkFHTUVOVGAsXG4gIFs1MTJdOiBgTkVFRF9QQVRDSGAsXG4gIFsxMDI0XTogYERZTkFNSUNfU0xPVFNgLFxuICBbMjA0OF06IGBERVZfUk9PVF9GUkFHTUVOVGAsXG4gIFstMV06IGBDQUNIRURgLFxuICBbLTJdOiBgQkFJTGBcbn07XG5cbmNvbnN0IFNoYXBlRmxhZ3MgPSB7XG4gIFwiRUxFTUVOVFwiOiAxLFxuICBcIjFcIjogXCJFTEVNRU5UXCIsXG4gIFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIjogMixcbiAgXCIyXCI6IFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIixcbiAgXCJTVEFURUZVTF9DT01QT05FTlRcIjogNCxcbiAgXCI0XCI6IFwiU1RBVEVGVUxfQ09NUE9ORU5UXCIsXG4gIFwiVEVYVF9DSElMRFJFTlwiOiA4LFxuICBcIjhcIjogXCJURVhUX0NISUxEUkVOXCIsXG4gIFwiQVJSQVlfQ0hJTERSRU5cIjogMTYsXG4gIFwiMTZcIjogXCJBUlJBWV9DSElMRFJFTlwiLFxuICBcIlNMT1RTX0NISUxEUkVOXCI6IDMyLFxuICBcIjMyXCI6IFwiU0xPVFNfQ0hJTERSRU5cIixcbiAgXCJURUxFUE9SVFwiOiA2NCxcbiAgXCI2NFwiOiBcIlRFTEVQT1JUXCIsXG4gIFwiU1VTUEVOU0VcIjogMTI4LFxuICBcIjEyOFwiOiBcIlNVU1BFTlNFXCIsXG4gIFwiQ09NUE9ORU5UX1NIT1VMRF9LRUVQX0FMSVZFXCI6IDI1NixcbiAgXCIyNTZcIjogXCJDT01QT05FTlRfU0hPVUxEX0tFRVBfQUxJVkVcIixcbiAgXCJDT01QT05FTlRfS0VQVF9BTElWRVwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiQ09NUE9ORU5UX0tFUFRfQUxJVkVcIixcbiAgXCJDT01QT05FTlRcIjogNixcbiAgXCI2XCI6IFwiQ09NUE9ORU5UXCJcbn07XG5cbmNvbnN0IFNsb3RGbGFncyA9IHtcbiAgXCJTVEFCTEVcIjogMSxcbiAgXCIxXCI6IFwiU1RBQkxFXCIsXG4gIFwiRFlOQU1JQ1wiOiAyLFxuICBcIjJcIjogXCJEWU5BTUlDXCIsXG4gIFwiRk9SV0FSREVEXCI6IDMsXG4gIFwiM1wiOiBcIkZPUldBUkRFRFwiXG59O1xuY29uc3Qgc2xvdEZsYWdzVGV4dCA9IHtcbiAgWzFdOiBcIlNUQUJMRVwiLFxuICBbMl06IFwiRFlOQU1JQ1wiLFxuICBbM106IFwiRk9SV0FSREVEXCJcbn07XG5cbmNvbnN0IEdMT0JBTFNfQUxMT1dFRCA9IFwiSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3IsU3ltYm9sXCI7XG5jb25zdCBpc0dsb2JhbGx5QWxsb3dlZCA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKEdMT0JBTFNfQUxMT1dFRCk7XG5jb25zdCBpc0dsb2JhbGx5V2hpdGVsaXN0ZWQgPSBpc0dsb2JhbGx5QWxsb3dlZDtcblxuY29uc3QgcmFuZ2UgPSAyO1xuZnVuY3Rpb24gZ2VuZXJhdGVDb2RlRnJhbWUoc291cmNlLCBzdGFydCA9IDAsIGVuZCA9IHNvdXJjZS5sZW5ndGgpIHtcbiAgc3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzdGFydCwgc291cmNlLmxlbmd0aCkpO1xuICBlbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihlbmQsIHNvdXJjZS5sZW5ndGgpKTtcbiAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gXCJcIjtcbiAgbGV0IGxpbmVzID0gc291cmNlLnNwbGl0KC8oXFxyP1xcbikvKTtcbiAgY29uc3QgbmV3bGluZVNlcXVlbmNlcyA9IGxpbmVzLmZpbHRlcigoXywgaWR4KSA9PiBpZHggJSAyID09PSAxKTtcbiAgbGluZXMgPSBsaW5lcy5maWx0ZXIoKF8sIGlkeCkgPT4gaWR4ICUgMiA9PT0gMCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY291bnQgKz0gbGluZXNbaV0ubGVuZ3RoICsgKG5ld2xpbmVTZXF1ZW5jZXNbaV0gJiYgbmV3bGluZVNlcXVlbmNlc1tpXS5sZW5ndGggfHwgMCk7XG4gICAgaWYgKGNvdW50ID49IHN0YXJ0KSB7XG4gICAgICBmb3IgKGxldCBqID0gaSAtIHJhbmdlOyBqIDw9IGkgKyByYW5nZSB8fCBlbmQgPiBjb3VudDsgaisrKSB7XG4gICAgICAgIGlmIChqIDwgMCB8fCBqID49IGxpbmVzLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBqICsgMTtcbiAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgYCR7bGluZX0ke1wiIFwiLnJlcGVhdChNYXRoLm1heCgzIC0gU3RyaW5nKGxpbmUpLmxlbmd0aCwgMCkpfXwgICR7bGluZXNbal19YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZXNbal0ubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdMaW5lU2VxTGVuZ3RoID0gbmV3bGluZVNlcXVlbmNlc1tqXSAmJiBuZXdsaW5lU2VxdWVuY2VzW2pdLmxlbmd0aCB8fCAwO1xuICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgIGNvbnN0IHBhZCA9IHN0YXJ0IC0gKGNvdW50IC0gKGxpbmVMZW5ndGggKyBuZXdMaW5lU2VxTGVuZ3RoKSk7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgZW5kID4gY291bnQgPyBsaW5lTGVuZ3RoIC0gcGFkIDogZW5kIC0gc3RhcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcy5wdXNoKGAgICB8ICBgICsgXCIgXCIucmVwZWF0KHBhZCkgKyBcIl5cIi5yZXBlYXQobGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiA+IGkpIHtcbiAgICAgICAgICBpZiAoZW5kID4gY291bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KE1hdGgubWluKGVuZCAtIGNvdW50LCBsaW5lTGVuZ3RoKSwgMSk7XG4gICAgICAgICAgICByZXMucHVzaChgICAgfCAgYCArIFwiXlwiLnJlcGVhdChsZW5ndGgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY291bnQgKz0gbGluZUxlbmd0aCArIG5ld0xpbmVTZXFMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlKHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBpc1N0cmluZyhpdGVtKSA/IHBhcnNlU3RyaW5nU3R5bGUoaXRlbSkgOiBub3JtYWxpemVTdHlsZShpdGVtKTtcbiAgICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgICByZXNba2V5XSA9IG5vcm1hbGl6ZWRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmNvbnN0IGxpc3REZWxpbWl0ZXJSRSA9IC87KD8hW14oXSpcXCkpL2c7XG5jb25zdCBwcm9wZXJ0eURlbGltaXRlclJFID0gLzooW15dKykvO1xuY29uc3Qgc3R5bGVDb21tZW50UkUgPSAvXCIoPzpbXlwiXFxcXF18XFxcXFteXSkqXCJ8Jyg/OlteJ1xcXFxdfFxcXFxbXl0pKid8XFxcXFteXXxcXC9cXCpbXl0qP1xcKlxcLy9nO1xuZnVuY3Rpb24gcGFyc2VTdHJpbmdTdHlsZShjc3NUZXh0KSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBjc3NUZXh0LnJlcGxhY2Uoc3R5bGVDb21tZW50UkUsIChtYXRjaCkgPT4gbWF0Y2guc3RhcnRzV2l0aChcIi8qXCIpID8gXCJcIiA6IG1hdGNoKS5zcGxpdChsaXN0RGVsaW1pdGVyUkUpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgY29uc3QgdG1wID0gaXRlbS5zcGxpdChwcm9wZXJ0eURlbGltaXRlclJFKTtcbiAgICAgIHRtcC5sZW5ndGggPiAxICYmIChyZXRbdG1wWzBdLnRyaW0oKV0gPSB0bXBbMV0udHJpbSgpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5U3R5bGUoc3R5bGVzKSB7XG4gIGlmICghc3R5bGVzKSByZXR1cm4gXCJcIjtcbiAgaWYgKGlzU3RyaW5nKHN0eWxlcykpIHJldHVybiBzdHlsZXM7XG4gIGxldCByZXQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0eWxlc1trZXldO1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0ga2V5LnN0YXJ0c1dpdGgoYC0tYCkgPyBrZXkgOiBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIHJldCArPSBgJHtub3JtYWxpemVkS2V5fToke3ZhbHVlfTtgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3ModmFsdWUpIHtcbiAgbGV0IHJlcyA9IFwiXCI7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXMgPSB2YWx1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVDbGFzcyh2YWx1ZVtpXSk7XG4gICAgICBpZiAobm9ybWFsaXplZCkge1xuICAgICAgICByZXMgKz0gbm9ybWFsaXplZCArIFwiIFwiO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVtuYW1lXSkge1xuICAgICAgICByZXMgKz0gbmFtZSArIFwiIFwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzLnRyaW0oKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzKHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHJldHVybiBudWxsO1xuICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICBwcm9wcy5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKGtsYXNzKTtcbiAgfVxuICBpZiAoc3R5bGUpIHtcbiAgICBwcm9wcy5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKHN0eWxlKTtcbiAgfVxuICByZXR1cm4gcHJvcHM7XG59XG5cbmNvbnN0IEhUTUxfVEFHUyA9IFwiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaGdyb3VwLGgxLGgyLGgzLGg0LGg1LGg2LG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LHN1bW1hcnksdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3RcIjtcbmNvbnN0IFNWR19UQUdTID0gXCJzdmcsYW5pbWF0ZSxhbmltYXRlTW90aW9uLGFuaW1hdGVUcmFuc2Zvcm0sY2lyY2xlLGNsaXBQYXRoLGNvbG9yLXByb2ZpbGUsZGVmcyxkZXNjLGRpc2NhcmQsZWxsaXBzZSxmZUJsZW5kLGZlQ29sb3JNYXRyaXgsZmVDb21wb25lbnRUcmFuc2ZlcixmZUNvbXBvc2l0ZSxmZUNvbnZvbHZlTWF0cml4LGZlRGlmZnVzZUxpZ2h0aW5nLGZlRGlzcGxhY2VtZW50TWFwLGZlRGlzdGFudExpZ2h0LGZlRHJvcFNoYWRvdyxmZUZsb29kLGZlRnVuY0EsZmVGdW5jQixmZUZ1bmNHLGZlRnVuY1IsZmVHYXVzc2lhbkJsdXIsZmVJbWFnZSxmZU1lcmdlLGZlTWVyZ2VOb2RlLGZlTW9ycGhvbG9neSxmZU9mZnNldCxmZVBvaW50TGlnaHQsZmVTcGVjdWxhckxpZ2h0aW5nLGZlU3BvdExpZ2h0LGZlVGlsZSxmZVR1cmJ1bGVuY2UsZmlsdGVyLGZvcmVpZ25PYmplY3QsZyxoYXRjaCxoYXRjaHBhdGgsaW1hZ2UsbGluZSxsaW5lYXJHcmFkaWVudCxtYXJrZXIsbWFzayxtZXNoLG1lc2hncmFkaWVudCxtZXNocGF0Y2gsbWVzaHJvdyxtZXRhZGF0YSxtcGF0aCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCxzb2xpZGNvbG9yLHN0b3Asc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRQYXRoLHRpdGxlLHRzcGFuLHVua25vd24sdXNlLHZpZXdcIjtcbmNvbnN0IE1BVEhfVEFHUyA9IFwiYW5ub3RhdGlvbixhbm5vdGF0aW9uLXhtbCxtYWN0aW9uLG1hbGlnbmdyb3VwLG1hbGlnbm1hcmssbWF0aCxtZW5jbG9zZSxtZXJyb3IsbWZlbmNlZCxtZnJhYyxtZnJhY3Rpb24sbWdseXBoLG1pLG1sYWJlbGVkdHIsbWxvbmdkaXYsbW11bHRpc2NyaXB0cyxtbixtbyxtb3ZlcixtcGFkZGVkLG1waGFudG9tLG1wcmVzY3JpcHRzLG1yb290LG1yb3csbXMsbXNjYXJyaWVzLG1zY2FycnksbXNncm91cCxtc2xpbmUsbXNwYWNlLG1zcXJ0LG1zcm93LG1zdGFjayxtc3R5bGUsbXN1Yixtc3Vic3VwLG1zdXAsbXRhYmxlLG10ZCxtdGV4dCxtdHIsbXVuZGVyLG11bmRlcm92ZXIsbm9uZSxzZW1hbnRpY3NcIjtcbmNvbnN0IFZPSURfVEFHUyA9IFwiYXJlYSxiYXNlLGJyLGNvbCxlbWJlZCxocixpbWcsaW5wdXQsbGluayxtZXRhLHBhcmFtLHNvdXJjZSx0cmFjayx3YnJcIjtcbmNvbnN0IGlzSFRNTFRhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKEhUTUxfVEFHUyk7XG5jb25zdCBpc1NWR1RhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFNWR19UQUdTKTtcbmNvbnN0IGlzTWF0aE1MVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoTUFUSF9UQUdTKTtcbmNvbnN0IGlzVm9pZFRhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFZPSURfVEFHUyk7XG5cbmNvbnN0IHNwZWNpYWxCb29sZWFuQXR0cnMgPSBgaXRlbXNjb3BlLGFsbG93ZnVsbHNjcmVlbixmb3Jtbm92YWxpZGF0ZSxpc21hcCxub21vZHVsZSxub3ZhbGlkYXRlLHJlYWRvbmx5YDtcbmNvbnN0IGlzU3BlY2lhbEJvb2xlYW5BdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoc3BlY2lhbEJvb2xlYW5BdHRycyk7XG5jb25zdCBpc0Jvb2xlYW5BdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIHNwZWNpYWxCb29sZWFuQXR0cnMgKyBgLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjb250cm9scyxkZWZhdWx0LGRlZmVyLGRpc2FibGVkLGluZXJ0LGxvb3Asb3BlbixyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3MsY2hlY2tlZCxtdXRlZCxtdWx0aXBsZSxzZWxlY3RlZGBcbik7XG5mdW5jdGlvbiBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5jb25zdCB1bnNhZmVBdHRyQ2hhclJFID0gL1s+Lz1cIidcXHUwMDA5XFx1MDAwYVxcdTAwMGNcXHUwMDBkXFx1MDAyMF0vO1xuY29uc3QgYXR0clZhbGlkYXRpb25DYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNTU1JTYWZlQXR0ck5hbWUobmFtZSkge1xuICBpZiAoYXR0clZhbGlkYXRpb25DYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgIHJldHVybiBhdHRyVmFsaWRhdGlvbkNhY2hlW25hbWVdO1xuICB9XG4gIGNvbnN0IGlzVW5zYWZlID0gdW5zYWZlQXR0ckNoYXJSRS50ZXN0KG5hbWUpO1xuICBpZiAoaXNVbnNhZmUpIHtcbiAgICBjb25zb2xlLmVycm9yKGB1bnNhZmUgYXR0cmlidXRlIG5hbWU6ICR7bmFtZX1gKTtcbiAgfVxuICByZXR1cm4gYXR0clZhbGlkYXRpb25DYWNoZVtuYW1lXSA9ICFpc1Vuc2FmZTtcbn1cbmNvbnN0IHByb3BzVG9BdHRyTWFwID0ge1xuICBhY2NlcHRDaGFyc2V0OiBcImFjY2VwdC1jaGFyc2V0XCIsXG4gIGNsYXNzTmFtZTogXCJjbGFzc1wiLFxuICBodG1sRm9yOiBcImZvclwiLFxuICBodHRwRXF1aXY6IFwiaHR0cC1lcXVpdlwiXG59O1xuY29uc3QgaXNLbm93bkh0bWxBdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIGBhY2NlcHQsYWNjZXB0LWNoYXJzZXQsYWNjZXNza2V5LGFjdGlvbixhbGlnbixhbGxvdyxhbHQsYXN5bmMsYXV0b2NhcGl0YWxpemUsYXV0b2NvbXBsZXRlLGF1dG9mb2N1cyxhdXRvcGxheSxiYWNrZ3JvdW5kLGJnY29sb3IsYm9yZGVyLGJ1ZmZlcmVkLGNhcHR1cmUsY2hhbGxlbmdlLGNoYXJzZXQsY2hlY2tlZCxjaXRlLGNsYXNzLGNvZGUsY29kZWJhc2UsY29sb3IsY29scyxjb2xzcGFuLGNvbnRlbnQsY29udGVudGVkaXRhYmxlLGNvbnRleHRtZW51LGNvbnRyb2xzLGNvb3Jkcyxjcm9zc29yaWdpbixjc3AsZGF0YSxkYXRldGltZSxkZWNvZGluZyxkZWZhdWx0LGRlZmVyLGRpcixkaXJuYW1lLGRpc2FibGVkLGRvd25sb2FkLGRyYWdnYWJsZSxkcm9wem9uZSxlbmN0eXBlLGVudGVya2V5aGludCxmb3IsZm9ybSxmb3JtYWN0aW9uLGZvcm1lbmN0eXBlLGZvcm1tZXRob2QsZm9ybW5vdmFsaWRhdGUsZm9ybXRhcmdldCxoZWFkZXJzLGhlaWdodCxoaWRkZW4saGlnaCxocmVmLGhyZWZsYW5nLGh0dHAtZXF1aXYsaWNvbixpZCxpbXBvcnRhbmNlLGluZXJ0LGludGVncml0eSxpc21hcCxpdGVtcHJvcCxrZXl0eXBlLGtpbmQsbGFiZWwsbGFuZyxsYW5ndWFnZSxsb2FkaW5nLGxpc3QsbG9vcCxsb3csbWFuaWZlc3QsbWF4LG1heGxlbmd0aCxtaW5sZW5ndGgsbWVkaWEsbWluLG11bHRpcGxlLG11dGVkLG5hbWUsbm92YWxpZGF0ZSxvcGVuLG9wdGltdW0scGF0dGVybixwaW5nLHBsYWNlaG9sZGVyLHBvc3RlcixwcmVsb2FkLHJhZGlvZ3JvdXAscmVhZG9ubHkscmVmZXJyZXJwb2xpY3kscmVsLHJlcXVpcmVkLHJldmVyc2VkLHJvd3Mscm93c3BhbixzYW5kYm94LHNjb3BlLHNjb3BlZCxzZWxlY3RlZCxzaGFwZSxzaXplLHNpemVzLHNsb3Qsc3BhbixzcGVsbGNoZWNrLHNyYyxzcmNkb2Msc3JjbGFuZyxzcmNzZXQsc3RhcnQsc3RlcCxzdHlsZSxzdW1tYXJ5LHRhYmluZGV4LHRhcmdldCx0aXRsZSx0cmFuc2xhdGUsdHlwZSx1c2VtYXAsdmFsdWUsd2lkdGgsd3JhcGBcbik7XG5jb25zdCBpc0tub3duU3ZnQXR0ciA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBgeG1sbnMsYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFsaWdubWVudC1iYXNlbGluZSxhbHBoYWJldGljLGFtcGxpdHVkZSxhcmFiaWMtZm9ybSxhc2NlbnQsYXR0cmlidXRlTmFtZSxhdHRyaWJ1dGVUeXBlLGF6aW11dGgsYmFzZUZyZXF1ZW5jeSxiYXNlbGluZS1zaGlmdCxiYXNlUHJvZmlsZSxiYm94LGJlZ2luLGJpYXMsYnksY2FsY01vZGUsY2FwLWhlaWdodCxjbGFzcyxjbGlwLGNsaXBQYXRoVW5pdHMsY2xpcC1wYXRoLGNsaXAtcnVsZSxjb2xvcixjb2xvci1pbnRlcnBvbGF0aW9uLGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyxjb2xvci1wcm9maWxlLGNvbG9yLXJlbmRlcmluZyxjb250ZW50U2NyaXB0VHlwZSxjb250ZW50U3R5bGVUeXBlLGNyb3Nzb3JpZ2luLGN1cnNvcixjeCxjeSxkLGRlY2VsZXJhdGUsZGVzY2VudCxkaWZmdXNlQ29uc3RhbnQsZGlyZWN0aW9uLGRpc3BsYXksZGl2aXNvcixkb21pbmFudC1iYXNlbGluZSxkdXIsZHgsZHksZWRnZU1vZGUsZWxldmF0aW9uLGVuYWJsZS1iYWNrZ3JvdW5kLGVuZCxleHBvbmVudCxmaWxsLGZpbGwtb3BhY2l0eSxmaWxsLXJ1bGUsZmlsdGVyLGZpbHRlclJlcyxmaWx0ZXJVbml0cyxmbG9vZC1jb2xvcixmbG9vZC1vcGFjaXR5LGZvbnQtZmFtaWx5LGZvbnQtc2l6ZSxmb250LXNpemUtYWRqdXN0LGZvbnQtc3RyZXRjaCxmb250LXN0eWxlLGZvbnQtdmFyaWFudCxmb250LXdlaWdodCxmb3JtYXQsZnJvbSxmcixmeCxmeSxnMSxnMixnbHlwaC1uYW1lLGdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwsZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwsZ2x5cGhSZWYsZ3JhZGllbnRUcmFuc2Zvcm0sZ3JhZGllbnRVbml0cyxoYW5naW5nLGhlaWdodCxocmVmLGhyZWZsYW5nLGhvcml6LWFkdi14LGhvcml6LW9yaWdpbi14LGlkLGlkZW9ncmFwaGljLGltYWdlLXJlbmRlcmluZyxpbixpbjIsaW50ZXJjZXB0LGssazEsazIsazMsazQsa2VybmVsTWF0cml4LGtlcm5lbFVuaXRMZW5ndGgsa2VybmluZyxrZXlQb2ludHMsa2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLGxlbmd0aEFkanVzdCxsZXR0ZXItc3BhY2luZyxsaWdodGluZy1jb2xvcixsaW1pdGluZ0NvbmVBbmdsZSxsb2NhbCxtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cyxtYXJrZXJXaWR0aCxtYXNrLG1hc2tDb250ZW50VW5pdHMsbWFza1VuaXRzLG1hdGhlbWF0aWNhbCxtYXgsbWVkaWEsbWV0aG9kLG1pbixtb2RlLG5hbWUsbnVtT2N0YXZlcyxvZmZzZXQsb3BhY2l0eSxvcGVyYXRvcixvcmRlcixvcmllbnQsb3JpZW50YXRpb24sb3JpZ2luLG92ZXJmbG93LG92ZXJsaW5lLXBvc2l0aW9uLG92ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYWludC1vcmRlcixwYXRoLHBhdGhMZW5ndGgscGF0dGVybkNvbnRlbnRVbml0cyxwYXR0ZXJuVHJhbnNmb3JtLHBhdHRlcm5Vbml0cyxwaW5nLHBvaW50ZXItZXZlbnRzLHBvaW50cyxwb2ludHNBdFgscG9pbnRzQXRZLHBvaW50c0F0WixwcmVzZXJ2ZUFscGhhLHByZXNlcnZlQXNwZWN0UmF0aW8scHJpbWl0aXZlVW5pdHMscixyYWRpdXMscmVmZXJyZXJQb2xpY3kscmVmWCxyZWZZLHJlbCxyZW5kZXJpbmctaW50ZW50LHJlcGVhdENvdW50LHJlcGVhdER1cixyZXF1aXJlZEV4dGVuc2lvbnMscmVxdWlyZWRGZWF0dXJlcyxyZXN0YXJ0LHJlc3VsdCxyb3RhdGUscngscnksc2NhbGUsc2VlZCxzaGFwZS1yZW5kZXJpbmcsc2xvcGUsc3BhY2luZyxzcGVjdWxhckNvbnN0YW50LHNwZWN1bGFyRXhwb25lbnQsc3BlZWQsc3ByZWFkTWV0aG9kLHN0YXJ0T2Zmc2V0LHN0ZERldmlhdGlvbixzdGVtaCxzdGVtdixzdGl0Y2hUaWxlcyxzdG9wLWNvbG9yLHN0b3Atb3BhY2l0eSxzdHJpa2V0aHJvdWdoLXBvc2l0aW9uLHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzLHN0cmluZyxzdHJva2Usc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sc3Ryb2tlLW1pdGVybGltaXQsc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN0eWxlLHN1cmZhY2VTY2FsZSxzeXN0ZW1MYW5ndWFnZSx0YWJpbmRleCx0YWJsZVZhbHVlcyx0YXJnZXQsdGFyZ2V0WCx0YXJnZXRZLHRleHQtYW5jaG9yLHRleHQtZGVjb3JhdGlvbix0ZXh0LXJlbmRlcmluZyx0ZXh0TGVuZ3RoLHRvLHRyYW5zZm9ybSx0cmFuc2Zvcm0tb3JpZ2luLHR5cGUsdTEsdTIsdW5kZXJsaW5lLXBvc2l0aW9uLHVuZGVybGluZS10aGlja25lc3MsdW5pY29kZSx1bmljb2RlLWJpZGksdW5pY29kZS1yYW5nZSx1bml0cy1wZXItZW0sdi1hbHBoYWJldGljLHYtaGFuZ2luZyx2LWlkZW9ncmFwaGljLHYtbWF0aGVtYXRpY2FsLHZhbHVlcyx2ZWN0b3ItZWZmZWN0LHZlcnNpb24sdmVydC1hZHYteSx2ZXJ0LW9yaWdpbi14LHZlcnQtb3JpZ2luLXksdmlld0JveCx2aWV3VGFyZ2V0LHZpc2liaWxpdHksd2lkdGgsd2lkdGhzLHdvcmQtc3BhY2luZyx3cml0aW5nLW1vZGUseCx4LWhlaWdodCx4MSx4Mix4Q2hhbm5lbFNlbGVjdG9yLHhsaW5rOmFjdHVhdGUseGxpbms6YXJjcm9sZSx4bGluazpocmVmLHhsaW5rOnJvbGUseGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbG5zOnhsaW5rLHhtbDpiYXNlLHhtbDpsYW5nLHhtbDpzcGFjZSx5LHkxLHkyLHlDaGFubmVsU2VsZWN0b3Iseix6b29tQW5kUGFuYFxuKTtcbmNvbnN0IGlzS25vd25NYXRoTUxBdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIGBhY2NlbnQsYWNjZW50dW5kZXIsYWN0aW9udHlwZSxhbGlnbixhbGlnbm1lbnRzY29wZSxhbHRpbWcsYWx0aW1nLWhlaWdodCxhbHRpbWctdmFsaWduLGFsdGltZy13aWR0aCxhbHR0ZXh0LGJldmVsbGVkLGNsb3NlLGNvbHVtbnNhbGlnbixjb2x1bW5saW5lcyxjb2x1bW5zcGFuLGRlbm9tYWxpZ24sZGVwdGgsZGlyLGRpc3BsYXksZGlzcGxheXN0eWxlLGVuY29kaW5nLGVxdWFsY29sdW1ucyxlcXVhbHJvd3MsZmVuY2UsZm9udHN0eWxlLGZvbnR3ZWlnaHQsZm9ybSxmcmFtZSxmcmFtZXNwYWNpbmcsZ3JvdXBhbGlnbixoZWlnaHQsaHJlZixpZCxpbmRlbnRhbGlnbixpbmRlbnRhbGlnbmZpcnN0LGluZGVudGFsaWdubGFzdCxpbmRlbnRzaGlmdCxpbmRlbnRzaGlmdGZpcnN0LGluZGVudHNoaWZ0bGFzdCxpbmRleHR5cGUsanVzdGlmeSxsYXJnZXRvcCxsYXJnZW9wLGxxdW90ZSxsc3BhY2UsbWF0aGJhY2tncm91bmQsbWF0aGNvbG9yLG1hdGhzaXplLG1hdGh2YXJpYW50LG1heHNpemUsbWlubGFiZWxzcGFjaW5nLG1vZGUsb3RoZXIsb3ZlcmZsb3cscG9zaXRpb24scm93YWxpZ24scm93bGluZXMscm93c3BhbixycXVvdGUscnNwYWNlLHNjcmlwdGxldmVsLHNjcmlwdG1pbnNpemUsc2NyaXB0c2l6ZW11bHRpcGxpZXIsc2VsZWN0aW9uLHNlcGFyYXRvcixzZXBhcmF0b3JzLHNoaWZ0LHNpZGUsc3JjLHN0YWNrYWxpZ24sc3RyZXRjaHksc3Vic2NyaXB0c2hpZnQsc3VwZXJzY3JpcHRzaGlmdCxzeW1tZXRyaWMsdm9mZnNldCx3aWR0aCx3aWR0aHMseGxpbms6aHJlZix4bGluazpzaG93LHhsaW5rOnR5cGUseG1sbnNgXG4pO1xuZnVuY3Rpb24gaXNSZW5kZXJhYmxlQXR0clZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCI7XG59XG5cbmNvbnN0IGVzY2FwZVJFID0gL1tcIicmPD5dLztcbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIGNvbnN0IHN0ciA9IFwiXCIgKyBzdHJpbmc7XG4gIGNvbnN0IG1hdGNoID0gZXNjYXBlUkUuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBsZXQgaHRtbCA9IFwiXCI7XG4gIGxldCBlc2NhcGVkO1xuICBsZXQgaW5kZXg7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OlxuICAgICAgICBlc2NhcGVkID0gXCImcXVvdDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICBlc2NhcGVkID0gXCImYW1wO1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6XG4gICAgICAgIGVzY2FwZWQgPSBcIiYjMzk7XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MDpcbiAgICAgICAgZXNjYXBlZCA9IFwiJmx0O1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIGVzY2FwZWQgPSBcIiZndDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIGh0bWwgKz0gc3RyLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cbiAgICBsYXN0SW5kZXggPSBpbmRleCArIDE7XG4gICAgaHRtbCArPSBlc2NhcGVkO1xuICB9XG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4ID8gaHRtbCArIHN0ci5zbGljZShsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG5jb25zdCBjb21tZW50U3RyaXBSRSA9IC9eKD86LT8+KSt8PCEtLXwtLT58LS0hPnw8IS0kL2c7XG5mdW5jdGlvbiBlc2NhcGVIdG1sQ29tbWVudChzcmMpIHtcbiAgbGV0IHByZXY7XG4gIGRvIHtcbiAgICBwcmV2ID0gc3JjO1xuICAgIHNyYyA9IHNyYy5yZXBsYWNlKGNvbW1lbnRTdHJpcFJFLCBcIlwiKTtcbiAgfSB3aGlsZSAoc3JjICE9PSBwcmV2KTtcbiAgcmV0dXJuIHNyYztcbn1cbmNvbnN0IGNzc1Zhck5hbWVFc2NhcGVTeW1ib2xzUkUgPSAvWyAhXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXFxcXF1eYHt8fX5dL2c7XG5mdW5jdGlvbiBnZXRFc2NhcGVkQ3NzVmFyTmFtZShrZXksIGRvdWJsZUVzY2FwZSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoXG4gICAgY3NzVmFyTmFtZUVzY2FwZVN5bWJvbHNSRSxcbiAgICAocykgPT4gZG91YmxlRXNjYXBlID8gcyA9PT0gJ1wiJyA/ICdcXFxcXFxcXFxcXFxcIicgOiBgXFxcXFxcXFwke3N9YCA6IGBcXFxcJHtzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gbG9vc2VDb21wYXJlQXJyYXlzKGEsIGIsIHNlZW4pIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBsZXQgZXF1YWwgPSB0cnVlO1xuICBmb3IgKGxldCBpID0gMDsgZXF1YWwgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBlcXVhbCA9IGxvb3NlRXF1YWwoYVtpXSwgYltpXSwgc2Vlbik7XG4gIH1cbiAgcmV0dXJuIGVxdWFsO1xufVxuZnVuY3Rpb24gbG9vc2VDb21wYXJlQ29sbGVjdGlvbnMoYSwgYiwgc2Vlbikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20oYik7XG4gIGNvbnN0IG1hdGNoZWQgPSBuZXcgVWludDhBcnJheShjYW5kaWRhdGVzLmxlbmd0aCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhKSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1hdGNoZWRbaV0gJiYgbG9vc2VFcXVhbChpdGVtLCBjYW5kaWRhdGVzW2ldLCBzZWVuKSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgbWF0Y2hlZFtpbmRleF0gPSAxO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbG9vc2VDb21wYXJlT2JqZWN0cyhhLCBiLCBzZWVuKSB7XG4gIGxldCBhVmFsaWRUeXBlID0gaXNNYXAoYSk7XG4gIGxldCBiVmFsaWRUeXBlID0gaXNNYXAoYik7XG4gIGlmIChhVmFsaWRUeXBlIHx8IGJWYWxpZFR5cGUpIHtcbiAgICByZXR1cm4gYVZhbGlkVHlwZSAmJiBiVmFsaWRUeXBlID8gbG9vc2VDb21wYXJlQ29sbGVjdGlvbnMoYSwgYiwgc2VlbikgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNTZXQoYSk7XG4gIGJWYWxpZFR5cGUgPSBpc1NldChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBsb29zZUNvbXBhcmVDb2xsZWN0aW9ucyhhLCBiLCBzZWVuKSA6IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFLZXlzQ291bnQgPSBPYmplY3Qua2V5cyhhKS5sZW5ndGg7XG4gIGNvbnN0IGJLZXlzQ291bnQgPSBPYmplY3Qua2V5cyhiKS5sZW5ndGg7XG4gIGlmIChhS2V5c0NvdW50ICE9PSBiS2V5c0NvdW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGEpIHtcbiAgICBjb25zdCBhSGFzS2V5ID0gYS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICAgIGNvbnN0IGJIYXNLZXkgPSBiLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgaWYgKGFIYXNLZXkgJiYgIWJIYXNLZXkgfHwgIWFIYXNLZXkgJiYgYkhhc0tleSB8fCAhbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhhKSA9PT0gU3RyaW5nKGIpO1xufVxuZnVuY3Rpb24gbG9vc2VDb21wYXJlTmVzdGVkKGEsIGIsIHNlZW4sIGNvbXBhcmUpIHtcbiAgaWYgKCFzZWVuKSB7XG4gICAgc2VlbiA9IFsvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXTtcbiAgfVxuICBjb25zdCBbc2VlbkEsIHNlZW5CXSA9IHNlZW47XG4gIGlmIChzZWVuQS5oYXMoYSkgfHwgc2VlbkIuaGFzKGIpKSB7XG4gICAgcmV0dXJuIHNlZW5BLmdldChhKSA9PT0gYiAmJiBzZWVuQi5nZXQoYikgPT09IGE7XG4gIH1cbiAgc2VlbkEuc2V0KGEsIGIpO1xuICBzZWVuQi5zZXQoYiwgYSk7XG4gIGNvbnN0IGVxdWFsID0gY29tcGFyZShhLCBiLCBzZWVuKTtcbiAgc2VlbkEuZGVsZXRlKGEpO1xuICBzZWVuQi5kZWxldGUoYik7XG4gIHJldHVybiBlcXVhbDtcbn1cbmZ1bmN0aW9uIGxvb3NlRXF1YWwoYSwgYiwgc2Vlbikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGxldCBhVmFsaWRUeXBlID0gaXNEYXRlKGEpO1xuICBsZXQgYlZhbGlkVHlwZSA9IGlzRGF0ZShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNTeW1ib2woYSk7XG4gIGJWYWxpZFR5cGUgPSBpc1N5bWJvbChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIGFWYWxpZFR5cGUgPSBpc0FycmF5KGEpO1xuICBiVmFsaWRUeXBlID0gaXNBcnJheShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBsb29zZUNvbXBhcmVOZXN0ZWQoYSwgYiwgc2VlbiwgbG9vc2VDb21wYXJlQXJyYXlzKSA6IGZhbHNlO1xuICB9XG4gIGFWYWxpZFR5cGUgPSBpc09iamVjdChhKTtcbiAgYlZhbGlkVHlwZSA9IGlzT2JqZWN0KGIpO1xuICBpZiAoYVZhbGlkVHlwZSB8fCBiVmFsaWRUeXBlKSB7XG4gICAgaWYgKCFhVmFsaWRUeXBlIHx8ICFiVmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBsb29zZUNvbXBhcmVOZXN0ZWQoYSwgYiwgc2VlbiwgbG9vc2VDb21wYXJlT2JqZWN0cyk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhhKSA9PT0gU3RyaW5nKGIpO1xufVxuZnVuY3Rpb24gbG9vc2VJbmRleE9mKGFyciwgdmFsKSB7XG4gIHJldHVybiBhcnIuZmluZEluZGV4KChpdGVtKSA9PiBsb29zZUVxdWFsKGl0ZW0sIHZhbCkpO1xufVxuXG5jb25zdCBpc1JlZiA9ICh2YWwpID0+IHtcbiAgcmV0dXJuICEhKHZhbCAmJiB2YWxbXCJfX3ZfaXNSZWZcIl0gPT09IHRydWUpO1xufTtcbmNvbnN0IHRvRGlzcGxheVN0cmluZyA9ICh2YWwpID0+IHtcbiAgcmV0dXJuIGlzU3RyaW5nKHZhbCkgPyB2YWwgOiB2YWwgPT0gbnVsbCA/IFwiXCIgOiBpc0FycmF5KHZhbCkgfHwgaXNPYmplY3QodmFsKSAmJiAodmFsLnRvU3RyaW5nID09PSBvYmplY3RUb1N0cmluZyB8fCAhaXNGdW5jdGlvbih2YWwudG9TdHJpbmcpKSA/IGlzUmVmKHZhbCkgPyB0b0Rpc3BsYXlTdHJpbmcodmFsLnZhbHVlKSA6IEpTT04uc3RyaW5naWZ5KHZhbCwgcmVwbGFjZXIsIDIpIDogU3RyaW5nKHZhbCk7XG59O1xuY29uc3QgcmVwbGFjZXIgPSAoX2tleSwgdmFsKSA9PiB7XG4gIGlmIChpc1JlZih2YWwpKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VyKF9rZXksIHZhbC52YWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbYE1hcCgke3ZhbC5zaXplfSlgXTogWy4uLnZhbC5lbnRyaWVzKCldLnJlZHVjZShcbiAgICAgICAgKGVudHJpZXMsIFtrZXksIHZhbDJdLCBpKSA9PiB7XG4gICAgICAgICAgZW50cmllc1tzdHJpbmdpZnlTeW1ib2woa2V5LCBpKSArIFwiID0+XCJdID0gdmFsMjtcbiAgICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW2BTZXQoJHt2YWwuc2l6ZX0pYF06IFsuLi52YWwudmFsdWVzKCldLm1hcCgodikgPT4gc3RyaW5naWZ5U3ltYm9sKHYpKVxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNTeW1ib2wodmFsKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlTeW1ib2wodmFsKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpICYmICFpc0FycmF5KHZhbCkgJiYgIWlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgfVxuICByZXR1cm4gdmFsO1xufTtcbmNvbnN0IHN0cmluZ2lmeVN5bWJvbCA9ICh2LCBpID0gXCJcIikgPT4ge1xuICB2YXIgX2E7XG4gIHJldHVybiAoXG4gICAgLy8gU3ltYm9sLmRlc2NyaXB0aW9uIGluIGVzMjAxOSsgc28gd2UgbmVlZCB0byBjYXN0IGhlcmUgdG8gcGFzc1xuICAgIC8vIHRoZSBsaWI6IGVzMjAxNiBjaGVja1xuICAgIGlzU3ltYm9sKHYpID8gYFN5bWJvbCgkeyhfYSA9IHYuZGVzY3JpcHRpb24pICE9IG51bGwgPyBfYSA6IGl9KWAgOiB2XG4gICk7XG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVDc3NWYXJWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBcImluaXRpYWxcIjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBcIlwiID8gXCIgXCIgOiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbVnVlIHdhcm5dIEludmFsaWQgdmFsdWUgdXNlZCBmb3IgQ1NTIGJpbmRpbmcuIEV4cGVjdGVkIGEgc3RyaW5nIG9yIGEgZmluaXRlIG51bWJlciBidXQgcmVjZWl2ZWQ6XCIsXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuZXhwb3J0IHsgRU1QVFlfQVJSLCBFTVBUWV9PQkosIE5PLCBOT09QLCBQYXRjaEZsYWdOYW1lcywgUGF0Y2hGbGFncywgU2hhcGVGbGFncywgU2xvdEZsYWdzLCBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgY3NzVmFyTmFtZUVzY2FwZVN5bWJvbHNSRSwgZGVmLCBlc2NhcGVIdG1sLCBlc2NhcGVIdG1sQ29tbWVudCwgZXh0ZW5kLCBnZW5DYWNoZUtleSwgZ2VuUHJvcHNBY2Nlc3NFeHAsIGdlbmVyYXRlQ29kZUZyYW1lLCBnZXRFc2NhcGVkQ3NzVmFyTmFtZSwgZ2V0R2xvYmFsVGhpcywgaGFzQ2hhbmdlZCwgaGFzT3duLCBoeXBoZW5hdGUsIGluY2x1ZGVCb29sZWFuQXR0ciwgaW52b2tlQXJyYXlGbnMsIGlzQXJyYXksIGlzQm9vbGVhbkF0dHIsIGlzQnVpbHRJbkRpcmVjdGl2ZSwgaXNEYXRlLCBpc0Z1bmN0aW9uLCBpc0dsb2JhbGx5QWxsb3dlZCwgaXNHbG9iYWxseVdoaXRlbGlzdGVkLCBpc0hUTUxUYWcsIGlzSW50ZWdlcktleSwgaXNLbm93bkh0bWxBdHRyLCBpc0tub3duTWF0aE1MQXR0ciwgaXNLbm93blN2Z0F0dHIsIGlzTWFwLCBpc01hdGhNTFRhZywgaXNNb2RlbExpc3RlbmVyLCBpc09iamVjdCwgaXNPbiwgaXNQbGFpbk9iamVjdCwgaXNQcm9taXNlLCBpc1JlZ0V4cCwgaXNSZW5kZXJhYmxlQXR0clZhbHVlLCBpc1Jlc2VydmVkUHJvcCwgaXNTU1JTYWZlQXR0ck5hbWUsIGlzU1ZHVGFnLCBpc1NldCwgaXNTcGVjaWFsQm9vbGVhbkF0dHIsIGlzU3RyaW5nLCBpc1N5bWJvbCwgaXNWb2lkVGFnLCBsb29zZUVxdWFsLCBsb29zZUluZGV4T2YsIGxvb3NlVG9OdW1iZXIsIG1ha2VNYXAsIG5vcm1hbGl6ZUNsYXNzLCBub3JtYWxpemVDc3NWYXJWYWx1ZSwgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCBvYmplY3RUb1N0cmluZywgcGFyc2VTdHJpbmdTdHlsZSwgcHJvcHNUb0F0dHJNYXAsIHJlbW92ZSwgc2xvdEZsYWdzVGV4dCwgc3RyaW5naWZ5U3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5LCB0b051bWJlciwgdG9SYXdUeXBlLCB0b1R5cGVTdHJpbmcgfTtcbiIsIi8qKlxuKiBAdnVlL3JlYWN0aXZpdHkgdjMuNS40M1xuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgZXh0ZW5kLCBoYXNDaGFuZ2VkLCBpc0FycmF5LCBpc0ludGVnZXJLZXksIGlzU3ltYm9sLCBpc01hcCwgaGFzT3duLCBpc09iamVjdCwgbWFrZU1hcCwgY2FwaXRhbGl6ZSwgdG9SYXdUeXBlLCBkZWYsIGlzRnVuY3Rpb24sIEVNUFRZX09CSiwgaXNTZXQsIGlzUGxhaW5PYmplY3QsIHJlbW92ZSwgTk9PUCB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIC8vIFRPRE8gaXNvbGF0ZWREZWNsYXJhdGlvbnMgXCJfX3Zfc2tpcFwiXG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWwgdHJhY2sgYG9uYCBjYWxscywgYWxsb3cgYG9uYCBjYWxsIG11bHRpcGxlIHRpbWVzXG4gICAgICovXG4gICAgdGhpcy5fb24gPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZWZmZWN0cyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuY2xlYW51cHMgPSBbXTtcbiAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dhcm5PblJ1biA9IHRydWU7XG4gICAgdGhpcy5fX3Zfc2tpcCA9IHRydWU7XG4gICAgaWYgKCFkZXRhY2hlZCAmJiBhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgICAgaWYgKGFjdGl2ZUVmZmVjdFNjb3BlLmFjdGl2ZSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgICAgICB0aGlzLmluZGV4ID0gKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKSAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fd2Fybk9uUnVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuICBwYXVzZSgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICB0aGlzLl9pc1BhdXNlZCA9IHRydWU7XG4gICAgICBsZXQgaSwgbDtcbiAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICBjb25zdCBzY29wZXMgPSB0aGlzLnNjb3Blcy5zbGljZSgpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gc2NvcGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHNjb3Blc1tpXS5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0ucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGVmZmVjdCBzY29wZSwgaW5jbHVkaW5nIGFsbCBjaGlsZCBzY29wZXMgYW5kIGVmZmVjdHMuXG4gICAqL1xuICByZXN1bWUoKSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkKSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBpLCBsO1xuICAgICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgICBjb25zdCBzY29wZXMgPSB0aGlzLnNjb3Blcy5zbGljZSgpO1xuICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBzY29wZXNbaV0ucmVzdW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdHMgPSB0aGlzLmVmZmVjdHMuc2xpY2UoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVmZmVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgZWZmZWN0c1tpXS5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBydW4oZm4pIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0U2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IGN1cnJlbnRFZmZlY3RTY29wZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5fd2Fybk9uUnVuKSB7XG4gICAgICB3YXJuKGBjYW5ub3QgcnVuIGFuIGluYWN0aXZlIGVmZmVjdCBzY29wZS5gKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1kZXRhY2hlZCBzY29wZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbigpIHtcbiAgICBpZiAoKyt0aGlzLl9vbiA9PT0gMSkge1xuICAgICAgdGhpcy5wcmV2U2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1kZXRhY2hlZCBzY29wZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvZmYoKSB7XG4gICAgaWYgKHRoaXMuX29uID4gMCAmJiAtLXRoaXMuX29uID09PSAwKSB7XG4gICAgICBpZiAoYWN0aXZlRWZmZWN0U2NvcGUgPT09IHRoaXMpIHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzLnByZXZTY29wZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gYWN0aXZlRWZmZWN0U2NvcGU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQucHJldlNjb3BlID09PSB0aGlzKSB7XG4gICAgICAgICAgICBjdXJyZW50LnByZXZTY29wZSA9IHRoaXMucHJldlNjb3BlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZTY29wZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcmV2U2NvcGUgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHN0b3AoZnJvbVBhcmVudCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgbGV0IGksIGw7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0uc3RvcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5jbGVhbnVwcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwc1tpXSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGVhbnVwcy5sZW5ndGggPSAwO1xuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IHRoaXMuc2NvcGVzLnNsaWNlKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBzY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgc2NvcGVzW2ldLnN0b3AodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY29wZXMubGVuZ3RoID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kZXRhY2hlZCAmJiB0aGlzLnBhcmVudCAmJiAhZnJvbVBhcmVudCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5wYXJlbnQuc2NvcGVzLnBvcCgpO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0ICE9PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdID0gbGFzdDtcbiAgICAgICAgICBsYXN0LmluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlZmZlY3RTY29wZShkZXRhY2hlZCkge1xuICByZXR1cm4gbmV3IEVmZmVjdFNjb3BlKGRldGFjaGVkKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGFjdGl2ZUVmZmVjdFNjb3BlO1xufVxuZnVuY3Rpb24gb25TY29wZURpc3Bvc2UoZm4sIGZhaWxTaWxlbnRseSA9IGZhbHNlKSB7XG4gIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWZhaWxTaWxlbnRseSkge1xuICAgIHdhcm4oXG4gICAgICBgb25TY29wZURpc3Bvc2UoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgZWZmZWN0IHNjb3BlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgYWN0aXZlU3ViO1xuY29uc3QgRWZmZWN0RmxhZ3MgPSB7XG4gIFwiQUNUSVZFXCI6IDEsXG4gIFwiMVwiOiBcIkFDVElWRVwiLFxuICBcIlJVTk5JTkdcIjogMixcbiAgXCIyXCI6IFwiUlVOTklOR1wiLFxuICBcIlRSQUNLSU5HXCI6IDQsXG4gIFwiNFwiOiBcIlRSQUNLSU5HXCIsXG4gIFwiTk9USUZJRURcIjogOCxcbiAgXCI4XCI6IFwiTk9USUZJRURcIixcbiAgXCJESVJUWVwiOiAxNixcbiAgXCIxNlwiOiBcIkRJUlRZXCIsXG4gIFwiQUxMT1dfUkVDVVJTRVwiOiAzMixcbiAgXCIzMlwiOiBcIkFMTE9XX1JFQ1VSU0VcIixcbiAgXCJQQVVTRURcIjogNjQsXG4gIFwiNjRcIjogXCJQQVVTRURcIixcbiAgXCJFVkFMVUFURURcIjogMTI4LFxuICBcIjEyOFwiOiBcIkVWQUxVQVRFRFwiXG59O1xuY29uc3QgcGF1c2VkUXVldWVFZmZlY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG5jbGFzcyBSZWFjdGl2ZUVmZmVjdCB7XG4gIGNvbnN0cnVjdG9yKGZuKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZGVwcyA9IHZvaWQgMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmRlcHNUYWlsID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZmxhZ3MgPSAxIHwgNDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5jbGVhbnVwID0gdm9pZCAwO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gdm9pZCAwO1xuICAgIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgICAgaWYgKGFjdGl2ZUVmZmVjdFNjb3BlLmFjdGl2ZSkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZS5lZmZlY3RzLnB1c2godGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZsYWdzICY9IC0yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwYXVzZSgpIHtcbiAgICB0aGlzLmZsYWdzIHw9IDY0O1xuICB9XG4gIHJlc3VtZSgpIHtcbiAgICBpZiAodGhpcy5mbGFncyAmIDY0KSB7XG4gICAgICB0aGlzLmZsYWdzICY9IC02NTtcbiAgICAgIGlmIChwYXVzZWRRdWV1ZUVmZmVjdHMuaGFzKHRoaXMpKSB7XG4gICAgICAgIHBhdXNlZFF1ZXVlRWZmZWN0cy5kZWxldGUodGhpcyk7XG4gICAgICAgIHRoaXMudHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBub3RpZnkoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgJiAyICYmICEodGhpcy5mbGFncyAmIDMyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoISh0aGlzLmZsYWdzICYgOCkpIHtcbiAgICAgIGJhdGNoKHRoaXMpO1xuICAgIH1cbiAgfVxuICBydW4oKSB7XG4gICAgaWYgKCEodGhpcy5mbGFncyAmIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH1cbiAgICB0aGlzLmZsYWdzIHw9IDI7XG4gICAgY2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICBwcmVwYXJlRGVwcyh0aGlzKTtcbiAgICBjb25zdCBwcmV2RWZmZWN0ID0gYWN0aXZlU3ViO1xuICAgIGNvbnN0IHByZXZTaG91bGRUcmFjayA9IHNob3VsZFRyYWNrO1xuICAgIGFjdGl2ZVN1YiA9IHRoaXM7XG4gICAgc2hvdWxkVHJhY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhY3RpdmVTdWIgIT09IHRoaXMpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIkFjdGl2ZSBlZmZlY3Qgd2FzIG5vdCByZXN0b3JlZCBjb3JyZWN0bHkgLSB0aGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbCBidWcuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNsZWFudXBEZXBzKHRoaXMpO1xuICAgICAgYWN0aXZlU3ViID0gcHJldkVmZmVjdDtcbiAgICAgIHNob3VsZFRyYWNrID0gcHJldlNob3VsZFRyYWNrO1xuICAgICAgdGhpcy5mbGFncyAmPSAtMztcbiAgICB9XG4gIH1cbiAgc3RvcCgpIHtcbiAgICBpZiAodGhpcy5mbGFncyAmIDEpIHtcbiAgICAgIGZvciAobGV0IGxpbmsgPSB0aGlzLmRlcHM7IGxpbms7IGxpbmsgPSBsaW5rLm5leHREZXApIHtcbiAgICAgICAgcmVtb3ZlU3ViKGxpbmspO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXBzID0gdGhpcy5kZXBzVGFpbCA9IHZvaWQgMDtcbiAgICAgIGNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICB0aGlzLm9uU3RvcCAmJiB0aGlzLm9uU3RvcCgpO1xuICAgICAgdGhpcy5mbGFncyAmPSAtMjtcbiAgICB9XG4gIH1cbiAgdHJpZ2dlcigpIHtcbiAgICBpZiAodGhpcy5mbGFncyAmIDY0KSB7XG4gICAgICBwYXVzZWRRdWV1ZUVmZmVjdHMuYWRkKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zY2hlZHVsZXIpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucnVuSWZEaXJ0eSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBydW5JZkRpcnR5KCkge1xuICAgIGlmIChpc0RpcnR5KHRoaXMpKSB7XG4gICAgICB0aGlzLnJ1bigpO1xuICAgIH1cbiAgfVxuICBnZXQgZGlydHkoKSB7XG4gICAgcmV0dXJuIGlzRGlydHkodGhpcyk7XG4gIH1cbn1cbmxldCBiYXRjaERlcHRoID0gMDtcbmxldCBiYXRjaGVkU3ViO1xubGV0IGJhdGNoZWRDb21wdXRlZDtcbmZ1bmN0aW9uIGJhdGNoKHN1YiwgaXNDb21wdXRlZCA9IGZhbHNlKSB7XG4gIHN1Yi5mbGFncyB8PSA4O1xuICBpZiAoaXNDb21wdXRlZCkge1xuICAgIHN1Yi5uZXh0ID0gYmF0Y2hlZENvbXB1dGVkO1xuICAgIGJhdGNoZWRDb21wdXRlZCA9IHN1YjtcbiAgICByZXR1cm47XG4gIH1cbiAgc3ViLm5leHQgPSBiYXRjaGVkU3ViO1xuICBiYXRjaGVkU3ViID0gc3ViO1xufVxuZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgYmF0Y2hEZXB0aCsrO1xufVxuZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gIGlmICgtLWJhdGNoRGVwdGggPiAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChiYXRjaGVkQ29tcHV0ZWQpIHtcbiAgICBsZXQgZSA9IGJhdGNoZWRDb21wdXRlZDtcbiAgICBiYXRjaGVkQ29tcHV0ZWQgPSB2b2lkIDA7XG4gICAgd2hpbGUgKGUpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBlLm5leHQ7XG4gICAgICBlLm5leHQgPSB2b2lkIDA7XG4gICAgICBlLmZsYWdzICY9IC05O1xuICAgICAgZSA9IG5leHQ7XG4gICAgfVxuICB9XG4gIGxldCBlcnJvcjtcbiAgd2hpbGUgKGJhdGNoZWRTdWIpIHtcbiAgICBsZXQgZSA9IGJhdGNoZWRTdWI7XG4gICAgYmF0Y2hlZFN1YiA9IHZvaWQgMDtcbiAgICB3aGlsZSAoZSkge1xuICAgICAgY29uc3QgbmV4dCA9IGUubmV4dDtcbiAgICAgIGUubmV4dCA9IHZvaWQgMDtcbiAgICAgIGUuZmxhZ3MgJj0gLTk7XG4gICAgICBpZiAoZS5mbGFncyAmIDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZS50cmlnZ2VyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlID0gbmV4dDtcbiAgICB9XG4gIH1cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbn1cbmZ1bmN0aW9uIHByZXBhcmVEZXBzKHN1Yikge1xuICBmb3IgKGxldCBsaW5rID0gc3ViLmRlcHM7IGxpbms7IGxpbmsgPSBsaW5rLm5leHREZXApIHtcbiAgICBsaW5rLnZlcnNpb24gPSAtMTtcbiAgICBsaW5rLnByZXZBY3RpdmVMaW5rID0gbGluay5kZXAuYWN0aXZlTGluaztcbiAgICBsaW5rLmRlcC5hY3RpdmVMaW5rID0gbGluaztcbiAgfVxufVxuZnVuY3Rpb24gY2xlYW51cERlcHMoc3ViKSB7XG4gIGxldCBoZWFkO1xuICBsZXQgdGFpbCA9IHN1Yi5kZXBzVGFpbDtcbiAgbGV0IGxpbmsgPSB0YWlsO1xuICB3aGlsZSAobGluaykge1xuICAgIGNvbnN0IHByZXYgPSBsaW5rLnByZXZEZXA7XG4gICAgaWYgKGxpbmsudmVyc2lvbiA9PT0gLTEpIHtcbiAgICAgIGlmIChsaW5rID09PSB0YWlsKSB0YWlsID0gcHJldjtcbiAgICAgIHJlbW92ZVN1YihsaW5rKTtcbiAgICAgIHJlbW92ZURlcChsaW5rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZCA9IGxpbms7XG4gICAgfVxuICAgIGxpbmsuZGVwLmFjdGl2ZUxpbmsgPSBsaW5rLnByZXZBY3RpdmVMaW5rO1xuICAgIGxpbmsucHJldkFjdGl2ZUxpbmsgPSB2b2lkIDA7XG4gICAgbGluayA9IHByZXY7XG4gIH1cbiAgc3ViLmRlcHMgPSBoZWFkO1xuICBzdWIuZGVwc1RhaWwgPSB0YWlsO1xufVxuZnVuY3Rpb24gaXNEaXJ0eShzdWIpIHtcbiAgZm9yIChsZXQgbGluayA9IHN1Yi5kZXBzOyBsaW5rOyBsaW5rID0gbGluay5uZXh0RGVwKSB7XG4gICAgaWYgKGxpbmsuZGVwLnZlcnNpb24gIT09IGxpbmsudmVyc2lvbiB8fCBsaW5rLmRlcC5jb21wdXRlZCAmJiAocmVmcmVzaENvbXB1dGVkKGxpbmsuZGVwLmNvbXB1dGVkKSB8fCBsaW5rLmRlcC52ZXJzaW9uICE9PSBsaW5rLnZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHN1Yi5fZGlydHkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZWZyZXNoQ29tcHV0ZWQoY29tcHV0ZWQpIHtcbiAgaWYgKGNvbXB1dGVkLmZsYWdzICYgNCAmJiAhKGNvbXB1dGVkLmZsYWdzICYgMTYpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbXB1dGVkLmZsYWdzICY9IC0xNztcbiAgaWYgKGNvbXB1dGVkLmdsb2JhbFZlcnNpb24gPT09IGdsb2JhbFZlcnNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29tcHV0ZWQuZ2xvYmFsVmVyc2lvbiA9IGdsb2JhbFZlcnNpb247XG4gIGlmICghY29tcHV0ZWQuaXNTU1IgJiYgY29tcHV0ZWQuZmxhZ3MgJiAxMjggJiYgKCFjb21wdXRlZC5kZXBzICYmICFjb21wdXRlZC5fZGlydHkgfHwgIWlzRGlydHkoY29tcHV0ZWQpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb21wdXRlZC5mbGFncyB8PSAyO1xuICBjb25zdCBkZXAgPSBjb21wdXRlZC5kZXA7XG4gIGNvbnN0IHByZXZTdWIgPSBhY3RpdmVTdWI7XG4gIGNvbnN0IHByZXZTaG91bGRUcmFjayA9IHNob3VsZFRyYWNrO1xuICBhY3RpdmVTdWIgPSBjb21wdXRlZDtcbiAgc2hvdWxkVHJhY2sgPSB0cnVlO1xuICB0cnkge1xuICAgIHByZXBhcmVEZXBzKGNvbXB1dGVkKTtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXB1dGVkLmZuKGNvbXB1dGVkLl92YWx1ZSk7XG4gICAgaWYgKGRlcC52ZXJzaW9uID09PSAwIHx8IGhhc0NoYW5nZWQodmFsdWUsIGNvbXB1dGVkLl92YWx1ZSkpIHtcbiAgICAgIGNvbXB1dGVkLmZsYWdzIHw9IDEyODtcbiAgICAgIGNvbXB1dGVkLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgZGVwLnZlcnNpb24rKztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlcC52ZXJzaW9uKys7XG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVN1YiA9IHByZXZTdWI7XG4gICAgc2hvdWxkVHJhY2sgPSBwcmV2U2hvdWxkVHJhY2s7XG4gICAgY2xlYW51cERlcHMoY29tcHV0ZWQpO1xuICAgIGNvbXB1dGVkLmZsYWdzICY9IC0zO1xuICB9XG59XG5mdW5jdGlvbiByZW1vdmVTdWIobGluaywgc29mdCA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgZGVwLCBwcmV2U3ViLCBuZXh0U3ViIH0gPSBsaW5rO1xuICBpZiAocHJldlN1Yikge1xuICAgIHByZXZTdWIubmV4dFN1YiA9IG5leHRTdWI7XG4gICAgbGluay5wcmV2U3ViID0gdm9pZCAwO1xuICB9XG4gIGlmIChuZXh0U3ViKSB7XG4gICAgbmV4dFN1Yi5wcmV2U3ViID0gcHJldlN1YjtcbiAgICBsaW5rLm5leHRTdWIgPSB2b2lkIDA7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVwLnN1YnNIZWFkID09PSBsaW5rKSB7XG4gICAgZGVwLnN1YnNIZWFkID0gbmV4dFN1YjtcbiAgfVxuICBpZiAoZGVwLnN1YnMgPT09IGxpbmspIHtcbiAgICBkZXAuc3VicyA9IHByZXZTdWI7XG4gICAgaWYgKCFwcmV2U3ViICYmIGRlcC5jb21wdXRlZCkge1xuICAgICAgZGVwLmNvbXB1dGVkLmZsYWdzICY9IC01O1xuICAgICAgZm9yIChsZXQgbCA9IGRlcC5jb21wdXRlZC5kZXBzOyBsOyBsID0gbC5uZXh0RGVwKSB7XG4gICAgICAgIHJlbW92ZVN1YihsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFzb2Z0ICYmICEtLWRlcC5zYyAmJiBkZXAubWFwKSB7XG4gICAgZGVwLm1hcC5kZWxldGUoZGVwLmtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZURlcChsaW5rKSB7XG4gIGNvbnN0IHsgcHJldkRlcCwgbmV4dERlcCB9ID0gbGluaztcbiAgaWYgKHByZXZEZXApIHtcbiAgICBwcmV2RGVwLm5leHREZXAgPSBuZXh0RGVwO1xuICAgIGxpbmsucHJldkRlcCA9IHZvaWQgMDtcbiAgfVxuICBpZiAobmV4dERlcCkge1xuICAgIG5leHREZXAucHJldkRlcCA9IHByZXZEZXA7XG4gICAgbGluay5uZXh0RGVwID0gdm9pZCAwO1xuICB9XG59XG5mdW5jdGlvbiBlZmZlY3QoZm4sIG9wdGlvbnMpIHtcbiAgaWYgKGZuLmVmZmVjdCBpbnN0YW5jZW9mIFJlYWN0aXZlRWZmZWN0KSB7XG4gICAgZm4gPSBmbi5lZmZlY3QuZm47XG4gIH1cbiAgY29uc3QgZSA9IG5ldyBSZWFjdGl2ZUVmZmVjdChmbik7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgZXh0ZW5kKGUsIG9wdGlvbnMpO1xuICB9XG4gIHRyeSB7XG4gICAgZS5ydW4oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZS5zdG9wKCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IHJ1bm5lciA9IGUucnVuLmJpbmQoZSk7XG4gIHJ1bm5lci5lZmZlY3QgPSBlO1xuICByZXR1cm4gcnVubmVyO1xufVxuZnVuY3Rpb24gc3RvcChydW5uZXIpIHtcbiAgcnVubmVyLmVmZmVjdC5zdG9wKCk7XG59XG5sZXQgc2hvdWxkVHJhY2sgPSB0cnVlO1xuY29uc3QgdHJhY2tTdGFjayA9IFtdO1xuZnVuY3Rpb24gcGF1c2VUcmFja2luZygpIHtcbiAgdHJhY2tTdGFjay5wdXNoKHNob3VsZFRyYWNrKTtcbiAgc2hvdWxkVHJhY2sgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVuYWJsZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IHRydWU7XG59XG5mdW5jdGlvbiByZXNldFRyYWNraW5nKCkge1xuICBjb25zdCBsYXN0ID0gdHJhY2tTdGFjay5wb3AoKTtcbiAgc2hvdWxkVHJhY2sgPSBsYXN0ID09PSB2b2lkIDAgPyB0cnVlIDogbGFzdDtcbn1cbmZ1bmN0aW9uIG9uRWZmZWN0Q2xlYW51cChmbiwgZmFpbFNpbGVudGx5ID0gZmFsc2UpIHtcbiAgaWYgKGFjdGl2ZVN1YiBpbnN0YW5jZW9mIFJlYWN0aXZlRWZmZWN0KSB7XG4gICAgYWN0aXZlU3ViLmNsZWFudXAgPSBmbjtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFmYWlsU2lsZW50bHkpIHtcbiAgICB3YXJuKFxuICAgICAgYG9uRWZmZWN0Q2xlYW51cCgpIHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gYWN0aXZlIGVmZmVjdCB0byBhc3NvY2lhdGUgd2l0aC5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYW51cEVmZmVjdChlKSB7XG4gIGNvbnN0IHsgY2xlYW51cCB9ID0gZTtcbiAgZS5jbGVhbnVwID0gdm9pZCAwO1xuICBpZiAoY2xlYW51cCkge1xuICAgIGNvbnN0IHByZXZTdWIgPSBhY3RpdmVTdWI7XG4gICAgYWN0aXZlU3ViID0gdm9pZCAwO1xuICAgIHRyeSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN1YiA9IHByZXZTdWI7XG4gICAgfVxuICB9XG59XG5cbmxldCBnbG9iYWxWZXJzaW9uID0gMDtcbmNsYXNzIExpbmsge1xuICBjb25zdHJ1Y3RvcihzdWIsIGRlcCkge1xuICAgIHRoaXMuc3ViID0gc3ViO1xuICAgIHRoaXMuZGVwID0gZGVwO1xuICAgIHRoaXMudmVyc2lvbiA9IGRlcC52ZXJzaW9uO1xuICAgIHRoaXMubmV4dERlcCA9IHRoaXMucHJldkRlcCA9IHRoaXMubmV4dFN1YiA9IHRoaXMucHJldlN1YiA9IHRoaXMucHJldkFjdGl2ZUxpbmsgPSB2b2lkIDA7XG4gIH1cbn1cbmNsYXNzIERlcCB7XG4gIC8vIFRPRE8gaXNvbGF0ZWREZWNsYXJhdGlvbnMgXCJfX3Zfc2tpcFwiXG4gIGNvbnN0cnVjdG9yKGNvbXB1dGVkKSB7XG4gICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgIHRoaXMudmVyc2lvbiA9IDA7XG4gICAgLyoqXG4gICAgICogTGluayBiZXR3ZWVuIHRoaXMgZGVwIGFuZCB0aGUgY3VycmVudCBhY3RpdmUgZWZmZWN0XG4gICAgICovXG4gICAgdGhpcy5hY3RpdmVMaW5rID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIERvdWJseSBsaW5rZWQgbGlzdCByZXByZXNlbnRpbmcgdGhlIHN1YnNjcmliaW5nIGVmZmVjdHMgKHRhaWwpXG4gICAgICovXG4gICAgdGhpcy5zdWJzID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEZvciBvYmplY3QgcHJvcGVydHkgZGVwcyBjbGVhbnVwXG4gICAgICovXG4gICAgdGhpcy5tYXAgPSB2b2lkIDA7XG4gICAgdGhpcy5rZXkgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlciBjb3VudGVyXG4gICAgICovXG4gICAgdGhpcy5zYyA9IDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fX3Zfc2tpcCA9IHRydWU7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHRoaXMuc3Vic0hlYWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHRyYWNrKGRlYnVnSW5mbykge1xuICAgIGlmICghYWN0aXZlU3ViIHx8ICFzaG91bGRUcmFjayB8fCBhY3RpdmVTdWIgPT09IHRoaXMuY29tcHV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGxpbmsgPSB0aGlzLmFjdGl2ZUxpbms7XG4gICAgaWYgKGxpbmsgPT09IHZvaWQgMCB8fCBsaW5rLnN1YiAhPT0gYWN0aXZlU3ViKSB7XG4gICAgICBsaW5rID0gdGhpcy5hY3RpdmVMaW5rID0gbmV3IExpbmsoYWN0aXZlU3ViLCB0aGlzKTtcbiAgICAgIGlmICghYWN0aXZlU3ViLmRlcHMpIHtcbiAgICAgICAgYWN0aXZlU3ViLmRlcHMgPSBhY3RpdmVTdWIuZGVwc1RhaWwgPSBsaW5rO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluay5wcmV2RGVwID0gYWN0aXZlU3ViLmRlcHNUYWlsO1xuICAgICAgICBhY3RpdmVTdWIuZGVwc1RhaWwubmV4dERlcCA9IGxpbms7XG4gICAgICAgIGFjdGl2ZVN1Yi5kZXBzVGFpbCA9IGxpbms7XG4gICAgICB9XG4gICAgICBhZGRTdWIobGluayk7XG4gICAgfSBlbHNlIGlmIChsaW5rLnZlcnNpb24gPT09IC0xKSB7XG4gICAgICBsaW5rLnZlcnNpb24gPSB0aGlzLnZlcnNpb247XG4gICAgICBpZiAobGluay5uZXh0RGVwKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBsaW5rLm5leHREZXA7XG4gICAgICAgIG5leHQucHJldkRlcCA9IGxpbmsucHJldkRlcDtcbiAgICAgICAgaWYgKGxpbmsucHJldkRlcCkge1xuICAgICAgICAgIGxpbmsucHJldkRlcC5uZXh0RGVwID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnByZXZEZXAgPSBhY3RpdmVTdWIuZGVwc1RhaWw7XG4gICAgICAgIGxpbmsubmV4dERlcCA9IHZvaWQgMDtcbiAgICAgICAgYWN0aXZlU3ViLmRlcHNUYWlsLm5leHREZXAgPSBsaW5rO1xuICAgICAgICBhY3RpdmVTdWIuZGVwc1RhaWwgPSBsaW5rO1xuICAgICAgICBpZiAoYWN0aXZlU3ViLmRlcHMgPT09IGxpbmspIHtcbiAgICAgICAgICBhY3RpdmVTdWIuZGVwcyA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYWN0aXZlU3ViLm9uVHJhY2spIHtcbiAgICAgIGFjdGl2ZVN1Yi5vblRyYWNrKFxuICAgICAgICBleHRlbmQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWZmZWN0OiBhY3RpdmVTdWJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlYnVnSW5mb1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbGluaztcbiAgfVxuICB0cmlnZ2VyKGRlYnVnSW5mbykge1xuICAgIHRoaXMudmVyc2lvbisrO1xuICAgIGdsb2JhbFZlcnNpb24rKztcbiAgICB0aGlzLm5vdGlmeShkZWJ1Z0luZm8pO1xuICB9XG4gIG5vdGlmeShkZWJ1Z0luZm8pIHtcbiAgICBzdGFydEJhdGNoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGZvciAobGV0IGhlYWQgPSB0aGlzLnN1YnNIZWFkOyBoZWFkOyBoZWFkID0gaGVhZC5uZXh0U3ViKSB7XG4gICAgICAgICAgaWYgKGhlYWQuc3ViLm9uVHJpZ2dlciAmJiAhKGhlYWQuc3ViLmZsYWdzICYgOCkpIHtcbiAgICAgICAgICAgIGhlYWQuc3ViLm9uVHJpZ2dlcihcbiAgICAgICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVmZmVjdDogaGVhZC5zdWJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlYnVnSW5mb1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgbGluayA9IHRoaXMuc3ViczsgbGluazsgbGluayA9IGxpbmsucHJldlN1Yikge1xuICAgICAgICBpZiAobGluay5zdWIubm90aWZ5KCkpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgbGluay5zdWIuZGVwLm5vdGlmeSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZEJhdGNoKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBhZGRTdWIobGluaykge1xuICBsaW5rLmRlcC5zYysrO1xuICBpZiAobGluay5zdWIuZmxhZ3MgJiA0KSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBsaW5rLmRlcC5jb21wdXRlZDtcbiAgICBpZiAoY29tcHV0ZWQgJiYgIWxpbmsuZGVwLnN1YnMpIHtcbiAgICAgIGNvbXB1dGVkLmZsYWdzIHw9IDQgfCAxNjtcbiAgICAgIGZvciAobGV0IGwgPSBjb21wdXRlZC5kZXBzOyBsOyBsID0gbC5uZXh0RGVwKSB7XG4gICAgICAgIGFkZFN1YihsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY3VycmVudFRhaWwgPSBsaW5rLmRlcC5zdWJzO1xuICAgIGlmIChjdXJyZW50VGFpbCAhPT0gbGluaykge1xuICAgICAgbGluay5wcmV2U3ViID0gY3VycmVudFRhaWw7XG4gICAgICBpZiAoY3VycmVudFRhaWwpIGN1cnJlbnRUYWlsLm5leHRTdWIgPSBsaW5rO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBsaW5rLmRlcC5zdWJzSGVhZCA9PT0gdm9pZCAwKSB7XG4gICAgICBsaW5rLmRlcC5zdWJzSGVhZCA9IGxpbms7XG4gICAgfVxuICAgIGxpbmsuZGVwLnN1YnMgPSBsaW5rO1xuICB9XG59XG5jb25zdCB0YXJnZXRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IElURVJBVEVfS0VZID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiT2JqZWN0IGl0ZXJhdGVcIiA6IFwiXCJcbik7XG5jb25zdCBNQVBfS0VZX0lURVJBVEVfS0VZID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiTWFwIGtleXMgaXRlcmF0ZVwiIDogXCJcIlxuKTtcbmNvbnN0IEFSUkFZX0lURVJBVEVfS0VZID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQXJyYXkgaXRlcmF0ZVwiIDogXCJcIlxuKTtcbmZ1bmN0aW9uIHRyYWNrKHRhcmdldCwgdHlwZSwga2V5KSB7XG4gIGlmIChzaG91bGRUcmFjayAmJiBhY3RpdmVTdWIpIHtcbiAgICBsZXQgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgIHRhcmdldE1hcC5zZXQodGFyZ2V0LCBkZXBzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGxldCBkZXAgPSBkZXBzTWFwLmdldChrZXkpO1xuICAgIGlmICghZGVwKSB7XG4gICAgICBkZXBzTWFwLnNldChrZXksIGRlcCA9IG5ldyBEZXAoKSk7XG4gICAgICBkZXAubWFwID0gZGVwc01hcDtcbiAgICAgIGRlcC5rZXkgPSBrZXk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBkZXAudHJhY2soe1xuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGtleVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcC50cmFjaygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgZ2xvYmFsVmVyc2lvbisrO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBydW4gPSAoZGVwKSA9PiB7XG4gICAgaWYgKGRlcCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZGVwLnRyaWdnZXIoe1xuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgICBvbGRUYXJnZXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXAudHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgc3RhcnRCYXRjaCgpO1xuICBpZiAodHlwZSA9PT0gXCJjbGVhclwiKSB7XG4gICAgZGVwc01hcC5mb3JFYWNoKHJ1bik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFyZ2V0SXNBcnJheSA9IGlzQXJyYXkodGFyZ2V0KTtcbiAgICBjb25zdCBpc0FycmF5SW5kZXggPSB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpO1xuICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgY29uc3QgbmV3TGVuZ3RoID0gTnVtYmVyKG5ld1ZhbHVlKTtcbiAgICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICAgIGlmIChrZXkyID09PSBcImxlbmd0aFwiIHx8IGtleTIgPT09IEFSUkFZX0lURVJBVEVfS0VZIHx8ICFpc1N5bWJvbChrZXkyKSAmJiBrZXkyID49IG5ld0xlbmd0aCkge1xuICAgICAgICAgIHJ1bihkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGtleSAhPT0gdm9pZCAwIHx8IGRlcHNNYXAuaGFzKHZvaWQgMCkpIHtcbiAgICAgICAgcnVuKGRlcHNNYXAuZ2V0KGtleSkpO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlJbmRleCkge1xuICAgICAgICBydW4oZGVwc01hcC5nZXQoQVJSQVlfSVRFUkFURV9LRVkpKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgaWYgKCF0YXJnZXRJc0FycmF5KSB7XG4gICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJ1bihkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5SW5kZXgpIHtcbiAgICAgICAgICAgIHJ1bihkZXBzTWFwLmdldChcImxlbmd0aFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgaWYgKCF0YXJnZXRJc0FycmF5KSB7XG4gICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJ1bihkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2V0XCI6XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJ1bihkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZW5kQmF0Y2goKTtcbn1cbmZ1bmN0aW9uIGdldERlcEZyb21SZWFjdGl2ZShvYmplY3QsIGtleSkge1xuICBjb25zdCBkZXBNYXAgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCk7XG4gIHJldHVybiBkZXBNYXAgJiYgZGVwTWFwLmdldChrZXkpO1xufVxuXG5mdW5jdGlvbiByZWFjdGl2ZVJlYWRBcnJheShhcnJheSkge1xuICBjb25zdCByYXcgPSB0b1JhdyhhcnJheSk7XG4gIGlmIChyYXcgPT09IGFycmF5KSByZXR1cm4gcmF3O1xuICB0cmFjayhyYXcsIFwiaXRlcmF0ZVwiLCBBUlJBWV9JVEVSQVRFX0tFWSk7XG4gIGlmIChpc1NoYWxsb3coYXJyYXkpKSByZXR1cm4gcmF3O1xuICBpZiAoIWlzUmVhZG9ubHkoYXJyYXkpKSByZXR1cm4gcmF3Lm1hcCh0b1JlYWN0aXZlKTtcbiAgcmV0dXJuIGlzUmVhY3RpdmUoYXJyYXkpID8gcmF3Lm1hcCgoaXRlbSkgPT4gdG9SZWFkb25seSh0b1JlYWN0aXZlKGl0ZW0pKSkgOiByYXcubWFwKHRvUmVhZG9ubHkpO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRBcnJheShhcnIpIHtcbiAgdHJhY2soYXJyID0gdG9SYXcoYXJyKSwgXCJpdGVyYXRlXCIsIEFSUkFZX0lURVJBVEVfS0VZKTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIHRvV3JhcHBlZCh0YXJnZXQsIGl0ZW0pIHtcbiAgaWYgKGlzUmVhZG9ubHkodGFyZ2V0KSkge1xuICAgIHJldHVybiBpc1JlYWN0aXZlKHRhcmdldCkgPyB0b1JlYWRvbmx5KHRvUmVhY3RpdmUoaXRlbSkpIDogdG9SZWFkb25seShpdGVtKTtcbiAgfVxuICByZXR1cm4gdG9SZWFjdGl2ZShpdGVtKTtcbn1cbmNvbnN0IGFycmF5SW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgU3ltYm9sLml0ZXJhdG9yLCAoaXRlbSkgPT4gdG9XcmFwcGVkKHRoaXMsIGl0ZW0pKTtcbiAgfSxcbiAgY29uY2F0KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gcmVhY3RpdmVSZWFkQXJyYXkodGhpcykuY29uY2F0KFxuICAgICAgLi4uYXJncy5tYXAoKHgpID0+IGlzQXJyYXkoeCkgPyByZWFjdGl2ZVJlYWRBcnJheSh4KSA6IHgpXG4gICAgKTtcbiAgfSxcbiAgZW50cmllcygpIHtcbiAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgXCJlbnRyaWVzXCIsICh2YWx1ZSkgPT4ge1xuICAgICAgdmFsdWVbMV0gPSB0b1dyYXBwZWQodGhpcywgdmFsdWVbMV0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9LFxuICBldmVyeShmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcImV2ZXJ5XCIsIGZuLCB0aGlzQXJnLCB2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIGZpbHRlcihmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHRoaXMsXG4gICAgICBcImZpbHRlclwiLFxuICAgICAgZm4sXG4gICAgICB0aGlzQXJnLFxuICAgICAgKHYpID0+IHYubWFwKChpdGVtKSA9PiB0b1dyYXBwZWQodGhpcywgaXRlbSkpLFxuICAgICAgYXJndW1lbnRzXG4gICAgKTtcbiAgfSxcbiAgZmluZChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHRoaXMsXG4gICAgICBcImZpbmRcIixcbiAgICAgIGZuLFxuICAgICAgdGhpc0FyZyxcbiAgICAgIChpdGVtKSA9PiB0b1dyYXBwZWQodGhpcywgaXRlbSksXG4gICAgICBhcmd1bWVudHNcbiAgICApO1xuICB9LFxuICBmaW5kSW5kZXgoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJmaW5kSW5kZXhcIiwgZm4sIHRoaXNBcmcsIHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfSxcbiAgZmluZExhc3QoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICB0aGlzLFxuICAgICAgXCJmaW5kTGFzdFwiLFxuICAgICAgZm4sXG4gICAgICB0aGlzQXJnLFxuICAgICAgKGl0ZW0pID0+IHRvV3JhcHBlZCh0aGlzLCBpdGVtKSxcbiAgICAgIGFyZ3VtZW50c1xuICAgICk7XG4gIH0sXG4gIGZpbmRMYXN0SW5kZXgoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJmaW5kTGFzdEluZGV4XCIsIGZuLCB0aGlzQXJnLCB2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIC8vIGZsYXQsIGZsYXRNYXAgY291bGQgYmVuZWZpdCBmcm9tIEFSUkFZX0lURVJBVEUgYnV0IGFyZSBub3Qgc3RyYWlnaHQtZm9yd2FyZCB0byBpbXBsZW1lbnRcbiAgZm9yRWFjaChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcImZvckVhY2hcIiwgZm4sIHRoaXNBcmcsIHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfSxcbiAgaW5jbHVkZXMoLi4uYXJncykge1xuICAgIHJldHVybiBzZWFyY2hQcm94eSh0aGlzLCBcImluY2x1ZGVzXCIsIGFyZ3MpO1xuICB9LFxuICBpbmRleE9mKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc2VhcmNoUHJveHkodGhpcywgXCJpbmRleE9mXCIsIGFyZ3MpO1xuICB9LFxuICBqb2luKHNlcGFyYXRvcikge1xuICAgIHJldHVybiByZWFjdGl2ZVJlYWRBcnJheSh0aGlzKS5qb2luKHNlcGFyYXRvcik7XG4gIH0sXG4gIC8vIGtleXMoKSBpdGVyYXRvciBvbmx5IHJlYWRzIGBsZW5ndGhgLCBubyBvcHRpbWl6YXRpb24gcmVxdWlyZWRcbiAgbGFzdEluZGV4T2YoLi4uYXJncykge1xuICAgIHJldHVybiBzZWFyY2hQcm94eSh0aGlzLCBcImxhc3RJbmRleE9mXCIsIGFyZ3MpO1xuICB9LFxuICBtYXAoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJtYXBcIiwgZm4sIHRoaXNBcmcsIHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfSxcbiAgcG9wKCkge1xuICAgIHJldHVybiBub1RyYWNraW5nKHRoaXMsIFwicG9wXCIpO1xuICB9LFxuICBwdXNoKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbm9UcmFja2luZyh0aGlzLCBcInB1c2hcIiwgYXJncyk7XG4gIH0sXG4gIHJlZHVjZShmbiwgLi4uYXJncykge1xuICAgIHJldHVybiByZWR1Y2UodGhpcywgXCJyZWR1Y2VcIiwgZm4sIGFyZ3MpO1xuICB9LFxuICByZWR1Y2VSaWdodChmbiwgLi4uYXJncykge1xuICAgIHJldHVybiByZWR1Y2UodGhpcywgXCJyZWR1Y2VSaWdodFwiLCBmbiwgYXJncyk7XG4gIH0sXG4gIHNoaWZ0KCkge1xuICAgIHJldHVybiBub1RyYWNraW5nKHRoaXMsIFwic2hpZnRcIik7XG4gIH0sXG4gIC8vIHNsaWNlIGNvdWxkIHVzZSBBUlJBWV9JVEVSQVRFIGJ1dCBhbHNvIHNlZW1zIHRvIGJlZyBmb3IgcmFuZ2UgdHJhY2tpbmdcbiAgc29tZShmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcInNvbWVcIiwgZm4sIHRoaXNBcmcsIHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfSxcbiAgc3BsaWNlKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbm9UcmFja2luZyh0aGlzLCBcInNwbGljZVwiLCBhcmdzKTtcbiAgfSxcbiAgdG9SZXZlcnNlZCgpIHtcbiAgICByZXR1cm4gcmVhY3RpdmVSZWFkQXJyYXkodGhpcykudG9SZXZlcnNlZCgpO1xuICB9LFxuICB0b1NvcnRlZChjb21wYXJlcikge1xuICAgIHJldHVybiByZWFjdGl2ZVJlYWRBcnJheSh0aGlzKS50b1NvcnRlZChjb21wYXJlcik7XG4gIH0sXG4gIHRvU3BsaWNlZCguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHJlYWN0aXZlUmVhZEFycmF5KHRoaXMpLnRvU3BsaWNlZCguLi5hcmdzKTtcbiAgfSxcbiAgdW5zaGlmdCguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG5vVHJhY2tpbmcodGhpcywgXCJ1bnNoaWZ0XCIsIGFyZ3MpO1xuICB9LFxuICB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIFwidmFsdWVzXCIsIChpdGVtKSA9PiB0b1dyYXBwZWQodGhpcywgaXRlbSkpO1xuICB9XG59O1xuZnVuY3Rpb24gaXRlcmF0b3Ioc2VsZiwgbWV0aG9kLCB3cmFwVmFsdWUpIHtcbiAgY29uc3QgYXJyID0gc2hhbGxvd1JlYWRBcnJheShzZWxmKTtcbiAgY29uc3QgaXRlciA9IGFyclttZXRob2RdKCk7XG4gIGlmIChhcnIgIT09IHNlbGYgJiYgIWlzU2hhbGxvdyhzZWxmKSkge1xuICAgIGl0ZXIuX25leHQgPSBpdGVyLm5leHQ7XG4gICAgaXRlci5uZXh0ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXRlci5fbmV4dCgpO1xuICAgICAgaWYgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXN1bHQudmFsdWUgPSB3cmFwVmFsdWUocmVzdWx0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gaXRlcjtcbn1cbmNvbnN0IGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5mdW5jdGlvbiBhcHBseShzZWxmLCBtZXRob2QsIGZuLCB0aGlzQXJnLCB3cmFwcGVkUmV0Rm4sIGFyZ3MpIHtcbiAgY29uc3QgYXJyID0gc2hhbGxvd1JlYWRBcnJheShzZWxmKTtcbiAgY29uc3QgbmVlZHNXcmFwID0gYXJyICE9PSBzZWxmICYmICFpc1NoYWxsb3coc2VsZik7XG4gIGNvbnN0IG1ldGhvZEZuID0gYXJyW21ldGhvZF07XG4gIGlmIChtZXRob2RGbiAhPT0gYXJyYXlQcm90b1ttZXRob2RdKSB7XG4gICAgY29uc3QgcmVzdWx0MiA9IG1ldGhvZEZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIHJldHVybiBuZWVkc1dyYXAgPyB0b1JlYWN0aXZlKHJlc3VsdDIpIDogcmVzdWx0MjtcbiAgfVxuICBsZXQgd3JhcHBlZEZuID0gZm47XG4gIGlmIChhcnIgIT09IHNlbGYpIHtcbiAgICBpZiAobmVlZHNXcmFwKSB7XG4gICAgICB3cmFwcGVkRm4gPSBmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCB0b1dyYXBwZWQoc2VsZiwgaXRlbSksIGluZGV4LCBzZWxmKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChmbi5sZW5ndGggPiAyKSB7XG4gICAgICB3cmFwcGVkRm4gPSBmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBpdGVtLCBpbmRleCwgc2VsZik7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSBtZXRob2RGbi5jYWxsKGFyciwgd3JhcHBlZEZuLCB0aGlzQXJnKTtcbiAgcmV0dXJuIG5lZWRzV3JhcCAmJiB3cmFwcGVkUmV0Rm4gPyB3cmFwcGVkUmV0Rm4ocmVzdWx0KSA6IHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHJlZHVjZShzZWxmLCBtZXRob2QsIGZuLCBhcmdzKSB7XG4gIGNvbnN0IGFyciA9IHNoYWxsb3dSZWFkQXJyYXkoc2VsZik7XG4gIGNvbnN0IG5lZWRzV3JhcCA9IGFyciAhPT0gc2VsZiAmJiAhaXNTaGFsbG93KHNlbGYpO1xuICBsZXQgd3JhcHBlZEZuID0gZm47XG4gIGxldCB3cmFwSW5pdGlhbEFjY3VtdWxhdG9yID0gZmFsc2U7XG4gIGlmIChhcnIgIT09IHNlbGYpIHtcbiAgICBpZiAobmVlZHNXcmFwKSB7XG4gICAgICB3cmFwSW5pdGlhbEFjY3VtdWxhdG9yID0gYXJncy5sZW5ndGggPT09IDA7XG4gICAgICB3cmFwcGVkRm4gPSBmdW5jdGlvbihhY2MsIGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmICh3cmFwSW5pdGlhbEFjY3VtdWxhdG9yKSB7XG4gICAgICAgICAgd3JhcEluaXRpYWxBY2N1bXVsYXRvciA9IGZhbHNlO1xuICAgICAgICAgIGFjYyA9IHRvV3JhcHBlZChzZWxmLCBhY2MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGFjYywgdG9XcmFwcGVkKHNlbGYsIGl0ZW0pLCBpbmRleCwgc2VsZik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZm4ubGVuZ3RoID4gMykge1xuICAgICAgd3JhcHBlZEZuID0gZnVuY3Rpb24oYWNjLCBpdGVtLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhY2MsIGl0ZW0sIGluZGV4LCBzZWxmKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFyclttZXRob2RdKHdyYXBwZWRGbiwgLi4uYXJncyk7XG4gIHJldHVybiB3cmFwSW5pdGlhbEFjY3VtdWxhdG9yID8gdG9XcmFwcGVkKHNlbGYsIHJlc3VsdCkgOiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzZWFyY2hQcm94eShzZWxmLCBtZXRob2QsIGFyZ3MpIHtcbiAgY29uc3QgYXJyID0gdG9SYXcoc2VsZik7XG4gIHRyYWNrKGFyciwgXCJpdGVyYXRlXCIsIEFSUkFZX0lURVJBVEVfS0VZKTtcbiAgY29uc3QgcmVzID0gYXJyW21ldGhvZF0oLi4uYXJncyk7XG4gIGlmICgocmVzID09PSAtMSB8fCByZXMgPT09IGZhbHNlKSAmJiBpc1Byb3h5KGFyZ3NbMF0pKSB7XG4gICAgYXJnc1swXSA9IHRvUmF3KGFyZ3NbMF0pO1xuICAgIHJldHVybiBhcnJbbWV0aG9kXSguLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gbm9UcmFja2luZyhzZWxmLCBtZXRob2QsIGFyZ3MgPSBbXSkge1xuICBwYXVzZVRyYWNraW5nKCk7XG4gIHN0YXJ0QmF0Y2goKTtcbiAgY29uc3QgcmVzID0gdG9SYXcoc2VsZilbbWV0aG9kXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgZW5kQmF0Y2goKTtcbiAgcmVzZXRUcmFja2luZygpO1xuICByZXR1cm4gcmVzO1xufVxuXG5jb25zdCBpc05vblRyYWNrYWJsZUtleXMgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChgX19wcm90b19fLF9fdl9pc1JlZixfX2lzVnVlYCk7XG5jb25zdCBidWlsdEluU3ltYm9scyA9IG5ldyBTZXQoXG4gIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IFwiYXJndW1lbnRzXCIgJiYga2V5ICE9PSBcImNhbGxlclwiKS5tYXAoKGtleSkgPT4gU3ltYm9sW2tleV0pLmZpbHRlcihpc1N5bWJvbClcbik7XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShrZXkpIHtcbiAgaWYgKCFpc1N5bWJvbChrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgY29uc3Qgb2JqID0gdG9SYXcodGhpcyk7XG4gIHRyYWNrKG9iaiwgXCJoYXNcIiwga2V5KTtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xufVxuY2xhc3MgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKF9pc1JlYWRvbmx5ID0gZmFsc2UsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICAgIHRoaXMuX2lzUmVhZG9ubHkgPSBfaXNSZWFkb25seTtcbiAgICB0aGlzLl9pc1NoYWxsb3cgPSBfaXNTaGFsbG93O1xuICB9XG4gIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcIl9fdl9za2lwXCIpIHJldHVybiB0YXJnZXRbXCJfX3Zfc2tpcFwiXTtcbiAgICBjb25zdCBpc1JlYWRvbmx5MiA9IHRoaXMuX2lzUmVhZG9ubHksIGlzU2hhbGxvdzIgPSB0aGlzLl9pc1NoYWxsb3c7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNTaGFsbG93XCIpIHtcbiAgICAgIHJldHVybiBpc1NoYWxsb3cyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgaWYgKHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpIHx8IC8vIHJlY2VpdmVyIGlzIG5vdCB0aGUgcmVhY3RpdmUgcHJveHksIGJ1dCBoYXMgdGhlIHNhbWUgcHJvdG90eXBlXG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSByZWNlaXZlciBpcyBhIHVzZXIgcHJveHkgb2YgdGhlIHJlYWN0aXZlIHByb3h5XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGxldCBmbjtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIChmbiA9IGFycmF5SW5zdHJ1bWVudGF0aW9uc1trZXldKSkge1xuICAgICAgICByZXR1cm4gZm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldChcbiAgICAgIHRhcmdldCxcbiAgICAgIGtleSxcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSBwcm94eSB3cmFwcGluZyBhIHJlZiwgcmV0dXJuIG1ldGhvZHMgdXNpbmcgdGhlIHJhdyByZWZcbiAgICAgIC8vIGFzIHJlY2VpdmVyIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIGB0b1Jhd2Agb24gdGhlIHJlZiBpbiBhbGxcbiAgICAgIC8vIGl0cyBjbGFzcyBtZXRob2RzXG4gICAgICBpc1JlZih0YXJnZXQpID8gdGFyZ2V0IDogcmVjZWl2ZXJcbiAgICApO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoaXNTaGFsbG93Mikge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0SXNBcnJheSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IHJlcyA6IHJlcy52YWx1ZTtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MiAmJiBpc09iamVjdCh2YWx1ZSkgPyByZWFkb25seSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHJlcykpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MiA/IHJlYWRvbmx5KHJlcykgOiByZWFjdGl2ZShyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5jbGFzcyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICAgIHN1cGVyKGZhbHNlLCBpc1NoYWxsb3cyKTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgIGxldCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IGlzQXJyYXlXaXRoSW50ZWdlcktleSA9IGlzQXJyYXkodGFyZ2V0KSAmJiBpc0ludGVnZXJLZXkoa2V5KTtcbiAgICBpZiAoIXRoaXMuX2lzU2hhbGxvdykge1xuICAgICAgY29uc3QgaXNPbGRWYWx1ZVJlYWRvbmx5ID0gaXNSZWFkb25seShvbGRWYWx1ZSk7XG4gICAgICBpZiAoIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgICAgIG9sZFZhbHVlID0gdG9SYXcob2xkVmFsdWUpO1xuICAgICAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheVdpdGhJbnRlZ2VyS2V5ICYmIGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICAgIGlmIChpc09sZFZhbHVlUmVhZG9ubHkpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgYFNldCBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICAgICAgICB0YXJnZXRba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoYWRLZXkgPSBpc0FycmF5V2l0aEludGVnZXJLZXkgPyBOdW1iZXIoa2V5KSA8IHRhcmdldC5sZW5ndGggOiBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3Quc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBpc1JlZih0YXJnZXQpID8gdGFyZ2V0IDogcmVjZWl2ZXJcbiAgICApO1xuICAgIGlmICh0YXJnZXQgPT09IHRvUmF3KHJlY2VpdmVyKSAmJiByZXN1bHQpIHtcbiAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCBoYWRLZXkgPSBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSk7XG4gICAgaWYgKHJlc3VsdCAmJiBoYWRLZXkpIHtcbiAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGhhcyh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICB0cmFjayh0YXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayhcbiAgICAgIHRhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNBcnJheSh0YXJnZXQpID8gXCJsZW5ndGhcIiA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH1cbn1cbmNsYXNzIFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICAgIHN1cGVyKHRydWUsIGlzU2hhbGxvdzIpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcblxuY29uc3QgdG9TaGFsbG93ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IGdldFByb3RvID0gKHYpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yodik7XG5mdW5jdGlvbiBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGlzUmVhZG9ubHkyLCBpc1NoYWxsb3cyKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXRJc01hcCA9IGlzTWFwKHJhd1RhcmdldCk7XG4gICAgY29uc3QgaXNQYWlyID0gbWV0aG9kID09PSBcImVudHJpZXNcIiB8fCBtZXRob2QgPT09IFN5bWJvbC5pdGVyYXRvciAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpc0tleU9ubHkgPSBtZXRob2QgPT09IFwia2V5c1wiICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlubmVySXRlcmF0b3IgPSB0YXJnZXRbbWV0aG9kXSguLi5hcmdzKTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93MiA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkyID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkyICYmIHRyYWNrKFxuICAgICAgcmF3VGFyZ2V0LFxuICAgICAgXCJpdGVyYXRlXCIsXG4gICAgICBpc0tleU9ubHkgPyBNQVBfS0VZX0lURVJBVEVfS0VZIDogSVRFUkFURV9LRVlcbiAgICApO1xuICAgIHJldHVybiBleHRlbmQoXG4gICAgICAvLyBpbmhlcml0aW5nIGFsbCBpdGVyYXRvciBwcm9wZXJ0aWVzXG4gICAgICBPYmplY3QuY3JlYXRlKGlubmVySXRlcmF0b3IpLFxuICAgICAge1xuICAgICAgICAvLyBpdGVyYXRvciBwcm90b2NvbFxuICAgICAgICBuZXh0KCkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIHJldHVybiBkb25lID8geyB2YWx1ZSwgZG9uZSB9IDoge1xuICAgICAgICAgICAgdmFsdWU6IGlzUGFpciA/IFt3cmFwKHZhbHVlWzBdKSwgd3JhcCh2YWx1ZVsxXSldIDogd3JhcCh2YWx1ZSksXG4gICAgICAgICAgICBkb25lXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFkb25seU1ldGhvZCh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZ3NbMF0gPyBgb24ga2V5IFwiJHthcmdzWzBdfVwiIGAgOiBgYDtcbiAgICAgIHdhcm4oXG4gICAgICAgIGAke2NhcGl0YWxpemUodHlwZSl9IG9wZXJhdGlvbiAke2tleX1mYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0b1Jhdyh0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGUgPT09IFwiZGVsZXRlXCIgPyBmYWxzZSA6IHR5cGUgPT09IFwiY2xlYXJcIiA/IHZvaWQgMCA6IHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25zKHJlYWRvbmx5LCBzaGFsbG93KSB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbnMgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gICAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgICAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgICAgIGlmICghcmVhZG9ubHkpIHtcbiAgICAgICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwgcmF3S2V5KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGFzIH0gPSBnZXRQcm90byhyYXdUYXJnZXQpO1xuICAgICAgY29uc3Qgd3JhcCA9IHNoYWxsb3cgPyB0b1NoYWxsb3cgOiByZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICAgaWYgKGhhcy5jYWxsKHJhd1RhcmdldCwga2V5KSkge1xuICAgICAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KGtleSkpO1xuICAgICAgfSBlbHNlIGlmIChoYXMuY2FsbChyYXdUYXJnZXQsIHJhd0tleSkpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChyYXdLZXkpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICE9PSByYXdUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmdldChrZXkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzW1wiX192X3Jhd1wiXTtcbiAgICAgICFyZWFkb25seSAmJiB0cmFjayh0b1Jhdyh0YXJnZXQpLCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICAgICAgcmV0dXJuIHRhcmdldC5zaXplO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gICAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgICAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgICAgIGlmICghcmVhZG9ubHkpIHtcbiAgICAgICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwgcmF3S2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXkgPT09IHJhd0tleSA/IHRhcmdldC5oYXMoa2V5KSA6IHRhcmdldC5oYXMoa2V5KSB8fCB0YXJnZXQuaGFzKHJhd0tleSk7XG4gICAgfSxcbiAgICBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlZCA9IHRoaXM7XG4gICAgICBjb25zdCB0YXJnZXQgPSBvYnNlcnZlZFtcIl9fdl9yYXdcIl07XG4gICAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgICAgY29uc3Qgd3JhcCA9IHNoYWxsb3cgPyB0b1NoYWxsb3cgOiByZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICAgIXJlYWRvbmx5ICYmIHRyYWNrKHJhd1RhcmdldCwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgICAgIHJldHVybiB0YXJnZXQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB3cmFwKHZhbHVlKSwgd3JhcChrZXkpLCBvYnNlcnZlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGV4dGVuZChcbiAgICBpbnN0cnVtZW50YXRpb25zLFxuICAgIHJlYWRvbmx5ID8ge1xuICAgICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIpLFxuICAgICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIilcbiAgICB9IDoge1xuICAgICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICAgICAgICBjb25zdCBwcm90byA9IGdldFByb3RvKHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgICAgICBjb25zdCB2YWx1ZVRvQWRkID0gIXNoYWxsb3cgJiYgIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpID8gcmF3VmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgY29uc3QgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCB2YWx1ZVRvQWRkKSB8fCBoYXNDaGFuZ2VkKHZhbHVlLCB2YWx1ZVRvQWRkKSAmJiBwcm90by5oYXMuY2FsbCh0YXJnZXQsIHZhbHVlKSB8fCBoYXNDaGFuZ2VkKHJhd1ZhbHVlLCB2YWx1ZVRvQWRkKSAmJiBwcm90by5oYXMuY2FsbCh0YXJnZXQsIHJhd1ZhbHVlKTtcbiAgICAgICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgICAgICB0YXJnZXQuYWRkKHZhbHVlVG9BZGQpO1xuICAgICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCB2YWx1ZVRvQWRkLCB2YWx1ZVRvQWRkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXNoYWxsb3cgJiYgIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gICAgICAgIGNvbnN0IHsgaGFzLCBnZXQgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gICAgICAgIGxldCBoYWRLZXkgPSBoYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICAgICAgICBoYWRLZXkgPSBoYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0LmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgICAgICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gICAgICAgIGNvbnN0IHsgaGFzLCBnZXQgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gICAgICAgIGxldCBoYWRLZXkgPSBoYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICAgICAgICBoYWRLZXkgPSBoYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0ID8gZ2V0LmNhbGwodGFyZ2V0LCBrZXkpIDogdm9pZCAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0YXJnZXQuZGVsZXRlKGtleSk7XG4gICAgICAgIGlmIChoYWRLZXkpIHtcbiAgICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIGNsZWFyKCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgICAgICAgY29uc3QgaGFkSXRlbXMgPSB0YXJnZXQuc2l6ZSAhPT0gMDtcbiAgICAgICAgY29uc3Qgb2xkVGFyZ2V0ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGlzTWFwKHRhcmdldCkgPyBuZXcgTWFwKHRhcmdldCkgOiBuZXcgU2V0KHRhcmdldCkgOiB2b2lkIDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5jbGVhcigpO1xuICAgICAgICBpZiAoaGFkSXRlbXMpIHtcbiAgICAgICAgICB0cmlnZ2VyKFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgXCJjbGVhclwiLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgb2xkVGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgY29uc3QgaXRlcmF0b3JNZXRob2RzID0gW1xuICAgIFwia2V5c1wiLFxuICAgIFwidmFsdWVzXCIsXG4gICAgXCJlbnRyaWVzXCIsXG4gICAgU3ltYm9sLml0ZXJhdG9yXG4gIF07XG4gIGl0ZXJhdG9yTWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpbnN0cnVtZW50YXRpb25zW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIHJlYWRvbmx5LCBzaGFsbG93KTtcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVtZW50YXRpb25zO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGlzUmVhZG9ubHkyLCBzaGFsbG93KSB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbnMgPSBjcmVhdGVJbnN0cnVtZW50YXRpb25zKGlzUmVhZG9ubHkyLCBzaGFsbG93KTtcbiAgcmV0dXJuICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWN0aXZlXCIpIHtcbiAgICAgIHJldHVybiAhaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIikge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KFxuICAgICAgaGFzT3duKGluc3RydW1lbnRhdGlvbnMsIGtleSkgJiYga2V5IGluIHRhcmdldCA/IGluc3RydW1lbnRhdGlvbnMgOiB0YXJnZXQsXG4gICAgICBrZXksXG4gICAgICByZWNlaXZlclxuICAgICk7XG4gIH07XG59XG5jb25zdCBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgdHJ1ZSlcbn07XG5jb25zdCByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIHRydWUpXG59O1xuZnVuY3Rpb24gY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMsIGtleSkge1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAocmF3S2V5ICE9PSBrZXkgJiYgaGFzLmNhbGwodGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgY29uc3QgdHlwZSA9IHRvUmF3VHlwZSh0YXJnZXQpO1xuICAgIHdhcm4oXG4gICAgICBgUmVhY3RpdmUgJHt0eXBlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7dHlwZSA9PT0gYE1hcGAgPyBgIGFzIGtleXNgIDogYGB9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gdGFyZ2V0VHlwZU1hcChyYXdUeXBlKSB7XG4gIHN3aXRjaCAocmF3VHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiAxIC8qIENPTU1PTiAqLztcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICAgIHJldHVybiAyIC8qIENPTExFQ1RJT04gKi87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwIC8qIElOVkFMSUQgKi87XG4gIH1cbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiByZWFjdGl2ZSh0YXJnZXQpIHtcbiAgaWYgKC8qIEBfX1BVUkVfXyAqLyBpc1JlYWRvbmx5KHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgbXV0YWJsZUhhbmRsZXJzLFxuICAgIG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhY3RpdmVNYXBcbiAgKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMsXG4gICAgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhY3RpdmVNYXBcbiAgKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiByZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHJlYWRvbmx5SGFuZGxlcnMsXG4gICAgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhZG9ubHlNYXBcbiAgKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBzaGFsbG93UmVhZG9ubHkodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgdHJ1ZSxcbiAgICBzaGFsbG93UmVhZG9ubHlIYW5kbGVycyxcbiAgICBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5TWFwXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZU9iamVjdCh0YXJnZXQsIGlzUmVhZG9ubHkyLCBiYXNlSGFuZGxlcnMsIGNvbGxlY3Rpb25IYW5kbGVycywgcHJveHlNYXApIHtcbiAgaWYgKCFpc09iamVjdCh0YXJnZXQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGB2YWx1ZSBjYW5ub3QgYmUgbWFkZSAke2lzUmVhZG9ubHkyID8gXCJyZWFkb25seVwiIDogXCJyZWFjdGl2ZVwifTogJHtTdHJpbmcoXG4gICAgICAgICAgdGFyZ2V0XG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBpZiAodGFyZ2V0W1wiX192X3Jhd1wiXSAmJiAhKGlzUmVhZG9ubHkyICYmIHRhcmdldFtcIl9fdl9pc1JlYWN0aXZlXCJdKSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKHRhcmdldFtcIl9fdl9za2lwXCJdIHx8ICFPYmplY3QuaXNFeHRlbnNpYmxlKHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nUHJveHkgPSBwcm94eU1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKGV4aXN0aW5nUHJveHkpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdQcm94eTtcbiAgfVxuICBjb25zdCB0YXJnZXRUeXBlID0gdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodGFyZ2V0KSk7XG4gIGlmICh0YXJnZXRUeXBlID09PSAwIC8qIElOVkFMSUQgKi8pIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KFxuICAgIHRhcmdldCxcbiAgICB0YXJnZXRUeXBlID09PSAyIC8qIENPTExFQ1RJT04gKi8gPyBjb2xsZWN0aW9uSGFuZGxlcnMgOiBiYXNlSGFuZGxlcnNcbiAgKTtcbiAgcHJveHlNYXAuc2V0KHRhcmdldCwgcHJveHkpO1xuICByZXR1cm4gcHJveHk7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gaXNSZWFjdGl2ZSh2YWx1ZSkge1xuICBpZiAoLyogQF9fUFVSRV9fICovIGlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBpc1JlYWN0aXZlKHZhbHVlW1wiX192X3Jhd1wiXSk7XG4gIH1cbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhY3RpdmVcIl0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGlzUmVhZG9ubHkodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhZG9ubHlcIl0pO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGlzU2hhbGxvdyh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCJdKTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBpc1Byb3h5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/ICEhdmFsdWVbXCJfX3ZfcmF3XCJdIDogZmFsc2U7XG59XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgY29uc3QgcmF3ID0gb2JzZXJ2ZWQgJiYgb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICByZXR1cm4gcmF3ID8gLyogQF9fUFVSRV9fICovIHRvUmF3KHJhdykgOiBvYnNlcnZlZDtcbn1cbmZ1bmN0aW9uIG1hcmtSYXcodmFsdWUpIHtcbiAgaWYgKCFoYXNPd24odmFsdWUsIFwiX192X3NraXBcIikgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkpIHtcbiAgICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgdG9SZWFjdGl2ZSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gLyogQF9fUFVSRV9fICovIHJlYWN0aXZlKHZhbHVlKSA6IHZhbHVlO1xuY29uc3QgdG9SZWFkb25seSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gLyogQF9fUFVSRV9fICovIHJlYWRvbmx5KHZhbHVlKSA6IHZhbHVlO1xuXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gaXNSZWYocikge1xuICByZXR1cm4gciA/IHJbXCJfX3ZfaXNSZWZcIl0gPT09IHRydWUgOiBmYWxzZTtcbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiByZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgZmFsc2UpO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIHNoYWxsb3dSZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWYocmF3VmFsdWUsIHNoYWxsb3cpIHtcbiAgaWYgKC8qIEBfX1BVUkVfXyAqLyBpc1JlZihyYXdWYWx1ZSkpIHtcbiAgICByZXR1cm4gcmF3VmFsdWU7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZWZJbXBsKHJhd1ZhbHVlLCBzaGFsbG93KTtcbn1cbmNsYXNzIFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgaXNTaGFsbG93Mikge1xuICAgIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWZcIl0gPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNTaGFsbG93XCJdID0gZmFsc2U7XG4gICAgdGhpcy5fcmF3VmFsdWUgPSBpc1NoYWxsb3cyID8gdmFsdWUgOiB0b1Jhdyh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSBpc1NoYWxsb3cyID8gdmFsdWUgOiB0b1JlYWN0aXZlKHZhbHVlKTtcbiAgICB0aGlzW1wiX192X2lzU2hhbGxvd1wiXSA9IGlzU2hhbGxvdzI7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0aGlzLmRlcC50cmFjayh7XG4gICAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgICAgdHlwZTogXCJnZXRcIixcbiAgICAgICAga2V5OiBcInZhbHVlXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlcC50cmFjaygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9yYXdWYWx1ZTtcbiAgICBjb25zdCB1c2VEaXJlY3RWYWx1ZSA9IHRoaXNbXCJfX3ZfaXNTaGFsbG93XCJdIHx8IGlzU2hhbGxvdyhuZXdWYWx1ZSkgfHwgaXNSZWFkb25seShuZXdWYWx1ZSk7XG4gICAgbmV3VmFsdWUgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbHVlIDogdG9SYXcobmV3VmFsdWUpO1xuICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsdWUgOiB0b1JlYWN0aXZlKG5ld1ZhbHVlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRoaXMuZGVwLnRyaWdnZXIoe1xuICAgICAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgIG9sZFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZXAudHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZihyZWYyKSB7XG4gIGlmIChyZWYyLmRlcCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICByZWYyLmRlcC50cmlnZ2VyKHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IHJlZjIuX3ZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmMi5kZXAudHJpZ2dlcigpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5yZWYocmVmMikge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGlzUmVmKHJlZjIpID8gcmVmMi52YWx1ZSA6IHJlZjI7XG59XG5mdW5jdGlvbiB0b1ZhbHVlKHNvdXJjZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UpID8gc291cmNlKCkgOiB1bnJlZihzb3VyY2UpO1xufVxuY29uc3Qgc2hhbGxvd1Vud3JhcEhhbmRsZXJzID0ge1xuICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IGtleSA9PT0gXCJfX3ZfcmF3XCIgPyB0YXJnZXQgOiB1bnJlZihSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpKSxcbiAgc2V0OiAodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKC8qIEBfX1BVUkVfXyAqLyBpc1JlZihvbGRWYWx1ZSkgJiYgIS8qIEBfX1BVUkVfXyAqLyBpc1JlZih2YWx1ZSkpIHtcbiAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIHByb3h5UmVmcyhvYmplY3RXaXRoUmVmcykge1xuICByZXR1cm4gaXNSZWFjdGl2ZShvYmplY3RXaXRoUmVmcykgPyBvYmplY3RXaXRoUmVmcyA6IG5ldyBQcm94eShvYmplY3RXaXRoUmVmcywgc2hhbGxvd1Vud3JhcEhhbmRsZXJzKTtcbn1cbmNsYXNzIEN1c3RvbVJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihmYWN0b3J5KSB7XG4gICAgdGhpc1tcIl9fdl9pc1JlZlwiXSA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2b2lkIDA7XG4gICAgY29uc3QgZGVwID0gdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZmFjdG9yeShkZXAudHJhY2suYmluZChkZXApLCBkZXAudHJpZ2dlci5iaW5kKGRlcCkpO1xuICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICB0aGlzLl9zZXQgPSBzZXQ7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZSA9IHRoaXMuX2dldCgpO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9zZXQobmV3VmFsKTtcbiAgfVxufVxuZnVuY3Rpb24gY3VzdG9tUmVmKGZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBDdXN0b21SZWZJbXBsKGZhY3RvcnkpO1xufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIHdhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwga2V5LCBfZGVmYXVsdFZhbHVlKSB7XG4gICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWZcIl0gPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgIHRoaXMuX2tleSA9IGlzU3ltYm9sKGtleSkgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbiAgICB0aGlzLl9yYXcgPSB0b1Jhdyhfb2JqZWN0KTtcbiAgICBsZXQgc2hhbGxvdyA9IHRydWU7XG4gICAgbGV0IG9iaiA9IF9vYmplY3Q7XG4gICAgaWYgKCFpc0FycmF5KF9vYmplY3QpIHx8IGlzU3ltYm9sKHRoaXMuX2tleSkgfHwgIWlzSW50ZWdlcktleSh0aGlzLl9rZXkpKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHNoYWxsb3cgPSAhaXNQcm94eShvYmopIHx8IGlzU2hhbGxvdyhvYmopO1xuICAgICAgfSB3aGlsZSAoc2hhbGxvdyAmJiAob2JqID0gb2JqW1wiX192X3Jhd1wiXSkpO1xuICAgIH1cbiAgICB0aGlzLl9zaGFsbG93ID0gc2hhbGxvdztcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgbGV0IHZhbCA9IHRoaXMuX29iamVjdFt0aGlzLl9rZXldO1xuICAgIGlmICh0aGlzLl9zaGFsbG93KSB7XG4gICAgICB2YWwgPSB1bnJlZih2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPSB2YWwgPT09IHZvaWQgMCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IHZhbDtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgaWYgKHRoaXMuX3NoYWxsb3cgJiYgLyogQF9fUFVSRV9fICovIGlzUmVmKHRoaXMuX3Jhd1t0aGlzLl9rZXldKSkge1xuICAgICAgY29uc3QgbmVzdGVkUmVmID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgICBpZiAoLyogQF9fUFVSRV9fICovIGlzUmVmKG5lc3RlZFJlZikpIHtcbiAgICAgICAgbmVzdGVkUmVmLnZhbHVlID0gbmV3VmFsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX29iamVjdFt0aGlzLl9rZXldID0gbmV3VmFsO1xuICB9XG4gIGdldCBkZXAoKSB7XG4gICAgcmV0dXJuIGdldERlcEZyb21SZWFjdGl2ZSh0aGlzLl9yYXcsIHRoaXMuX2tleSk7XG4gIH1cbn1cbmNsYXNzIEdldHRlclJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihfZ2V0dGVyKSB7XG4gICAgdGhpcy5fZ2V0dGVyID0gX2dldHRlcjtcbiAgICB0aGlzW1wiX192X2lzUmVmXCJdID0gdHJ1ZTtcbiAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIl0gPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPSB0aGlzLl9nZXR0ZXIoKTtcbiAgfVxufVxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIHRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKC8qIEBfX1BVUkVfXyAqLyBpc1JlZihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gbmV3IEdldHRlclJlZkltcGwoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyByZWYoc291cmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJvcGVydHlUb1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiBuZXcgT2JqZWN0UmVmSW1wbChzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKTtcbn1cblxuY2xhc3MgQ29tcHV0ZWRSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZm4sIHNldHRlciwgaXNTU1IpIHtcbiAgICB0aGlzLmZuID0gZm47XG4gICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fdmFsdWUgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5kZXAgPSBuZXcgRGVwKHRoaXMpO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICAvLyBUT0RPIGlzb2xhdGVkRGVjbGFyYXRpb25zIFwiX192X2lzUmVhZG9ubHlcIlxuICAgIC8vIEEgY29tcHV0ZWQgaXMgYWxzbyBhIHN1YnNjcmliZXIgdGhhdCB0cmFja3Mgb3RoZXIgZGVwc1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZGVwcyA9IHZvaWQgMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmRlcHNUYWlsID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZmxhZ3MgPSAxNjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmdsb2JhbFZlcnNpb24gPSBnbG9iYWxWZXJzaW9uIC0gMTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSB2b2lkIDA7XG4gICAgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRcbiAgICB0aGlzLmVmZmVjdCA9IHRoaXM7XG4gICAgdGhpc1tcIl9fdl9pc1JlYWRvbmx5XCJdID0gIXNldHRlcjtcbiAgICB0aGlzLmlzU1NSID0gaXNTU1I7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbm90aWZ5KCkge1xuICAgIHRoaXMuZmxhZ3MgfD0gMTY7XG4gICAgaWYgKCEodGhpcy5mbGFncyAmIDgpICYmIC8vIGF2b2lkIGluZmluaXRlIHNlbGYgcmVjdXJzaW9uXG4gICAgYWN0aXZlU3ViICE9PSB0aGlzKSB7XG4gICAgICBiYXRjaCh0aGlzLCB0cnVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkgO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCBsaW5rID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHRoaXMuZGVwLnRyYWNrKHtcbiAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgIHR5cGU6IFwiZ2V0XCIsXG4gICAgICBrZXk6IFwidmFsdWVcIlxuICAgIH0pIDogdGhpcy5kZXAudHJhY2soKTtcbiAgICByZWZyZXNoQ29tcHV0ZWQodGhpcyk7XG4gICAgaWYgKGxpbmspIHtcbiAgICAgIGxpbmsudmVyc2lvbiA9IHRoaXMuZGVwLnZlcnNpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICBpZiAodGhpcy5zZXR0ZXIpIHtcbiAgICAgIHRoaXMuc2V0dGVyKG5ld1ZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXCJXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCB2YWx1ZSBpcyByZWFkb25seVwiKTtcbiAgICB9XG4gIH1cbn1cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgc2V0dGVyO1xuICBpZiAoaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucy5nZXQ7XG4gICAgc2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLnNldDtcbiAgfVxuICBjb25zdCBjUmVmID0gbmV3IENvbXB1dGVkUmVmSW1wbChnZXR0ZXIsIHNldHRlciwgaXNTU1IpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBkZWJ1Z09wdGlvbnMgJiYgIWlzU1NSKSB7XG4gICAgY1JlZi5vblRyYWNrID0gZGVidWdPcHRpb25zLm9uVHJhY2s7XG4gICAgY1JlZi5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5jb25zdCBUcmFja09wVHlwZXMgPSB7XG4gIFwiR0VUXCI6IFwiZ2V0XCIsXG4gIFwiSEFTXCI6IFwiaGFzXCIsXG4gIFwiSVRFUkFURVwiOiBcIml0ZXJhdGVcIlxufTtcbmNvbnN0IFRyaWdnZXJPcFR5cGVzID0ge1xuICBcIlNFVFwiOiBcInNldFwiLFxuICBcIkFERFwiOiBcImFkZFwiLFxuICBcIkRFTEVURVwiOiBcImRlbGV0ZVwiLFxuICBcIkNMRUFSXCI6IFwiY2xlYXJcIlxufTtcbmNvbnN0IFJlYWN0aXZlRmxhZ3MgPSB7XG4gIFwiU0tJUFwiOiBcIl9fdl9za2lwXCIsXG4gIFwiSVNfUkVBQ1RJVkVcIjogXCJfX3ZfaXNSZWFjdGl2ZVwiLFxuICBcIklTX1JFQURPTkxZXCI6IFwiX192X2lzUmVhZG9ubHlcIixcbiAgXCJJU19TSEFMTE9XXCI6IFwiX192X2lzU2hhbGxvd1wiLFxuICBcIlJBV1wiOiBcIl9fdl9yYXdcIixcbiAgXCJJU19SRUZcIjogXCJfX3ZfaXNSZWZcIlxufTtcblxuY29uc3QgV2F0Y2hFcnJvckNvZGVzID0ge1xuICBcIldBVENIX0dFVFRFUlwiOiAyLFxuICBcIjJcIjogXCJXQVRDSF9HRVRURVJcIixcbiAgXCJXQVRDSF9DQUxMQkFDS1wiOiAzLFxuICBcIjNcIjogXCJXQVRDSF9DQUxMQkFDS1wiLFxuICBcIldBVENIX0NMRUFOVVBcIjogNCxcbiAgXCI0XCI6IFwiV0FUQ0hfQ0xFQU5VUFwiXG59O1xuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG5jb25zdCBjbGVhbnVwTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5sZXQgYWN0aXZlV2F0Y2hlciA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldEN1cnJlbnRXYXRjaGVyKCkge1xuICByZXR1cm4gYWN0aXZlV2F0Y2hlcjtcbn1cbmZ1bmN0aW9uIG9uV2F0Y2hlckNsZWFudXAoY2xlYW51cEZuLCBmYWlsU2lsZW50bHkgPSBmYWxzZSwgb3duZXIgPSBhY3RpdmVXYXRjaGVyKSB7XG4gIGlmIChvd25lcikge1xuICAgIGxldCBjbGVhbnVwcyA9IGNsZWFudXBNYXAuZ2V0KG93bmVyKTtcbiAgICBpZiAoIWNsZWFudXBzKSBjbGVhbnVwTWFwLnNldChvd25lciwgY2xlYW51cHMgPSBbXSk7XG4gICAgY2xlYW51cHMucHVzaChjbGVhbnVwRm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWZhaWxTaWxlbnRseSkge1xuICAgIHdhcm4oXG4gICAgICBgb25XYXRjaGVyQ2xlYW51cCgpIHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gYWN0aXZlIHdhdGNoZXIgdG8gYXNzb2NpYXRlIHdpdGguYFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgeyBpbW1lZGlhdGUsIGRlZXAsIG9uY2UsIHNjaGVkdWxlciwgYXVnbWVudEpvYiwgY2FsbCB9ID0gb3B0aW9ucztcbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIChvcHRpb25zLm9uV2FybiB8fCB3YXJuKShcbiAgICAgIGBJbnZhbGlkIHdhdGNoIHNvdXJjZTogYCxcbiAgICAgIHMsXG4gICAgICBgQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLmBcbiAgICApO1xuICB9O1xuICBjb25zdCByZWFjdGl2ZUdldHRlciA9IChzb3VyY2UyKSA9PiB7XG4gICAgaWYgKGRlZXApIHJldHVybiBzb3VyY2UyO1xuICAgIGlmIChpc1NoYWxsb3coc291cmNlMikgfHwgZGVlcCA9PT0gZmFsc2UgfHwgZGVlcCA9PT0gMClcbiAgICAgIHJldHVybiB0cmF2ZXJzZShzb3VyY2UyLCAxKTtcbiAgICByZXR1cm4gdHJhdmVyc2Uoc291cmNlMik7XG4gIH07XG4gIGxldCBlZmZlY3Q7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBjbGVhbnVwO1xuICBsZXQgYm91bmRDbGVhbnVwO1xuICBsZXQgZm9yY2VUcmlnZ2VyID0gZmFsc2U7XG4gIGxldCBpc011bHRpU291cmNlID0gZmFsc2U7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLnZhbHVlO1xuICAgIGZvcmNlVHJpZ2dlciA9IGlzU2hhbGxvdyhzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3cocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVHZXR0ZXIocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGwgPyBjYWxsKHMsIDIpIDogcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuSW52YWxpZFNvdXJjZShzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGdldHRlciA9IGNhbGwgPyAoKSA9PiBjYWxsKHNvdXJjZSwgMikgOiBzb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gYWN0aXZlV2F0Y2hlcjtcbiAgICAgICAgYWN0aXZlV2F0Y2hlciA9IGVmZmVjdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gY2FsbCA/IGNhbGwoc291cmNlLCAzLCBbYm91bmRDbGVhbnVwXSkgOiBzb3VyY2UoYm91bmRDbGVhbnVwKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVXYXRjaGVyID0gY3VycmVudEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gTk9PUDtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gIH1cbiAgaWYgKGNiICYmIGRlZXApIHtcbiAgICBjb25zdCBiYXNlR2V0dGVyID0gZ2V0dGVyO1xuICAgIGNvbnN0IGRlcHRoID0gZGVlcCA9PT0gdHJ1ZSA/IEluZmluaXR5IDogZGVlcDtcbiAgICBnZXR0ZXIgPSAoKSA9PiB0cmF2ZXJzZShiYXNlR2V0dGVyKCksIGRlcHRoKTtcbiAgfVxuICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRTY29wZSgpO1xuICBjb25zdCB3YXRjaEhhbmRsZSA9ICgpID0+IHtcbiAgICBlZmZlY3Quc3RvcCgpO1xuICAgIGlmIChzY29wZSAmJiBzY29wZS5hY3RpdmUpIHtcbiAgICAgIHJlbW92ZShzY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9uY2UgJiYgY2IpIHtcbiAgICBjb25zdCBfY2IgPSBjYjtcbiAgICBjYiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBfY2IoLi4uYXJncyk7XG4gICAgICB3YXRjaEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9XG4gIGxldCBvbGRWYWx1ZSA9IGlzTXVsdGlTb3VyY2UgPyBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCkuZmlsbChJTklUSUFMX1dBVENIRVJfVkFMVUUpIDogSU5JVElBTF9XQVRDSEVSX1ZBTFVFO1xuICBjb25zdCBqb2IgPSAoaW1tZWRpYXRlRmlyc3RSdW4pID0+IHtcbiAgICBpZiAoIShlZmZlY3QuZmxhZ3MgJiAxKSB8fCAhZWZmZWN0LmRpcnR5ICYmICFpbW1lZGlhdGVGaXJzdFJ1bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2IpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgICAgaWYgKGltbWVkaWF0ZUZpcnN0UnVuIHx8IGRlZXAgfHwgZm9yY2VUcmlnZ2VyIHx8IChpc011bHRpU291cmNlID8gbmV3VmFsdWUuc29tZSgodiwgaSkgPT4gaGFzQ2hhbmdlZCh2LCBvbGRWYWx1ZVtpXSkpIDogaGFzQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpKSkge1xuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50V2F0Y2hlciA9IGFjdGl2ZVdhdGNoZXI7XG4gICAgICAgIGFjdGl2ZVdhdGNoZXIgPSBlZmZlY3Q7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IFtcbiAgICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgICAgLy8gcGFzcyB1bmRlZmluZWQgYXMgdGhlIG9sZCB2YWx1ZSB3aGVuIGl0J3MgY2hhbmdlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICAgIG9sZFZhbHVlID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyB2b2lkIDAgOiBpc011bHRpU291cmNlICYmIG9sZFZhbHVlWzBdID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyBbXSA6IG9sZFZhbHVlLFxuICAgICAgICAgICAgYm91bmRDbGVhbnVwXG4gICAgICAgICAgXTtcbiAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgIGNhbGwgPyBjYWxsKGNiLCAzLCBhcmdzKSA6IChcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNiKC4uLmFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVXYXRjaGVyID0gY3VycmVudFdhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfTtcbiAgaWYgKGF1Z21lbnRKb2IpIHtcbiAgICBhdWdtZW50Sm9iKGpvYik7XG4gIH1cbiAgZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGdldHRlcik7XG4gIGVmZmVjdC5zY2hlZHVsZXIgPSBzY2hlZHVsZXIgPyAoKSA9PiBzY2hlZHVsZXIoam9iLCBmYWxzZSkgOiBqb2I7XG4gIGJvdW5kQ2xlYW51cCA9IChmbikgPT4gb25XYXRjaGVyQ2xlYW51cChmbiwgZmFsc2UsIGVmZmVjdCk7XG4gIGNsZWFudXAgPSBlZmZlY3Qub25TdG9wID0gKCkgPT4ge1xuICAgIGNvbnN0IGNsZWFudXBzID0gY2xlYW51cE1hcC5nZXQoZWZmZWN0KTtcbiAgICBpZiAoY2xlYW51cHMpIHtcbiAgICAgIGlmIChjYWxsKSB7XG4gICAgICAgIGNhbGwoY2xlYW51cHMsIDQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBjbGVhbnVwMiBvZiBjbGVhbnVwcykgY2xlYW51cDIoKTtcbiAgICAgIH1cbiAgICAgIGNsZWFudXBNYXAuZGVsZXRlKGVmZmVjdCk7XG4gICAgfVxuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGVmZmVjdC5vblRyYWNrID0gb3B0aW9ucy5vblRyYWNrO1xuICAgIGVmZmVjdC5vblRyaWdnZXIgPSBvcHRpb25zLm9uVHJpZ2dlcjtcbiAgfVxuICBpZiAoY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBqb2IodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9sZFZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzY2hlZHVsZXIpIHtcbiAgICBzY2hlZHVsZXIoam9iLmJpbmQobnVsbCwgdHJ1ZSksIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5ydW4oKTtcbiAgfVxuICB3YXRjaEhhbmRsZS5wYXVzZSA9IGVmZmVjdC5wYXVzZS5iaW5kKGVmZmVjdCk7XG4gIHdhdGNoSGFuZGxlLnJlc3VtZSA9IGVmZmVjdC5yZXN1bWUuYmluZChlZmZlY3QpO1xuICB3YXRjaEhhbmRsZS5zdG9wID0gd2F0Y2hIYW5kbGU7XG4gIHJldHVybiB3YXRjaEhhbmRsZTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKHZhbHVlLCBkZXB0aCA9IEluZmluaXR5LCBzZWVuKSB7XG4gIGlmIChkZXB0aCA8PSAwIHx8ICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbXCJfX3Zfc2tpcFwiXSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBpZiAoKHNlZW4uZ2V0KHZhbHVlKSB8fCAwKSA+PSBkZXB0aCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuLnNldCh2YWx1ZSwgZGVwdGgpO1xuICBkZXB0aC0tO1xuICBpZiAoaXNSZWYodmFsdWUpKSB7XG4gICAgdHJhdmVyc2UodmFsdWUudmFsdWUsIGRlcHRoLCBzZWVuKTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlW2ldLCBkZXB0aCwgc2Vlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSB8fCBpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICB0cmF2ZXJzZSh2LCBkZXB0aCwgc2Vlbik7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgdHJhdmVyc2UodmFsdWVba2V5XSwgZGVwdGgsIHNlZW4pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHZhbHVlKSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBkZXB0aCwgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgQVJSQVlfSVRFUkFURV9LRVksIEVmZmVjdEZsYWdzLCBFZmZlY3RTY29wZSwgSVRFUkFURV9LRVksIE1BUF9LRVlfSVRFUkFURV9LRVksIFJlYWN0aXZlRWZmZWN0LCBSZWFjdGl2ZUZsYWdzLCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBXYXRjaEVycm9yQ29kZXMsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGdldEN1cnJlbnRXYXRjaGVyLCBpc1Byb3h5LCBpc1JlYWN0aXZlLCBpc1JlYWRvbmx5LCBpc1JlZiwgaXNTaGFsbG93LCBtYXJrUmF3LCBvbkVmZmVjdENsZWFudXAsIG9uU2NvcGVEaXNwb3NlLCBvbldhdGNoZXJDbGVhbnVwLCBwYXVzZVRyYWNraW5nLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFjdGl2ZVJlYWRBcnJheSwgcmVhZG9ubHksIHJlZiwgcmVzZXRUcmFja2luZywgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZEFycmF5LCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlYWN0aXZlLCB0b1JlYWRvbmx5LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmFjaywgdHJhdmVyc2UsIHRyaWdnZXIsIHRyaWdnZXJSZWYsIHVucmVmLCB3YXRjaCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1jb3JlIHYzLjUuNDNcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IHBhdXNlVHJhY2tpbmcsIHJlc2V0VHJhY2tpbmcsIGlzUmVmLCB0b1JhdywgdHJhdmVyc2UsIHdhdGNoIGFzIHdhdGNoJDEsIHNoYWxsb3dSZWYsIHJlYWRvbmx5LCBpc1JlYWN0aXZlLCByZWYsIGlzU2hhbGxvdywgaXNSZWFkb25seSwgc2hhbGxvd1JlYWRBcnJheSwgdG9SZWFkb25seSwgdG9SZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIGN1c3RvbVJlZiwgc2hhbGxvd1JlYWN0aXZlLCB0cmlnZ2VyLCBSZWFjdGl2ZUVmZmVjdCwgaXNQcm94eSwgcHJveHlSZWZzLCBtYXJrUmF3LCBFZmZlY3RTY29wZSwgY29tcHV0ZWQgYXMgY29tcHV0ZWQkMSB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5leHBvcnQgeyBFZmZlY3RTY29wZSwgUmVhY3RpdmVFZmZlY3QsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIGN1c3RvbVJlZiwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudFNjb3BlLCBnZXRDdXJyZW50V2F0Y2hlciwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIG9uV2F0Y2hlckNsZWFudXAsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJpZ2dlclJlZiwgdW5yZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRnVuY3Rpb24sIEVNUFRZX09CSiwgaXNQcm9taXNlLCBpc0FycmF5LCBOT09QLCBnZXRHbG9iYWxUaGlzLCBleHRlbmQsIGlzQnVpbHRJbkRpcmVjdGl2ZSwgTk8sIGhhc093biwgcmVtb3ZlLCBkZWYsIGlzT24sIGlzUmVzZXJ2ZWRQcm9wLCBub3JtYWxpemVDbGFzcywgc3RyaW5naWZ5U3R5bGUsIG5vcm1hbGl6ZVN0eWxlLCBpc0tub3duU3ZnQXR0ciwgaXNCb29sZWFuQXR0ciwgaXNLbm93bkh0bWxBdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzUmVuZGVyYWJsZUF0dHJWYWx1ZSwgbm9ybWFsaXplQ3NzVmFyVmFsdWUsIGdldEVzY2FwZWRDc3NWYXJOYW1lLCBpc09iamVjdCwgaXNSZWdFeHAsIGludm9rZUFycmF5Rm5zLCB0b0hhbmRsZXJLZXksIGNhbWVsaXplLCBjYXBpdGFsaXplLCBpc1N5bWJvbCwgaXNHbG9iYWxseUFsbG93ZWQsIGh5cGhlbmF0ZSwgaGFzQ2hhbmdlZCwgbG9vc2VUb051bWJlciwgaXNNb2RlbExpc3RlbmVyLCBsb29zZUVxdWFsLCBFTVBUWV9BUlIsIHRvUmF3VHlwZSwgbWFrZU1hcCwgdG9OdW1iZXIgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgbm9ybWFsaXplQ2xhc3MsIG5vcm1hbGl6ZVByb3BzLCBub3JtYWxpemVTdHlsZSwgdG9EaXNwbGF5U3RyaW5nLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN0YWNrID0gW107XG5mdW5jdGlvbiBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUpIHtcbiAgc3RhY2sucHVzaCh2bm9kZSk7XG59XG5mdW5jdGlvbiBwb3BXYXJuaW5nQ29udGV4dCgpIHtcbiAgc3RhY2sucG9wKCk7XG59XG5sZXQgaXNXYXJuaW5nID0gZmFsc2U7XG5mdW5jdGlvbiB3YXJuJDEobXNnLCAuLi5hcmdzKSB7XG4gIGlmIChpc1dhcm5pbmcpIHJldHVybjtcbiAgaXNXYXJuaW5nID0gdHJ1ZTtcbiAgcGF1c2VUcmFja2luZygpO1xuICBjb25zdCBpbnN0YW5jZSA9IHN0YWNrLmxlbmd0aCA/IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLmNvbXBvbmVudCA6IG51bGw7XG4gIGNvbnN0IGFwcFdhcm5IYW5kbGVyID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcud2FybkhhbmRsZXI7XG4gIGNvbnN0IHRyYWNlID0gZ2V0Q29tcG9uZW50VHJhY2UoKTtcbiAgaWYgKGFwcFdhcm5IYW5kbGVyKSB7XG4gICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgYXBwV2FybkhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDExLFxuICAgICAgW1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgbXNnICsgYXJncy5tYXAoKGEpID0+IHtcbiAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSBhLnRvU3RyaW5nKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChhKSkgIT0gbnVsbCA/IF9iIDogSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgIH0pLmpvaW4oXCJcIiksXG4gICAgICAgIGluc3RhbmNlICYmIGluc3RhbmNlLnByb3h5LFxuICAgICAgICB0cmFjZS5tYXAoXG4gICAgICAgICAgKHsgdm5vZGUgfSkgPT4gYGF0IDwke2Zvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIHZub2RlLnR5cGUpfT5gXG4gICAgICAgICkuam9pbihcIlxcblwiKSxcbiAgICAgICAgdHJhY2VcbiAgICAgIF1cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHdhcm5BcmdzID0gW2BbVnVlIHdhcm5dOiAke21zZ31gLCAuLi5hcmdzXTtcbiAgICBpZiAodHJhY2UubGVuZ3RoICYmIC8vIGF2b2lkIHNwYW1taW5nIGNvbnNvbGUgZHVyaW5nIHRlc3RzXG4gICAgdHJ1ZSkge1xuICAgICAgd2FybkFyZ3MucHVzaChgXG5gLCAuLi5mb3JtYXRUcmFjZSh0cmFjZSkpO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oLi4ud2FybkFyZ3MpO1xuICB9XG4gIHJlc2V0VHJhY2tpbmcoKTtcbiAgaXNXYXJuaW5nID0gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUcmFjZSgpIHtcbiAgbGV0IGN1cnJlbnRWTm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRWTm9kZSkge1xuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgaWYgKGxhc3QgJiYgbGFzdC52bm9kZSA9PT0gY3VycmVudFZOb2RlKSB7XG4gICAgICBsYXN0LnJlY3Vyc2VDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkU3RhY2sucHVzaCh7XG4gICAgICAgIHZub2RlOiBjdXJyZW50Vk5vZGUsXG4gICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gY3VycmVudFZOb2RlLmNvbXBvbmVudCAmJiBjdXJyZW50Vk5vZGUuY29tcG9uZW50LnBhcmVudDtcbiAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZFN0YWNrO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2UodHJhY2UpIHtcbiAgY29uc3QgbG9ncyA9IFtdO1xuICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5pID09PSAwID8gW10gOiBbYFxuYF0sIC4uLmZvcm1hdFRyYWNlRW50cnkoZW50cnkpKTtcbiAgfSk7XG4gIHJldHVybiBsb2dzO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2VFbnRyeSh7IHZub2RlLCByZWN1cnNlQ291bnQgfSkge1xuICBjb25zdCBwb3N0Zml4ID0gcmVjdXJzZUNvdW50ID4gMCA/IGAuLi4gKCR7cmVjdXJzZUNvdW50fSByZWN1cnNpdmUgY2FsbHMpYCA6IGBgO1xuICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgY29uc3Qgb3BlbiA9IGAgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICB2bm9kZS5jb21wb25lbnQsXG4gICAgdm5vZGUudHlwZSxcbiAgICBpc1Jvb3RcbiAgKX1gO1xuICBjb25zdCBjbG9zZSA9IGA+YCArIHBvc3RmaXg7XG4gIHJldHVybiB2bm9kZS5wcm9wcyA/IFtvcGVuLCAuLi5mb3JtYXRQcm9wcyh2bm9kZS5wcm9wcyksIGNsb3NlXSA6IFtvcGVuICsgY2xvc2VdO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcHMocHJvcHMpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gIGtleXMuc2xpY2UoMCwgMykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzLnB1c2goLi4uZm9ybWF0UHJvcChrZXksIHByb3BzW2tleV0pKTtcbiAgfSk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDMpIHtcbiAgICByZXMucHVzaChgIC4uLmApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wKGtleSwgdmFsdWUsIHJhdykge1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PVJlZjxgLCB2YWx1ZSwgYD5gXTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROdW1iZXIodmFsLCB0eXBlKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkgcmV0dXJuO1xuICBpZiAodmFsID09PSB2b2lkIDApIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCAhPT0gXCJudW1iZXJcIikge1xuICAgIHdhcm4kMShgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfS5gKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIE5hTiAtIHRoZSBkdXJhdGlvbiBleHByZXNzaW9uIG1pZ2h0IGJlIGluY29ycmVjdC5gKTtcbiAgfVxufVxuXG5jb25zdCBFcnJvckNvZGVzID0ge1xuICBcIlNFVFVQX0ZVTkNUSU9OXCI6IDAsXG4gIFwiMFwiOiBcIlNFVFVQX0ZVTkNUSU9OXCIsXG4gIFwiUkVOREVSX0ZVTkNUSU9OXCI6IDEsXG4gIFwiMVwiOiBcIlJFTkRFUl9GVU5DVElPTlwiLFxuICBcIk5BVElWRV9FVkVOVF9IQU5ETEVSXCI6IDUsXG4gIFwiNVwiOiBcIk5BVElWRV9FVkVOVF9IQU5ETEVSXCIsXG4gIFwiQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJcIjogNixcbiAgXCI2XCI6IFwiQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJWTk9ERV9IT09LXCI6IDcsXG4gIFwiN1wiOiBcIlZOT0RFX0hPT0tcIixcbiAgXCJESVJFQ1RJVkVfSE9PS1wiOiA4LFxuICBcIjhcIjogXCJESVJFQ1RJVkVfSE9PS1wiLFxuICBcIlRSQU5TSVRJT05fSE9PS1wiOiA5LFxuICBcIjlcIjogXCJUUkFOU0lUSU9OX0hPT0tcIixcbiAgXCJBUFBfRVJST1JfSEFORExFUlwiOiAxMCxcbiAgXCIxMFwiOiBcIkFQUF9FUlJPUl9IQU5ETEVSXCIsXG4gIFwiQVBQX1dBUk5fSEFORExFUlwiOiAxMSxcbiAgXCIxMVwiOiBcIkFQUF9XQVJOX0hBTkRMRVJcIixcbiAgXCJGVU5DVElPTl9SRUZcIjogMTIsXG4gIFwiMTJcIjogXCJGVU5DVElPTl9SRUZcIixcbiAgXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCI6IDEzLFxuICBcIjEzXCI6IFwiQVNZTkNfQ09NUE9ORU5UX0xPQURFUlwiLFxuICBcIlNDSEVEVUxFUlwiOiAxNCxcbiAgXCIxNFwiOiBcIlNDSEVEVUxFUlwiLFxuICBcIkNPTVBPTkVOVF9VUERBVEVcIjogMTUsXG4gIFwiMTVcIjogXCJDT01QT05FTlRfVVBEQVRFXCIsXG4gIFwiQVBQX1VOTU9VTlRfQ0xFQU5VUFwiOiAxNixcbiAgXCIxNlwiOiBcIkFQUF9VTk1PVU5UX0NMRUFOVVBcIlxufTtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MkMSA9IHtcbiAgW1wic3BcIl06IFwic2VydmVyUHJlZmV0Y2ggaG9va1wiLFxuICBbXCJiY1wiXTogXCJiZWZvcmVDcmVhdGUgaG9va1wiLFxuICBbXCJjXCJdOiBcImNyZWF0ZWQgaG9va1wiLFxuICBbXCJibVwiXTogXCJiZWZvcmVNb3VudCBob29rXCIsXG4gIFtcIm1cIl06IFwibW91bnRlZCBob29rXCIsXG4gIFtcImJ1XCJdOiBcImJlZm9yZVVwZGF0ZSBob29rXCIsXG4gIFtcInVcIl06IFwidXBkYXRlZFwiLFxuICBbXCJidW1cIl06IFwiYmVmb3JlVW5tb3VudCBob29rXCIsXG4gIFtcInVtXCJdOiBcInVubW91bnRlZCBob29rXCIsXG4gIFtcImFcIl06IFwiYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZGFcIl06IFwiZGVhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJlY1wiXTogXCJlcnJvckNhcHR1cmVkIGhvb2tcIixcbiAgW1wicnRjXCJdOiBcInJlbmRlclRyYWNrZWQgaG9va1wiLFxuICBbXCJydGdcIl06IFwicmVuZGVyVHJpZ2dlcmVkIGhvb2tcIixcbiAgWzBdOiBcInNldHVwIGZ1bmN0aW9uXCIsXG4gIFsxXTogXCJyZW5kZXIgZnVuY3Rpb25cIixcbiAgWzJdOiBcIndhdGNoZXIgZ2V0dGVyXCIsXG4gIFszXTogXCJ3YXRjaGVyIGNhbGxiYWNrXCIsXG4gIFs0XTogXCJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb25cIixcbiAgWzVdOiBcIm5hdGl2ZSBldmVudCBoYW5kbGVyXCIsXG4gIFs2XTogXCJjb21wb25lbnQgZXZlbnQgaGFuZGxlclwiLFxuICBbN106IFwidm5vZGUgaG9va1wiLFxuICBbOF06IFwiZGlyZWN0aXZlIGhvb2tcIixcbiAgWzldOiBcInRyYW5zaXRpb24gaG9va1wiLFxuICBbMTBdOiBcImFwcCBlcnJvckhhbmRsZXJcIixcbiAgWzExXTogXCJhcHAgd2FybkhhbmRsZXJcIixcbiAgWzEyXTogXCJyZWYgZnVuY3Rpb25cIixcbiAgWzEzXTogXCJhc3luYyBjb21wb25lbnQgbG9hZGVyXCIsXG4gIFsxNF06IFwic2NoZWR1bGVyIGZsdXNoXCIsXG4gIFsxNV06IFwiY29tcG9uZW50IHVwZGF0ZVwiLFxuICBbMTZdOiBcImFwcCB1bm1vdW50IGNsZWFudXAgZnVuY3Rpb25cIlxufTtcbmZ1bmN0aW9uIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXJncyA/IGZuKC4uLmFyZ3MpIDogZm4oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICBpZiAoaXNGdW5jdGlvbihmbikpIHtcbiAgICBjb25zdCByZXMgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKTtcbiAgICBpZiAocmVzICYmIGlzUHJvbWlzZShyZXMpKSB7XG4gICAgICByZXMuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChpc0FycmF5KGZuKSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlcy5wdXNoKGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuW2ldLCBpbnN0YW5jZSwgdHlwZSwgYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgSW52YWxpZCB2YWx1ZSB0eXBlIHBhc3NlZCB0byBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZygpOiAke3R5cGVvZiBmbn1gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSwgdGhyb3dJbkRldiA9IHRydWUpIHtcbiAgY29uc3QgY29udGV4dFZOb2RlID0gaW5zdGFuY2UgPyBpbnN0YW5jZS52bm9kZSA6IG51bGw7XG4gIGNvbnN0IHsgZXJyb3JIYW5kbGVyLCB0aHJvd1VuaGFuZGxlZEVycm9ySW5Qcm9kdWN0aW9uIH0gPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyB8fCBFTVBUWV9PQko7XG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGxldCBjdXIgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gICAgY29uc3QgZXhwb3NlZEluc3RhbmNlID0gaW5zdGFuY2UucHJveHk7XG4gICAgY29uc3QgZXJyb3JJbmZvID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXSA6IGBodHRwczovL3Z1ZWpzLm9yZy9lcnJvci1yZWZlcmVuY2UvI3J1bnRpbWUtJHt0eXBlfWA7XG4gICAgd2hpbGUgKGN1cikge1xuICAgICAgY29uc3QgZXJyb3JDYXB0dXJlZEhvb2tzID0gY3VyLmVjO1xuICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yQ2FwdHVyZWRIb29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3NbaV0oZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mbykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXIgPSBjdXIucGFyZW50O1xuICAgIH1cbiAgICBpZiAoZXJyb3JIYW5kbGVyKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZXJyb3JIYW5kbGVyLCBudWxsLCAxMCwgW1xuICAgICAgICBlcnIsXG4gICAgICAgIGV4cG9zZWRJbnN0YW5jZSxcbiAgICAgICAgZXJyb3JJbmZvXG4gICAgICBdKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYsIHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb24pO1xufVxuZnVuY3Rpb24gbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYgPSB0cnVlLCB0aHJvd0luUHJvZCA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoY29udGV4dFZOb2RlKTtcbiAgICB9XG4gICAgd2FybiQxKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRocm93SW5Qcm9kKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAtMTtcbmNvbnN0IHBlbmRpbmdQb3N0Rmx1c2hDYnMgPSBbXTtcbmxldCBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xubGV0IHBvc3RGbHVzaEluZGV4ID0gMDtcbmNvbnN0IHJlc29sdmVkUHJvbWlzZSA9IC8qIEBfX1BVUkVfXyAqLyBQcm9taXNlLnJlc29sdmUoKTtcbmxldCBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbmNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwMDtcbmZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gIGNvbnN0IHAgPSBjdXJyZW50Rmx1c2hQcm9taXNlIHx8IHJlc29sdmVkUHJvbWlzZTtcbiAgcmV0dXJuIGZuID8gcC50aGVuKHRoaXMgPyBmbi5iaW5kKHRoaXMpIDogZm4pIDogcDtcbn1cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25JbmRleChpZCkge1xuICBsZXQgc3RhcnQgPSBmbHVzaEluZGV4ICsgMTtcbiAgbGV0IGVuZCA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyBlbmQgPj4+IDE7XG4gICAgY29uc3QgbWlkZGxlSm9iID0gcXVldWVbbWlkZGxlXTtcbiAgICBjb25zdCBtaWRkbGVKb2JJZCA9IGdldElkKG1pZGRsZUpvYik7XG4gICAgaWYgKG1pZGRsZUpvYklkIDwgaWQgfHwgbWlkZGxlSm9iSWQgPT09IGlkICYmIG1pZGRsZUpvYi5mbGFncyAmIDIpIHtcbiAgICAgIHN0YXJ0ID0gbWlkZGxlICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gbWlkZGxlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhcnQ7XG59XG5mdW5jdGlvbiBxdWV1ZUpvYihqb2IpIHtcbiAgaWYgKCEoam9iLmZsYWdzICYgMSkpIHtcbiAgICBjb25zdCBqb2JJZCA9IGdldElkKGpvYik7XG4gICAgY29uc3QgbGFzdEpvYiA9IHF1ZXVlW3F1ZXVlLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdEpvYiB8fCAvLyBmYXN0IHBhdGggd2hlbiB0aGUgam9iIGlkIGlzIGxhcmdlciB0aGFuIHRoZSB0YWlsXG4gICAgIShqb2IuZmxhZ3MgJiAyKSAmJiBqb2JJZCA+PSBnZXRJZChsYXN0Sm9iKSkge1xuICAgICAgcXVldWUucHVzaChqb2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZS5zcGxpY2UoZmluZEluc2VydGlvbkluZGV4KGpvYklkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgam9iLmZsYWdzIHw9IDE7XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWN1cnJlbnRGbHVzaFByb21pc2UpIHtcbiAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gcmVzb2x2ZWRQcm9taXNlLnRoZW4oZmx1c2hKb2JzKTtcbiAgfVxufVxuZnVuY3Rpb24gcXVldWVQb3N0Rmx1c2hDYihjYikge1xuICBpZiAoIWlzQXJyYXkoY2IpKSB7XG4gICAgaWYgKGFjdGl2ZVBvc3RGbHVzaENicyAmJiBjYi5pZCA9PT0gLTEpIHtcbiAgICAgIGFjdGl2ZVBvc3RGbHVzaENicy5zcGxpY2UocG9zdEZsdXNoSW5kZXggKyAxLCAwLCBjYik7XG4gICAgfSBlbHNlIGlmICghKGNiLmZsYWdzICYgMSkpIHtcbiAgICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMucHVzaChjYik7XG4gICAgICBjYi5mbGFncyB8PSAxO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNiLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLnB1c2goY2JbaV0pO1xuICAgIH1cbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gZmx1c2hJbmRleCArIDEpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjYiA9IHF1ZXVlW2ldO1xuICAgIGlmIChjYiAmJiBjYi5mbGFncyAmIDIpIHtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjYi5pZCAhPT0gaW5zdGFuY2UudWlkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgIGktLTtcbiAgICAgIGlmIChjYi5mbGFncyAmIDQpIHtcbiAgICAgICAgY2IuZmxhZ3MgJj0gLTI7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgICAgaWYgKCEoY2IuZmxhZ3MgJiA0KSkge1xuICAgICAgICBjYi5mbGFncyAmPSAtMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZHVwZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnB1c2goZGVkdXBlZFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGZvciAocG9zdEZsdXNoSW5kZXggPSAwOyBwb3N0Rmx1c2hJbmRleCA8IGFjdGl2ZVBvc3RGbHVzaENicy5sZW5ndGg7IHBvc3RGbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNiID0gYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBjYikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2IuZmxhZ3MgJiA0KSB7XG4gICAgICAgIGNiLmZsYWdzICY9IC0yO1xuICAgICAgfVxuICAgICAgaWYgKCEoY2IuZmxhZ3MgJiA4KSkgY2IoKTtcbiAgICAgIGNiLmZsYWdzICY9IC0yO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IGpvYi5mbGFncyAmIDIgPyAtMSA6IEluZmluaXR5IDogam9iLmlkO1xuZnVuY3Rpb24gZmx1c2hKb2JzKHNlZW4pIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGNvbnN0IGNoZWNrID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChqb2IpID0+IGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBqb2IpIDogTk9PUDtcbiAgdHJ5IHtcbiAgICBmb3IgKGZsdXNoSW5kZXggPSAwOyBmbHVzaEluZGV4IDwgcXVldWUubGVuZ3RoOyBmbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpvYiA9IHF1ZXVlW2ZsdXNoSW5kZXhdO1xuICAgICAgaWYgKGpvYiAmJiAhKGpvYi5mbGFncyAmIDgpKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrKGpvYikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoam9iLmZsYWdzICYgNCkge1xuICAgICAgICAgIGpvYi5mbGFncyAmPSB+MTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICAgICAgam9iLFxuICAgICAgICAgIGpvYi5pLFxuICAgICAgICAgIGpvYi5pID8gMTUgOiAxNFxuICAgICAgICApO1xuICAgICAgICBpZiAoIShqb2IuZmxhZ3MgJiA0KSkge1xuICAgICAgICAgIGpvYi5mbGFncyAmPSB+MTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmb3IgKDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgam9iLmZsYWdzICY9IC0yO1xuICAgICAgfVxuICAgIH1cbiAgICBmbHVzaEluZGV4ID0gLTE7XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICBpZiAocXVldWUubGVuZ3RoIHx8IHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgICBmbHVzaEpvYnMoc2Vlbik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgZm4pIHtcbiAgY29uc3QgY291bnQgPSBzZWVuLmdldChmbikgfHwgMDtcbiAgaWYgKGNvdW50ID4gUkVDVVJTSU9OX0xJTUlUKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBmbi5pO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZSAmJiBnZXRDb21wb25lbnROYW1lKGluc3RhbmNlLnR5cGUpO1xuICAgIGhhbmRsZUVycm9yKFxuICAgICAgYE1heGltdW0gcmVjdXJzaXZlIHVwZGF0ZXMgZXhjZWVkZWQke2NvbXBvbmVudE5hbWUgPyBgIGluIGNvbXBvbmVudCA8JHtjb21wb25lbnROYW1lfT5gIDogYGB9LiBUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLmAsXG4gICAgICBudWxsLFxuICAgICAgMTBcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNlZW4uc2V0KGZuLCBjb3VudCArIDEpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmxldCBpc0htclVwZGF0aW5nID0gZmFsc2U7XG5jb25zdCBzZXRIbXJVcGRhdGluZyA9ICh2KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGlzSG1yVXBkYXRpbmc7XG4gIH0gZmluYWxseSB7XG4gICAgaXNIbXJVcGRhdGluZyA9IHY7XG4gIH1cbn07XG5jb25zdCBobXJEaXJ0eUNvbXBvbmVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX0hNUl9SVU5USU1FX18gPSB7XG4gICAgY3JlYXRlUmVjb3JkOiB0cnlXcmFwKGNyZWF0ZVJlY29yZCksXG4gICAgcmVyZW5kZXI6IHRyeVdyYXAocmVyZW5kZXIpLFxuICAgIHJlbG9hZDogdHJ5V3JhcChyZWxvYWQpXG4gIH07XG59XG5jb25zdCBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZnVuY3Rpb24gcmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgY29uc3QgaWQgPSBpbnN0YW5jZS50eXBlLl9faG1ySWQ7XG4gIGxldCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICBjcmVhdGVSZWNvcmQoaWQsIGluc3RhbmNlLnR5cGUpO1xuICAgIHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICB9XG4gIHJlY29yZC5pbnN0YW5jZXMuYWRkKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgbWFwLmdldChpbnN0YW5jZS50eXBlLl9faG1ySWQpLmluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVjb3JkKGlkLCBpbml0aWFsRGVmKSB7XG4gIGlmIChtYXAuaGFzKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtYXAuc2V0KGlkLCB7XG4gICAgaW5pdGlhbERlZjogbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5pdGlhbERlZiksXG4gICAgaW5zdGFuY2VzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICByZXR1cm4gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50Ll9fdmNjT3B0cyA6IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIHJlcmVuZGVyKGlkLCBuZXdSZW5kZXIpIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlY29yZC5pbml0aWFsRGVmLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgWy4uLnJlY29yZC5pbnN0YW5jZXNdLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgaWYgKG5ld1JlbmRlcikge1xuICAgICAgaW5zdGFuY2UucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgICAgbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSkucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgIH1cbiAgICBpbnN0YW5jZS5yZW5kZXJDYWNoZSA9IFtdO1xuICAgIGlzSG1yVXBkYXRpbmcgPSB0cnVlO1xuICAgIGlmICghKGluc3RhbmNlLmpvYi5mbGFncyAmIDgpKSB7XG4gICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICB9XG4gICAgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbG9hZChpZCwgbmV3Q29tcCkge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHJldHVybjtcbiAgbmV3Q29tcCA9IG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KG5ld0NvbXApO1xuICB1cGRhdGVDb21wb25lbnREZWYocmVjb3JkLmluaXRpYWxEZWYsIG5ld0NvbXApO1xuICBjb25zdCBpbnN0YW5jZXMgPSBbLi4ucmVjb3JkLmluc3RhbmNlc107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07XG4gICAgY29uc3Qgb2xkQ29tcCA9IG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpO1xuICAgIGxldCBkaXJ0eUluc3RhbmNlcyA9IGhtckRpcnR5Q29tcG9uZW50cy5nZXQob2xkQ29tcCk7XG4gICAgaWYgKCFkaXJ0eUluc3RhbmNlcykge1xuICAgICAgaWYgKG9sZENvbXAgIT09IHJlY29yZC5pbml0aWFsRGVmKSB7XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKTtcbiAgICAgIH1cbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5zZXQob2xkQ29tcCwgZGlydHlJbnN0YW5jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTtcbiAgICB9XG4gICAgZGlydHlJbnN0YW5jZXMuYWRkKGluc3RhbmNlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnByb3BzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQuZW1pdHNDYWNoZS5kZWxldGUoaW5zdGFuY2UudHlwZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5vcHRpb25zQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGlmIChpbnN0YW5jZS5jZVJlbG9hZCkge1xuICAgICAgZGlydHlJbnN0YW5jZXMuYWRkKGluc3RhbmNlKTtcbiAgICAgIGluc3RhbmNlLmNlUmVsb2FkKG5ld0NvbXAuc3R5bGVzKTtcbiAgICAgIGRpcnR5SW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIHF1ZXVlSm9iKCgpID0+IHtcbiAgICAgICAgaWYgKCEoaW5zdGFuY2Uuam9iLmZsYWdzICYgOCkpIHtcbiAgICAgICAgICBpc0htclVwZGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQudXBkYXRlKCk7XG4gICAgICAgICAgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgICAgIGRpcnR5SW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQpIHtcbiAgICAgIGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbSE1SXSBSb290IG9yIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UgbW9kaWZpZWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uucm9vdC5jZSAmJiBpbnN0YW5jZSAhPT0gaW5zdGFuY2Uucm9vdCkge1xuICAgICAgaW5zdGFuY2Uucm9vdC5jZS5fcmVtb3ZlQ2hpbGRTdHlsZShvbGRDb21wKTtcbiAgICB9XG4gIH1cbiAgcXVldWVQb3N0Rmx1c2hDYigoKSA9PiB7XG4gICAgaG1yRGlydHlDb21wb25lbnRzLmNsZWFyKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApIHtcbiAgZXh0ZW5kKG9sZENvbXAsIG5ld0NvbXApO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDb21wKSB7XG4gICAgaWYgKGtleSAhPT0gXCJfX2ZpbGVcIiAmJiAhKGtleSBpbiBuZXdDb21wKSkge1xuICAgICAgZGVsZXRlIG9sZENvbXBba2V5XTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyeVdyYXAoZm4pIHtcbiAgcmV0dXJuIChpZCwgYXJnKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihpZCwgYXJnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBkZXZ0b29scyQxO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9IGVsc2UgaWYgKCFkZXZ0b29sc05vdEluc3RhbGxlZCkge1xuICAgIGJ1ZmZlci5wdXNoKHsgZXZlbnQsIGFyZ3MgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldERldnRvb2xzSG9vayQxKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyQxID0gaG9vaztcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzJDEuZW1pdChldmVudCwgLi4uYXJncykpO1xuICAgIGJ1ZmZlciA9IFtdO1xuICB9IGVsc2UgaWYgKFxuICAgIC8vIGhhbmRsZSBsYXRlIGRldnRvb2xzIGluamVjdGlvbiAtIG9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgaW4gYW4gYWN0dWFsXG4gICAgLy8gYnJvd3NlciBlbnZpcm9ubWVudCB0byBhdm9pZCB0aGUgdGltZXIgaGFuZGxlIHN0YWxsaW5nIHRlc3QgcnVubmVyIGV4aXRcbiAgICAvLyAoIzQ4MTUpXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvLyBzb21lIGVudnMgbW9jayB3aW5kb3cgYnV0IG5vdCBmdWxseVxuICAgIHdpbmRvdy5IVE1MRWxlbWVudCAmJiAvLyBhbHNvIGV4Y2x1ZGUganNkb21cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAhKChfYiA9IChfYSA9IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcImpzZG9tXCIpKVxuICApIHtcbiAgICBjb25zdCByZXBsYXkgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fIHx8IFtdO1xuICAgIHJlcGxheS5wdXNoKChuZXdIb29rKSA9PiB7XG4gICAgICBzZXREZXZ0b29sc0hvb2skMShuZXdIb29rLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFkZXZ0b29scyQxKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXCJjb21wb25lbnQ6YWRkZWRcIiAvKiBDT01QT05FTlRfQURERUQgKi8pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzJDEgJiYgdHlwZW9mIGRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIC8vIHJlbW92ZSB0aGUgY29tcG9uZW50IGlmIGl0IHdhc24ndCBidWZmZXJlZFxuICAhZGV2dG9vbHMkMS5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQpID0+IHtcbiAgICBlbWl0JDEoXG4gICAgICBob29rLFxuICAgICAgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLFxuICAgICAgY29tcG9uZW50LnVpZCxcbiAgICAgIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHZvaWQgMCxcbiAgICAgIGNvbXBvbmVudFxuICAgICk7XG4gIH07XG59XG5jb25zdCBkZXZ0b29sc1BlcmZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqLyk7XG5jb25zdCBkZXZ0b29sc1BlcmZFbmQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqLyk7XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhob29rKSB7XG4gIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgZW1pdCQxKGhvb2ssIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LnVpZCwgY29tcG9uZW50LCB0eXBlLCB0aW1lKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgZW1pdCQxKFxuICAgIFwiY29tcG9uZW50OmVtaXRcIiAvKiBDT01QT05FTlRfRU1JVCAqLyxcbiAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgY29tcG9uZW50LFxuICAgIGV2ZW50LFxuICAgIHBhcmFtc1xuICApO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpIHJldHVybiBmbjtcbiAgaWYgKGZuLl9uKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG4gIGNvbnN0IHJlbmRlckZuV2l0aENvbnRleHQgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICBzZXRCbG9ja1RyYWNraW5nKC0xKTtcbiAgICB9XG4gICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgY29uc3QgcHJldlN0YWNrU2l6ZSA9IGJsb2NrU3RhY2subGVuZ3RoO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGZuKC4uLmFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3IgKGxldCBpID0gYmxvY2tTdGFjay5sZW5ndGg7IGkgPiBwcmV2U3RhY2tTaXplOyBpLS0pIGNsb3NlQmxvY2soKTtcbiAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgc2V0QmxvY2tUcmFja2luZygxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fbiA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9kID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlckZuV2l0aENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKSB7XG4gIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICB3YXJuJDEoXCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogXCIgKyBuYW1lKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERpcmVjdGl2ZXModm5vZGUsIGRpcmVjdGl2ZXMpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGB3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLmApO1xuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGUoa2V5LCB2YWx1ZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmICghY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRJbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgIHdhcm4kMShgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBsZXQgcHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucHJvdmlkZXM7XG4gICAgY29uc3QgcGFyZW50UHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucGFyZW50ICYmIGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQucHJvdmlkZXM7XG4gICAgaWYgKHBhcmVudFByb3ZpZGVzID09PSBwcm92aWRlcykge1xuICAgICAgcHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucHJvdmlkZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFByb3ZpZGVzKTtcbiAgICB9XG4gICAgcHJvdmlkZXNba2V5XSA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBpbmplY3Qoa2V5LCBkZWZhdWx0VmFsdWUsIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSA9IGZhbHNlKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpbnN0YW5jZSB8fCBjdXJyZW50QXBwKSB7XG4gICAgbGV0IHByb3ZpZGVzID0gY3VycmVudEFwcCA/IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXMgOiBpbnN0YW5jZSA/IGluc3RhbmNlLnBhcmVudCA9PSBudWxsIHx8IGluc3RhbmNlLmNlID8gaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dCAmJiBpbnN0YW5jZS52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzIDogaW5zdGFuY2UucGFyZW50LnByb3ZpZGVzIDogdm9pZCAwO1xuICAgIGlmIChwcm92aWRlcyAmJiBrZXkgaW4gcHJvdmlkZXMpIHtcbiAgICAgIHJldHVybiBwcm92aWRlc1trZXldO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0cmVhdERlZmF1bHRBc0ZhY3RvcnkgJiYgaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlLmNhbGwoaW5zdGFuY2UgJiYgaW5zdGFuY2UucHJveHkpIDogZGVmYXVsdFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBpbmplY3Rpb24gXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgaW5qZWN0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKSBvciBmdW5jdGlvbmFsIGNvbXBvbmVudHMuYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0luamVjdGlvbkNvbnRleHQoKSB7XG4gIHJldHVybiAhIShnZXRDdXJyZW50SW5zdGFuY2UoKSB8fCBjdXJyZW50QXBwKTtcbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwidi1zY3hcIik7XG5jb25zdCB1c2VTU1JDb250ZXh0ID0gKCkgPT4ge1xuICB7XG4gICAgY29uc3QgY3R4ID0gaW5qZWN0KHNzckNvbnRleHRLZXkpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYFNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY3R4O1xuICB9XG59O1xuXG5mdW5jdGlvbiB3YXRjaEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHdhdGNoUG9zdEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJwb3N0XCIgfSkgOiB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaFN5bmNFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwic3luY1wiIH0pIDogeyBmbHVzaDogXCJzeW5jXCIgfVxuICApO1xufVxuZnVuY3Rpb24gd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihjYikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgXFxgd2F0Y2goZm4sIG9wdGlvbnM/KVxcYCBzaWduYXR1cmUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBBUEkuIFVzZSBcXGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pXFxgIGluc3RlYWQuIFxcYHdhdGNoXFxgIG5vdyBvbmx5IHN1cHBvcnRzIFxcYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkb1dhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgeyBpbW1lZGlhdGUsIGRlZXAsIGZsdXNoLCBvbmNlIH0gPSBvcHRpb25zO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJpbW1lZGlhdGVcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVlcCAhPT0gdm9pZCAwKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbmNlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJvbmNlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgYmFzZVdhdGNoT3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSBiYXNlV2F0Y2hPcHRpb25zLm9uV2FybiA9IHdhcm4kMTtcbiAgY29uc3QgcnVuc0ltbWVkaWF0ZWx5ID0gY2IgJiYgaW1tZWRpYXRlIHx8ICFjYiAmJiBmbHVzaCAhPT0gXCJwb3N0XCI7XG4gIGxldCBzc3JDbGVhbnVwO1xuICBpZiAoaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgaWYgKGZsdXNoID09PSBcInN5bmNcIikge1xuICAgICAgY29uc3QgY3R4ID0gdXNlU1NSQ29udGV4dCgpO1xuICAgICAgc3NyQ2xlYW51cCA9IGN0eC5fX3dhdGNoZXJIYW5kbGVzIHx8IChjdHguX193YXRjaGVySGFuZGxlcyA9IFtdKTtcbiAgICB9IGVsc2UgaWYgKCFydW5zSW1tZWRpYXRlbHkpIHtcbiAgICAgIGNvbnN0IHdhdGNoU3RvcEhhbmRsZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB3YXRjaFN0b3BIYW5kbGUuc3RvcCA9IE5PT1A7XG4gICAgICB3YXRjaFN0b3BIYW5kbGUucmVzdW1lID0gTk9PUDtcbiAgICAgIHdhdGNoU3RvcEhhbmRsZS5wYXVzZSA9IE5PT1A7XG4gICAgICByZXR1cm4gd2F0Y2hTdG9wSGFuZGxlO1xuICAgIH1cbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgYmFzZVdhdGNoT3B0aW9ucy5jYWxsID0gKGZuLCB0eXBlLCBhcmdzKSA9PiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpO1xuICBsZXQgaXNQcmUgPSBmYWxzZTtcbiAgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIGJhc2VXYXRjaE9wdGlvbnMuc2NoZWR1bGVyID0gKGpvYikgPT4ge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGpvYiwgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2UpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoZmx1c2ggIT09IFwic3luY1wiKSB7XG4gICAgaXNQcmUgPSB0cnVlO1xuICAgIGJhc2VXYXRjaE9wdGlvbnMuc2NoZWR1bGVyID0gKGpvYiwgaXNGaXJzdFJ1bikgPT4ge1xuICAgICAgaWYgKGlzRmlyc3RSdW4pIHtcbiAgICAgICAgam9iKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUpvYihqb2IpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgYmFzZVdhdGNoT3B0aW9ucy5hdWdtZW50Sm9iID0gKGpvYikgPT4ge1xuICAgIGlmIChjYikge1xuICAgICAgam9iLmZsYWdzIHw9IDQ7XG4gICAgfVxuICAgIGlmIChpc1ByZSkge1xuICAgICAgam9iLmZsYWdzIHw9IDI7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgam9iLmlkID0gaW5zdGFuY2UudWlkO1xuICAgICAgICBqb2IuaSA9IGluc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3Qgd2F0Y2hIYW5kbGUgPSB3YXRjaCQxKHNvdXJjZSwgY2IsIGJhc2VXYXRjaE9wdGlvbnMpO1xuICBpZiAoaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgaWYgKHNzckNsZWFudXApIHtcbiAgICAgIHNzckNsZWFudXAucHVzaCh3YXRjaEhhbmRsZSk7XG4gICAgfSBlbHNlIGlmIChydW5zSW1tZWRpYXRlbHkpIHtcbiAgICAgIHdhdGNoSGFuZGxlKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3YXRjaEhhbmRsZTtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgcmVzZXQoKTtcbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cblxuY29uc3QgcGVuZGluZ01vdW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgVGVsZXBvcnRFbmRLZXkgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKFwiX3Z0ZVwiKTtcbmNvbnN0IGlzVGVsZXBvcnQgPSAodHlwZSkgPT4gdHlwZS5fX2lzVGVsZXBvcnQ7XG5jb25zdCBpc1RlbGVwb3J0RGlzYWJsZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlZCA9PT0gXCJcIik7XG5jb25zdCBpc1RlbGVwb3J0RGVmZXJyZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kZWZlciB8fCBwcm9wcy5kZWZlciA9PT0gXCJcIik7XG5jb25zdCBpc1RhcmdldFNWRyA9ICh0YXJnZXQpID0+IHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG5jb25zdCBpc1RhcmdldE1hdGhNTCA9ICh0YXJnZXQpID0+IHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudDtcbmNvbnN0IHJlc29sdmVUYXJnZXQgPSAocHJvcHMsIHNlbGVjdCkgPT4ge1xuICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICBpZiAoaXNTdHJpbmcodGFyZ2V0U2VsZWN0b3IpKSB7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3QodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXRhcmdldCAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2NhdGUgVGVsZXBvcnQgdGFyZ2V0IHdpdGggc2VsZWN0b3IgXCIke3RhcmdldFNlbGVjdG9yfVwiLiBOb3RlIHRoZSB0YXJnZXQgZWxlbWVudCBtdXN0IGV4aXN0IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQgLSBpLmUuIHRoZSB0YXJnZXQgY2Fubm90IGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQgaXRzZWxmLCBhbmQgaWRlYWxseSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUgZW50aXJlIFZ1ZSBjb21wb25lbnQgdHJlZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0U2VsZWN0b3IgJiYgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRTZWxlY3RvcjtcbiAgfVxufTtcbmNvbnN0IFRlbGVwb3J0SW1wbCA9IHtcbiAgbmFtZTogXCJUZWxlcG9ydFwiLFxuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgaW50ZXJuYWxzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWM6IG1vdW50Q2hpbGRyZW4sXG4gICAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgICAgbzogeyBpbnNlcnQsIHF1ZXJ5U2VsZWN0b3IsIGNyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQsIHBhcmVudE5vZGUgfVxuICAgIH0gPSBpbnRlcm5hbHM7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjIucHJvcHMpO1xuICAgIGxldCB7IGR5bmFtaWNDaGlsZHJlbiB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtb3VudCA9ICh2bm9kZSwgY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbW91bnRUb1RhcmdldCA9ICh2bm9kZSA9IG4yKSA9PiB7XG4gICAgICBjb25zdCBkaXNhYmxlZDIgPSBpc1RlbGVwb3J0RGlzYWJsZWQodm5vZGUucHJvcHMpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdm5vZGUudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh2bm9kZS5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBwcmVwYXJlQW5jaG9yKHRhcmdldCwgdm5vZGUsIGNyZWF0ZVRleHQsIGluc2VydCk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2UgIT09IFwic3ZnXCIgJiYgaXNUYXJnZXRTVkcodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9PSBcIm1hdGhtbFwiICYmIGlzVGFyZ2V0TWF0aE1MKHRhcmdldCkpIHtcbiAgICAgICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LmlzQ0UpIHtcbiAgICAgICAgICAocGFyZW50Q29tcG9uZW50LmNlLl90ZWxlcG9ydFRhcmdldHMgfHwgKHBhcmVudENvbXBvbmVudC5jZS5fdGVsZXBvcnRUYXJnZXRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkpLmFkZCh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlzYWJsZWQyKSB7XG4gICAgICAgICAgbW91bnQodm5vZGUsIHRhcmdldCwgdGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICB1cGRhdGVDc3NWYXJzKHZub2RlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZGlzYWJsZWQyKSB7XG4gICAgICAgIHdhcm4kMShcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIG1vdW50OlwiLCB0YXJnZXQsIGAoJHt0eXBlb2YgdGFyZ2V0fSlgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHF1ZXVlUGVuZGluZ01vdW50ID0gKHZub2RlKSA9PiB7XG4gICAgICBjb25zdCBtb3VudEpvYiA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBlbmRpbmdNb3VudHMuZ2V0KHZub2RlKSAhPT0gbW91bnRKb2IpIHJldHVybjtcbiAgICAgICAgcGVuZGluZ01vdW50cy5kZWxldGUodm5vZGUpO1xuICAgICAgICBpZiAoaXNUZWxlcG9ydERpc2FibGVkKHZub2RlLnByb3BzKSkge1xuICAgICAgICAgIGNvbnN0IG1vdW50Q29udGFpbmVyID0gcGFyZW50Tm9kZSh2bm9kZS5lbCkgfHwgY29udGFpbmVyO1xuICAgICAgICAgIG1vdW50KHZub2RlLCBtb3VudENvbnRhaW5lciwgdm5vZGUuYW5jaG9yKTtcbiAgICAgICAgICB1cGRhdGVDc3NWYXJzKHZub2RlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBtb3VudFRvVGFyZ2V0KHZub2RlKTtcbiAgICAgIH07XG4gICAgICBwZW5kaW5nTW91bnRzLnNldCh2bm9kZSwgbW91bnRKb2IpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KG1vdW50Sm9iLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfTtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBuMi5lbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgc3RhcnRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgZW5kXCIpIDogY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGluc2VydChwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaW5zZXJ0KG1haW5BbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGlmIChpc1RlbGVwb3J0RGVmZXJyZWQobjIucHJvcHMpIHx8IHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgcXVldWVQZW5kaW5nTW91bnQobjIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgbW91bnQobjIsIGNvbnRhaW5lciwgbWFpbkFuY2hvcik7XG4gICAgICAgIHVwZGF0ZUNzc1ZhcnMobjIsIHRydWUpO1xuICAgICAgfVxuICAgICAgbW91bnRUb1RhcmdldCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9IG4xLmFuY2hvcjtcbiAgICAgIGNvbnN0IHBlbmRpbmdNb3VudCA9IHBlbmRpbmdNb3VudHMuZ2V0KG4xKTtcbiAgICAgIGlmIChwZW5kaW5nTW91bnQpIHtcbiAgICAgICAgcGVuZGluZ01vdW50LmZsYWdzIHw9IDg7XG4gICAgICAgIHBlbmRpbmdNb3VudHMuZGVsZXRlKG4xKTtcbiAgICAgICAgcXVldWVQZW5kaW5nTW91bnQobjIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuMi50YXJnZXRTdGFydCA9IG4xLnRhcmdldFN0YXJ0O1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gbjEudGFyZ2V0O1xuICAgICAgY29uc3QgdGFyZ2V0QW5jaG9yID0gbjIudGFyZ2V0QW5jaG9yID0gbjEudGFyZ2V0QW5jaG9yO1xuICAgICAgY29uc3Qgd2FzRGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjEucHJvcHMpO1xuICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHdhc0Rpc2FibGVkID8gY29udGFpbmVyIDogdGFyZ2V0O1xuICAgICAgY29uc3QgY3VycmVudEFuY2hvciA9IHdhc0Rpc2FibGVkID8gbWFpbkFuY2hvciA6IHRhcmdldEFuY2hvcjtcbiAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwic3ZnXCIgfHwgaXNUYXJnZXRTVkcodGFyZ2V0KSkge1xuICAgICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgICAgfVxuICAgICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCAhISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIGN1cnJlbnRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IHJlc29sdmVUYXJnZXQobjIucHJvcHMsIHF1ZXJ5U2VsZWN0b3IpO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBuMi50YXJnZXQgPSBuZXh0VGFyZ2V0O1xuICAgICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgICBuMixcbiAgICAgICAgICAgICAgbmV4dFRhcmdldCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB1cGRhdGVDc3NWYXJzKG4yLCBkaXNhYmxlZCk7XG4gICAgfVxuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHsgdW06IHVubW91bnQsIG86IHsgcmVtb3ZlOiBob3N0UmVtb3ZlIH0gfSwgZG9SZW1vdmUpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGFuY2hvcixcbiAgICAgIHRhcmdldFN0YXJ0LFxuICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcHNcbiAgICB9ID0gdm5vZGU7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpO1xuICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IGRvUmVtb3ZlIHx8ICFkaXNhYmxlZDtcbiAgICBjb25zdCBwZW5kaW5nTW91bnQgPSBwZW5kaW5nTW91bnRzLmdldCh2bm9kZSk7XG4gICAgaWYgKHBlbmRpbmdNb3VudCkge1xuICAgICAgcGVuZGluZ01vdW50LmZsYWdzIHw9IDg7XG4gICAgICBwZW5kaW5nTW91bnRzLmRlbGV0ZSh2bm9kZSk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0U3RhcnQpO1xuICAgICAgaG9zdFJlbW92ZSh0YXJnZXRBbmNob3IpO1xuICAgIH1cbiAgICBkb1JlbW92ZSAmJiBob3N0UmVtb3ZlKGFuY2hvcik7XG4gICAgaWYgKCFwZW5kaW5nTW91bnQgJiYgKGRpc2FibGVkIHx8IHRhcmdldCkgJiYgc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2hvdWxkUmVtb3ZlLFxuICAgICAgICAgICEhY2hpbGQuZHluYW1pY0NoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtb3ZlOiBtb3ZlVGVsZXBvcnQsXG4gIGh5ZHJhdGU6IGh5ZHJhdGVUZWxlcG9ydFxufTtcbmZ1bmN0aW9uIG1vdmVUZWxlcG9ydCh2bm9kZSwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHsgbzogeyBpbnNlcnQgfSwgbTogbW92ZSB9LCBtb3ZlVHlwZSA9IDIpIHtcbiAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgaW5zZXJ0KHZub2RlLnRhcmdldEFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGNvbnN0IHsgZWwsIGFuY2hvciwgc2hhcGVGbGFnLCBjaGlsZHJlbiwgcHJvcHMgfSA9IHZub2RlO1xuICBjb25zdCBpc1Jlb3JkZXIgPSBtb3ZlVHlwZSA9PT0gMjtcbiAgaWYgKGlzUmVvcmRlcikge1xuICAgIGluc2VydChlbCwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGlmICghcGVuZGluZ01vdW50cy5oYXModm5vZGUpICYmICghaXNSZW9yZGVyIHx8IGlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciwgaW5zZXJ0LCBjcmVhdGVUZXh0IH1cbn0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICBmdW5jdGlvbiBoeWRyYXRlQW5jaG9yKHRhcmdldDIsIHRhcmdldE5vZGUpIHtcbiAgICBsZXQgdGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICB3aGlsZSAodGFyZ2V0QW5jaG9yKSB7XG4gICAgICBpZiAodGFyZ2V0QW5jaG9yICYmIHRhcmdldEFuY2hvci5ub2RlVHlwZSA9PT0gOCkge1xuICAgICAgICBpZiAodGFyZ2V0QW5jaG9yLmRhdGEgPT09IFwidGVsZXBvcnQgc3RhcnQgYW5jaG9yXCIpIHtcbiAgICAgICAgICB2bm9kZS50YXJnZXRTdGFydCA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRBbmNob3IuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBhbmNob3JcIikge1xuICAgICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICB0YXJnZXQyLl9scGEgPSB2bm9kZS50YXJnZXRBbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUudGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGFyZ2V0QW5jaG9yID0gbmV4dFNpYmxpbmcodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaHlkcmF0ZURpc2FibGVkVGVsZXBvcnQobm9kZTIsIHZub2RlMikge1xuICAgIHZub2RlMi5hbmNob3IgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICBuZXh0U2libGluZyhub2RlMiksXG4gICAgICB2bm9kZTIsXG4gICAgICBwYXJlbnROb2RlKG5vZGUyKSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSB2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgIHZub2RlLnByb3BzLFxuICAgIHF1ZXJ5U2VsZWN0b3JcbiAgKTtcbiAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQodm5vZGUucHJvcHMpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldC5fbHBhIHx8IHRhcmdldC5maXJzdENoaWxkO1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxNikge1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIGh5ZHJhdGVEaXNhYmxlZFRlbGVwb3J0KG5vZGUsIHZub2RlKTtcbiAgICAgICAgaHlkcmF0ZUFuY2hvcih0YXJnZXQsIHRhcmdldE5vZGUpO1xuICAgICAgICBpZiAoIXZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgICAgIHByZXBhcmVBbmNob3IoXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIGNyZWF0ZVRleHQsXG4gICAgICAgICAgICBpbnNlcnQsXG4gICAgICAgICAgICAvLyBpZiB0YXJnZXQgaXMgdGhlIHNhbWUgYXMgdGhlIG1haW4gdmlldywgaW5zZXJ0IGFuY2hvcnMgYmVmb3JlIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgLy8gdG8gYXZvaWQgaHlkcmF0aW5nIG1pc21hdGNoXG4gICAgICAgICAgICBwYXJlbnROb2RlKG5vZGUpID09PSB0YXJnZXQgPyBub2RlIDogbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBoeWRyYXRlQW5jaG9yKHRhcmdldCwgdGFyZ2V0Tm9kZSk7XG4gICAgICAgIGlmICghdm5vZGUudGFyZ2V0QW5jaG9yKSB7XG4gICAgICAgICAgcHJlcGFyZUFuY2hvcih0YXJnZXQsIHZub2RlLCBjcmVhdGVUZXh0LCBpbnNlcnQpO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICB0YXJnZXROb2RlICYmIG5leHRTaWJsaW5nKHRhcmdldE5vZGUpLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVDc3NWYXJzKHZub2RlLCBkaXNhYmxlZCk7XG4gIH0gZWxzZSBpZiAoZGlzYWJsZWQpIHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGh5ZHJhdGVEaXNhYmxlZFRlbGVwb3J0KG5vZGUsIHZub2RlKTtcbiAgICAgIHZub2RlLnRhcmdldFN0YXJ0ID0gbm9kZTtcbiAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm5vZGUuYW5jaG9yICYmIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvcik7XG59XG5jb25zdCBUZWxlcG9ydCA9IFRlbGVwb3J0SW1wbDtcbmZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcnModm5vZGUsIGlzRGlzYWJsZWQpIHtcbiAgY29uc3QgY3R4ID0gdm5vZGUuY3R4O1xuICBpZiAoY3R4ICYmIGN0eC51dCkge1xuICAgIGxldCBub2RlLCBhbmNob3I7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIG5vZGUgPSB2bm9kZS5lbDtcbiAgICAgIGFuY2hvciA9IHZub2RlLmFuY2hvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZSA9IHZub2RlLnRhcmdldFN0YXJ0O1xuICAgICAgYW5jaG9yID0gdm5vZGUudGFyZ2V0QW5jaG9yO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBhbmNob3IpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdi1vd25lclwiLCBjdHgudWlkKTtcbiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBjdHgudXQoKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUFuY2hvcih0YXJnZXQsIHZub2RlLCBjcmVhdGVUZXh0LCBpbnNlcnQsIGFuY2hvciA9IG51bGwpIHtcbiAgY29uc3QgdGFyZ2V0U3RhcnQgPSB2bm9kZS50YXJnZXRTdGFydCA9IGNyZWF0ZVRleHQoXCJcIik7XG4gIGNvbnN0IHRhcmdldEFuY2hvciA9IHZub2RlLnRhcmdldEFuY2hvciA9IGNyZWF0ZVRleHQoXCJcIik7XG4gIHRhcmdldFN0YXJ0W1RlbGVwb3J0RW5kS2V5XSA9IHRhcmdldEFuY2hvcjtcbiAgaWYgKHRhcmdldCkge1xuICAgIGluc2VydCh0YXJnZXRTdGFydCwgdGFyZ2V0LCBhbmNob3IpO1xuICAgIGluc2VydCh0YXJnZXRBbmNob3IsIHRhcmdldCwgYW5jaG9yKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0QW5jaG9yO1xufVxuXG5jb25zdCBsZWF2ZUNiS2V5ID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcIl9sZWF2ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IHJlY3Vyc2l2ZUdldFN1YnRyZWUgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3Qgc3ViVHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gIHJldHVybiBzdWJUcmVlLmNvbXBvbmVudCA/IHJlY3Vyc2l2ZUdldFN1YnRyZWUoc3ViVHJlZS5jb21wb25lbnQpIDogc3ViVHJlZTtcbn07XG5jb25zdCBCYXNlVHJhbnNpdGlvbkltcGwgPSB7XG4gIG5hbWU6IGBCYXNlVHJhbnNpdGlvbmAsXG4gIHByb3BzOiBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBmaW5kTm9uQ29tbWVudENoaWxkKGNoaWxkcmVuKSA6IChcbiAgICAgICAgLy8gS2VlcCBleHBsaWNpdCBkZWZhdWx0LXNsb3QgY29uZGl0aW9uYWxzIG9uIHRoZSBzYW1lIHRyYW5zaXRpb24gcGF0aFxuICAgICAgICAvLyBhcyByZWd1bGFyIHYtaWYgYnJhbmNoZXMsIHdoaWNoIHJlbmRlciBhIGNvbW1lbnQgcGxhY2Vob2xkZXIuXG4gICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPyBjcmVhdGVDb21tZW50Vk5vZGUoKSA6IHZvaWQgMFxuICAgICAgKTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gICAgICBjb25zdCB7IG1vZGUgfSA9IHJhd1Byb3BzO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbW9kZSAmJiBtb2RlICE9PSBcImluLW91dFwiICYmIG1vZGUgIT09IFwib3V0LWluXCIgJiYgbW9kZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgd2FybiQxKGBpbnZhbGlkIDx0cmFuc2l0aW9uPiBtb2RlOiAke21vZGV9YCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaXNMZWF2aW5nKSB7XG4gICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyQ2hpbGQgPSBnZXRJbm5lckNoaWxkJDEoY2hpbGQpO1xuICAgICAgaWYgKCFpbm5lckNoaWxkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIGxldCBlbnRlckhvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgaW5uZXJDaGlsZCxcbiAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgLy8gIzExMDYxLCBlbnN1cmUgZW50ZXJIb29rcyBpcyBmcmVzaCBhZnRlciBjbG9uZVxuICAgICAgICAoaG9va3MpID0+IGVudGVySG9va3MgPSBob29rc1xuICAgICAgKTtcbiAgICAgIGlmIChpbm5lckNoaWxkLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKGlubmVyQ2hpbGQsIGVudGVySG9va3MpO1xuICAgICAgfVxuICAgICAgbGV0IG9sZElubmVyQ2hpbGQgPSBpbnN0YW5jZS5zdWJUcmVlICYmIGdldElubmVyQ2hpbGQkMShpbnN0YW5jZS5zdWJUcmVlKTtcbiAgICAgIGlmIChvbGRJbm5lckNoaWxkICYmIG9sZElubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCAmJiAhaXNTYW1lVk5vZGVUeXBlKG9sZElubmVyQ2hpbGQsIGlubmVyQ2hpbGQpICYmIHJlY3Vyc2l2ZUdldFN1YnRyZWUoaW5zdGFuY2UpLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgbGV0IGxlYXZpbmdIb29rcyA9IHJlc29sdmVUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgICAgb2xkSW5uZXJDaGlsZCxcbiAgICAgICAgICByYXdQcm9wcyxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICApO1xuICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Mob2xkSW5uZXJDaGlsZCwgbGVhdmluZ0hvb2tzKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwib3V0LWluXCIgJiYgaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgc3RhdGUuaXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgICAgICBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2Uuam9iLmZsYWdzICYgOCkpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmU7XG4gICAgICAgICAgICBvbGRJbm5lckNoaWxkID0gdm9pZCAwO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiaW4tb3V0XCIgJiYgaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmRlbGF5TGVhdmUgPSAoZWwsIGVhcmx5UmVtb3ZlLCBkZWxheWVkTGVhdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW1N0cmluZyhvbGRJbm5lckNoaWxkLmtleSldID0gb2xkSW5uZXJDaGlsZDtcbiAgICAgICAgICAgIGVsW2xlYXZlQ2JLZXldID0gKCkgPT4ge1xuICAgICAgICAgICAgICBlYXJseVJlbW92ZSgpO1xuICAgICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGVySG9va3MuZGVsYXllZExlYXZlO1xuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkID0gdm9pZCAwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVudGVySG9va3MuZGVsYXllZExlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgICBkZWxheWVkTGVhdmUoKTtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGVySG9va3MuZGVsYXllZExlYXZlO1xuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkID0gdm9pZCAwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZElubmVyQ2hpbGQgPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob2xkSW5uZXJDaGlsZCkge1xuICAgICAgICBvbGRJbm5lckNoaWxkID0gdm9pZCAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBmaW5kTm9uQ29tbWVudENoaWxkKGNoaWxkcmVuKSB7XG4gIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgIGxldCBoYXNGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGMudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBoYXNGb3VuZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIFwiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjaGlsZCA9IGM7XG4gICAgICAgIGhhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuY29uc3QgQmFzZVRyYW5zaXRpb24gPSBCYXNlVHJhbnNpdGlvbkltcGw7XG5mdW5jdGlvbiBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSkge1xuICBjb25zdCB7IGxlYXZpbmdWTm9kZXMgfSA9IHN0YXRlO1xuICBsZXQgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gbGVhdmluZ1ZOb2Rlcy5nZXQodm5vZGUudHlwZSk7XG4gIGlmICghbGVhdmluZ1ZOb2Rlc0NhY2hlKSB7XG4gICAgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGVhdmluZ1ZOb2Rlcy5zZXQodm5vZGUudHlwZSwgbGVhdmluZ1ZOb2Rlc0NhY2hlKTtcbiAgfVxuICByZXR1cm4gbGVhdmluZ1ZOb2Rlc0NhY2hlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZSwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSwgcG9zdENsb25lKSB7XG4gIGNvbnN0IHtcbiAgICBhcHBlYXIsXG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQgPSBmYWxzZSxcbiAgICBvbkJlZm9yZUVudGVyLFxuICAgIG9uRW50ZXIsXG4gICAgb25BZnRlckVudGVyLFxuICAgIG9uRW50ZXJDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVMZWF2ZSxcbiAgICBvbkxlYXZlLFxuICAgIG9uQWZ0ZXJMZWF2ZSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlQXBwZWFyLFxuICAgIG9uQXBwZWFyLFxuICAgIG9uQWZ0ZXJBcHBlYXIsXG4gICAgb25BcHBlYXJDYW5jZWxsZWRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBrZXkgPSBTdHJpbmcodm5vZGUua2V5KTtcbiAgY29uc3QgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpO1xuICBjb25zdCBjYWxsSG9vayA9IChob29rLCBhcmdzKSA9PiB7XG4gICAgaG9vayAmJiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIGhvb2ssXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDksXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgY2FsbEFzeW5jSG9vayA9IChob29rLCBhcmdzKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9IGFyZ3NbMV07XG4gICAgY2FsbEhvb2soaG9vaywgYXJncyk7XG4gICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgIGlmIChob29rLmV2ZXJ5KChob29rMikgPT4gaG9vazIubGVuZ3RoIDw9IDEpKSBkb25lKCk7XG4gICAgfSBlbHNlIGlmIChob29rLmxlbmd0aCA8PSAxKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBob29rcyA9IHtcbiAgICBtb2RlLFxuICAgIHBlcnNpc3RlZCxcbiAgICBiZWZvcmVFbnRlcihlbCkge1xuICAgICAgbGV0IGhvb2sgPSBvbkJlZm9yZUVudGVyO1xuICAgICAgaWYgKCFzdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICAgIGhvb2sgPSBvbkJlZm9yZUFwcGVhciB8fCBvbkJlZm9yZUVudGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVsW2xlYXZlQ2JLZXldKSB7XG4gICAgICAgIGVsW2xlYXZlQ2JLZXldKFxuICAgICAgICAgIHRydWVcbiAgICAgICAgICAvKiBjYW5jZWxsZWQgKi9cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxlYXZpbmdWTm9kZSA9IGxlYXZpbmdWTm9kZXNDYWNoZVtrZXldO1xuICAgICAgaWYgKGxlYXZpbmdWTm9kZSAmJiBpc1NhbWVWTm9kZVR5cGUodm5vZGUsIGxlYXZpbmdWTm9kZSkgJiYgbGVhdmluZ1ZOb2RlLmVsW2xlYXZlQ2JLZXldKSB7XG4gICAgICAgIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSgpO1xuICAgICAgfVxuICAgICAgY2FsbEhvb2soaG9vaywgW2VsXSk7XG4gICAgfSxcbiAgICBlbnRlcihlbCkge1xuICAgICAgaWYgKCFpc0htclVwZGF0aW5nICYmIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXldID09PSB2bm9kZSkgcmV0dXJuO1xuICAgICAgbGV0IGhvb2sgPSBvbkVudGVyO1xuICAgICAgbGV0IGFmdGVySG9vayA9IG9uQWZ0ZXJFbnRlcjtcbiAgICAgIGxldCBjYW5jZWxIb29rID0gb25FbnRlckNhbmNlbGxlZDtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25BcHBlYXIgfHwgb25FbnRlcjtcbiAgICAgICAgICBhZnRlckhvb2sgPSBvbkFmdGVyQXBwZWFyIHx8IG9uQWZ0ZXJFbnRlcjtcbiAgICAgICAgICBjYW5jZWxIb29rID0gb25BcHBlYXJDYW5jZWxsZWQgfHwgb25FbnRlckNhbmNlbGxlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGVsW2VudGVyQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhjYW5jZWxIb29rLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhhZnRlckhvb2ssIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChob29rcy5kZWxheWVkTGVhdmUpIHtcbiAgICAgICAgICBob29rcy5kZWxheWVkTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbFtlbnRlckNiS2V5XSA9IHZvaWQgMDtcbiAgICAgIH07XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0uYmluZChudWxsLCBmYWxzZSk7XG4gICAgICBpZiAoaG9vaykge1xuICAgICAgICBjYWxsQXN5bmNIb29rKGhvb2ssIFtlbCwgZG9uZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGVhdmUoZWwsIHJlbW92ZSkge1xuICAgICAgY29uc3Qga2V5MiA9IFN0cmluZyh2bm9kZS5rZXkpO1xuICAgICAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgICAgIGVsW2VudGVyQ2JLZXldKFxuICAgICAgICAgIHRydWVcbiAgICAgICAgICAvKiBjYW5jZWxsZWQgKi9cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc1VubW91bnRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgY2FsbEhvb2sob25CZWZvcmVMZWF2ZSwgW2VsXSk7XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKG9uTGVhdmVDYW5jZWxsZWQsIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKG9uQWZ0ZXJMZWF2ZSwgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgIGlmIChsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPT09IHZub2RlKSB7XG4gICAgICAgICAgZGVsZXRlIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9IHZub2RlO1xuICAgICAgaWYgKG9uTGVhdmUpIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhvbkxlYXZlLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsb25lKHZub2RlMikge1xuICAgICAgY29uc3QgaG9va3MyID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgdm5vZGUyLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBwb3N0Q2xvbmVcbiAgICAgICk7XG4gICAgICBpZiAocG9zdENsb25lKSBwb3N0Q2xvbmUoaG9va3MyKTtcbiAgICAgIHJldHVybiBob29rczI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQkMSh2bm9kZSkge1xuICBpZiAoIWlzS2VlcEFsaXZlKHZub2RlKSkge1xuICAgIGlmIChpc1RlbGVwb3J0KHZub2RlLnR5cGUpICYmIHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gZmluZE5vbkNvbW1lbnRDaGlsZCh2bm9kZS5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBpZiAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMzIgJiYgaXNGdW5jdGlvbihjaGlsZHJlbi5kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLmRlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgaG9va3MpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYgJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICAgIGNvbnN0IHN1YlRyZWUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICBpc1RlbGVwb3J0KHN1YlRyZWUudHlwZSkgPyBnZXRJbm5lckNoaWxkJDEoc3ViVHJlZSkgfHwgc3ViVHJlZSA6IHN1YlRyZWUsXG4gICAgICBob29rc1xuICAgICk7XG4gIH0gZWxzZSBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgdm5vZGUuc3NDb250ZW50LnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0NvbnRlbnQpO1xuICAgIHZub2RlLnNzRmFsbGJhY2sudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzRmFsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHZub2RlLnRyYW5zaXRpb24gPSBob29rcztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKGNoaWxkcmVuLCBrZWVwQ29tbWVudCA9IGZhbHNlLCBwYXJlbnRLZXkpIHtcbiAgbGV0IHJldCA9IFtdO1xuICBsZXQga2V5ZWRGcmFnbWVudENvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGNvbnN0IGtleSA9IHBhcmVudEtleSA9PSBudWxsID8gY2hpbGQua2V5IDogU3RyaW5nKHBhcmVudEtleSkgKyBTdHJpbmcoY2hpbGQua2V5ICE9IG51bGwgPyBjaGlsZC5rZXkgOiBpKTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmIChjaGlsZC5wYXRjaEZsYWcgJiAxMjgpIGtleWVkRnJhZ21lbnRDb3VudCsrO1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdChcbiAgICAgICAgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBrZWVwQ29tbWVudCwga2V5KVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGtlZXBDb21tZW50IHx8IGNoaWxkLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgIHJldC5wdXNoKGtleSAhPSBudWxsID8gY2xvbmVWTm9kZShjaGlsZCwgeyBrZXkgfSkgOiBjaGlsZCk7XG4gICAgfVxuICB9XG4gIGlmIChrZXllZEZyYWdtZW50Q291bnQgPiAxKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldFtpXS5wYXRjaEZsYWcgPSAtMjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob3B0aW9ucykgPyAoXG4gICAgLy8gIzgyMzY6IGV4dGVuZCBjYWxsIGFuZCBvcHRpb25zLm5hbWUgYWNjZXNzIGFyZSBjb25zaWRlcmVkIHNpZGUtZWZmZWN0c1xuICAgIC8vIGJ5IFJvbGx1cCwgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgcHVyZS1hbm5vdGF0ZWQgSUlGRS5cbiAgICAvKiBAX19QVVJFX18gKi8gKCgpID0+IGV4dGVuZCh7IG5hbWU6IG9wdGlvbnMubmFtZSB9LCBleHRyYU9wdGlvbnMsIHsgc2V0dXA6IG9wdGlvbnMgfSkpKClcbiAgKSA6IG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpKSB7XG4gICAgcmV0dXJuIChpLmFwcENvbnRleHQuY29uZmlnLmlkUHJlZml4IHx8IFwidlwiKSArIFwiLVwiICsgaS5pZHNbMF0gKyBpLmlkc1sxXSsrO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgdXNlSWQoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cbmZ1bmN0aW9uIG1hcmtBc3luY0JvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLmlkcyA9IFtpbnN0YW5jZS5pZHNbMF0gKyBpbnN0YW5jZS5pZHNbMl0rKyArIFwiLVwiLCAwLCAwXTtcbn1cblxuY29uc3Qga25vd25UZW1wbGF0ZVJlZnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbmZ1bmN0aW9uIHVzZVRlbXBsYXRlUmVmKGtleSkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGNvbnN0IHIgPSBzaGFsbG93UmVmKG51bGwpO1xuICBpZiAoaSkge1xuICAgIGNvbnN0IHJlZnMgPSBpLnJlZnMgPT09IEVNUFRZX09CSiA/IGkucmVmcyA9IHt9IDogaS5yZWZzO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzVGVtcGxhdGVSZWZLZXkocmVmcywga2V5KSkge1xuICAgICAgd2FybiQxKGB1c2VUZW1wbGF0ZVJlZignJHtrZXl9JykgYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWZzLCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiByLnZhbHVlLFxuICAgICAgICBzZXQ6ICh2YWwpID0+IHIudmFsdWUgPSB2YWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHVzZVRlbXBsYXRlUmVmKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmV0ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlYWRvbmx5KHIpIDogcjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBrbm93blRlbXBsYXRlUmVmcy5hZGQocmV0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gaXNUZW1wbGF0ZVJlZktleShyZWZzLCBrZXkpIHtcbiAgbGV0IGRlc2M7XG4gIHJldHVybiAhISgoZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVmcywga2V5KSkgJiYgIWRlc2MuY29uZmlndXJhYmxlKTtcbn1cblxuY29uc3QgcGVuZGluZ1NldFJlZk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIGlzVW5tb3VudCA9IGZhbHNlKSB7XG4gIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICByYXdSZWYuZm9yRWFjaChcbiAgICAgIChyLCBpKSA9PiBzZXRSZWYoXG4gICAgICAgIHIsXG4gICAgICAgIG9sZFJhd1JlZiAmJiAoaXNBcnJheShvbGRSYXdSZWYpID8gb2xkUmF3UmVmW2ldIDogb2xkUmF3UmVmKSxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBpc1VubW91bnRcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpICYmICFpc1VubW91bnQpIHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNTEyICYmIHZub2RlLnR5cGUuX19hc3luY1Jlc29sdmVkICYmIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLmNvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUuY29tcG9uZW50LnN1YlRyZWUpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmVmFsdWUgPSB2bm9kZS5zaGFwZUZsYWcgJiA0ID8gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2Uodm5vZGUuY29tcG9uZW50KSA6IHZub2RlLmVsO1xuICBjb25zdCB2YWx1ZSA9IGlzVW5tb3VudCA/IG51bGwgOiByZWZWYWx1ZTtcbiAgY29uc3QgeyBpOiBvd25lciwgcjogcmVmIH0gPSByYXdSZWY7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFvd25lcikge1xuICAgIHdhcm4kMShcbiAgICAgIGBNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvbGRSZWYgPSBvbGRSYXdSZWYgJiYgb2xkUmF3UmVmLnI7XG4gIGNvbnN0IHJlZnMgPSBvd25lci5yZWZzID09PSBFTVBUWV9PQkogPyBvd25lci5yZWZzID0ge30gOiBvd25lci5yZWZzO1xuICBjb25zdCBzZXR1cFN0YXRlID0gb3duZXIuc2V0dXBTdGF0ZTtcbiAgY29uc3QgcmF3U2V0dXBTdGF0ZSA9IHRvUmF3KHNldHVwU3RhdGUpO1xuICBjb25zdCBjYW5TZXRTZXR1cFJlZiA9IHNldHVwU3RhdGUgPT09IEVNUFRZX09CSiA/IE5PIDogKGtleSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaGFzT3duKHJhd1NldHVwU3RhdGUsIGtleSkgJiYgIWlzUmVmKHJhd1NldHVwU3RhdGVba2V5XSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBUZW1wbGF0ZSByZWYgXCIke2tleX1cIiB1c2VkIG9uIGEgbm9uLXJlZiB2YWx1ZS4gSXQgd2lsbCBub3Qgd29yayBpbiB0aGUgcHJvZHVjdGlvbiBidWlsZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoa25vd25UZW1wbGF0ZVJlZnMuaGFzKHJhd1NldHVwU3RhdGVba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNUZW1wbGF0ZVJlZktleShyZWZzLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNPd24ocmF3U2V0dXBTdGF0ZSwga2V5KTtcbiAgfTtcbiAgY29uc3QgY2FuU2V0UmVmID0gKHJlZjIsIGtleSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtub3duVGVtcGxhdGVSZWZzLmhhcyhyZWYyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoa2V5ICYmIGlzVGVtcGxhdGVSZWZLZXkocmVmcywga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgaWYgKG9sZFJlZiAhPSBudWxsICYmIG9sZFJlZiAhPT0gcmVmKSB7XG4gICAgaW52YWxpZGF0ZVBlbmRpbmdTZXRSZWYob2xkUmF3UmVmKTtcbiAgICBpZiAoaXNTdHJpbmcob2xkUmVmKSkge1xuICAgICAgcmVmc1tvbGRSZWZdID0gbnVsbDtcbiAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihvbGRSZWYpKSB7XG4gICAgICAgIHNldHVwU3RhdGVbb2xkUmVmXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICBjb25zdCBvbGRSYXdSZWZBdG9tID0gb2xkUmF3UmVmO1xuICAgICAgaWYgKGNhblNldFJlZihvbGRSZWYsIG9sZFJhd1JlZkF0b20uaykpIHtcbiAgICAgICAgb2xkUmVmLnZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRSYXdSZWZBdG9tLmspIHJlZnNbb2xkUmF3UmVmQXRvbS5rXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKHJlZikpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcocmVmLCBvd25lciwgMTIsIFt2YWx1ZSwgcmVmc10pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IF9pc1N0cmluZyA9IGlzU3RyaW5nKHJlZik7XG4gICAgY29uc3QgX2lzUmVmID0gaXNSZWYocmVmKTtcbiAgICBpZiAoX2lzU3RyaW5nIHx8IF9pc1JlZikge1xuICAgICAgY29uc3QgZG9TZXQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyYXdSZWYuZikge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2lzU3RyaW5nID8gY2FuU2V0U2V0dXBSZWYocmVmKSA/IHNldHVwU3RhdGVbcmVmXSA6IHJlZnNbcmVmXSA6IGNhblNldFJlZihyZWYpIHx8ICFyYXdSZWYuayA/IHJlZi52YWx1ZSA6IHJlZnNbcmF3UmVmLmtdO1xuICAgICAgICAgIGlmIChpc1VubW91bnQpIHtcbiAgICAgICAgICAgIGlzQXJyYXkoZXhpc3RpbmcpICYmIHJlbW92ZShleGlzdGluZywgcmVmVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihyZWYpKSB7XG4gICAgICAgICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSByZWZzW3JlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKGNhblNldFJlZihyZWYsIHJhd1JlZi5rKSkge1xuICAgICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmF3UmVmLmspIHJlZnNbcmF3UmVmLmtdID0gbmV3VmFsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhyZWZWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaChyZWZWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgIHJlZnNbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihyZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgaWYgKGNhblNldFJlZihyZWYsIHJhd1JlZi5rKSkge1xuICAgICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyYXdSZWYuaykgcmVmc1tyYXdSZWYua10gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgam9iID0gKCkgPT4ge1xuICAgICAgICAgIGRvU2V0KCk7XG4gICAgICAgICAgcGVuZGluZ1NldFJlZk1hcC5kZWxldGUocmF3UmVmKTtcbiAgICAgICAgfTtcbiAgICAgICAgam9iLmlkID0gLTE7XG4gICAgICAgIHBlbmRpbmdTZXRSZWZNYXAuc2V0KHJhd1JlZiwgam9iKTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGpvYiwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52YWxpZGF0ZVBlbmRpbmdTZXRSZWYocmF3UmVmKTtcbiAgICAgICAgZG9TZXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaW52YWxpZGF0ZVBlbmRpbmdTZXRSZWYocmF3UmVmKSB7XG4gIGNvbnN0IHBlbmRpbmdTZXRSZWYgPSBwZW5kaW5nU2V0UmVmTWFwLmdldChyYXdSZWYpO1xuICBpZiAocGVuZGluZ1NldFJlZikge1xuICAgIHBlbmRpbmdTZXRSZWYuZmxhZ3MgfD0gODtcbiAgICBwZW5kaW5nU2V0UmVmTWFwLmRlbGV0ZShyYXdSZWYpO1xuICB9XG59XG5cbmxldCBoYXNMb2dnZWRNaXNtYXRjaEVycm9yID0gZmFsc2U7XG5jb25zdCBsb2dNaXNtYXRjaEVycm9yID0gKCkgPT4ge1xuICBpZiAoaGFzTG9nZ2VkTWlzbWF0Y2hFcnJvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFwiSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy5cIik7XG4gIGhhc0xvZ2dlZE1pc21hdGNoRXJyb3IgPSB0cnVlO1xufTtcbmNvbnN0IGlzU1ZHQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcInN2Z1wiKSAmJiBjb250YWluZXIudGFnTmFtZSAhPT0gXCJmb3JlaWduT2JqZWN0XCI7XG5jb25zdCBpc01hdGhNTENvbnRhaW5lciA9IChjb250YWluZXIpID0+IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoXCJNYXRoTUxcIik7XG5jb25zdCBnZXRDb250YWluZXJUeXBlID0gKGNvbnRhaW5lcikgPT4ge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gdm9pZCAwO1xuICBpZiAoaXNTVkdDb250YWluZXIoY29udGFpbmVyKSkgcmV0dXJuIFwic3ZnXCI7XG4gIGlmIChpc01hdGhNTENvbnRhaW5lcihjb250YWluZXIpKSByZXR1cm4gXCJtYXRobWxcIjtcbiAgcmV0dXJuIHZvaWQgMDtcbn07XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gODtcbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyhyZW5kZXJlckludGVybmFscykge1xuICBjb25zdCB7XG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIHA6IHBhdGNoLFxuICAgIG86IHtcbiAgICAgIHBhdGNoUHJvcCxcbiAgICAgIGNyZWF0ZVRleHQsXG4gICAgICBuZXh0U2libGluZyxcbiAgICAgIHBhcmVudE5vZGUsXG4gICAgICByZW1vdmUsXG4gICAgICBpbnNlcnQsXG4gICAgICBjcmVhdGVDb21tZW50XG4gICAgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGh5ZHJhdGUgPSAodm5vZGUsIGNvbnRhaW5lcikgPT4ge1xuICAgIGlmICghY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGh5ZHJhdGVOb2RlKGNvbnRhaW5lci5maXJzdENoaWxkLCB2bm9kZSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGlzRnJhZ21lbnRTdGFydCA9IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiO1xuICAgIGNvbnN0IG9uTWlzbWF0Y2ggPSAoKSA9PiBoYW5kbGVNaXNtYXRjaChcbiAgICAgIG5vZGUsXG4gICAgICB2bm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgaXNGcmFnbWVudFN0YXJ0XG4gICAgKTtcbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnLCBwYXRjaEZsYWcgfSA9IHZub2RlO1xuICAgIGxldCBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICB2bm9kZS5lbCA9IG5vZGU7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYobm9kZSwgXCJfX3Zub2RlXCIsIHZub2RlLCB0cnVlKTtcbiAgICAgIGRlZihub2RlLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGxldCBuZXh0Tm9kZSA9IG51bGw7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIGlmIChkb21UeXBlICE9PSAzKSB7XG4gICAgICAgICAgaWYgKHZub2RlLmNoaWxkcmVuID09PSBcIlwiKSB7XG4gICAgICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBwYXJlbnROb2RlKG5vZGUpLCBub2RlKTtcbiAgICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoIGluYCxcbiAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVxuICAgICAgICAgICAgICApfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtKU09OLnN0cmluZ2lmeSh2bm9kZS5jaGlsZHJlbil9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBpZiAoaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIHJlcGxhY2VOb2RlKFxuICAgICAgICAgICAgdm5vZGUuZWwgPSBub2RlLmNvbnRlbnQuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRvbVR5cGUgIT09IDggfHwgaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21UeXBlID09PSAxIHx8IGRvbVR5cGUgPT09IDMpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgY29uc3QgbmVlZFRvQWRvcHRDb250ZW50ID0gIXZub2RlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZub2RlLnN0YXRpY0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZWVkVG9BZG9wdENvbnRlbnQpXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuICs9IG5leHROb2RlLm5vZGVUeXBlID09PSAxID8gbmV4dE5vZGUub3V0ZXJIVE1MIDogbmV4dE5vZGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChpID09PSB2bm9kZS5zdGF0aWNDb3VudCAtIDEpIHtcbiAgICAgICAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5leHROb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlzRnJhZ21lbnRTdGFydCA/IG5leHRTaWJsaW5nKG5leHROb2RlKSA6IG5leHROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIGlmICghaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRnJhZ21lbnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMSkge1xuICAgICAgICAgIGlmICgoZG9tVHlwZSAhPT0gMSB8fCB2bm9kZS50eXBlLnRvTG93ZXJDYXNlKCkgIT09IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSAmJiAhaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcInRlbGVwb3J0IHN0YXJ0XCIpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlLCBub2RlLmRhdGEsIFwidGVsZXBvcnQgZW5kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoKGlzQXN5bmNXcmFwcGVyKHZub2RlKSB8fCB2bm9kZS5jb21wb25lbnQuYXN5bmNEZXApICYmICF2bm9kZS5jb21wb25lbnQuc3ViVHJlZSkge1xuICAgICAgICAgICAgbGV0IHN1YlRyZWU7XG4gICAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBjcmVhdGVWTm9kZShTdGF0aWMpO1xuICAgICAgICAgICAgICBzdWJUcmVlLmFuY2hvciA9IG5leHROb2RlID8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nIDogY29udGFpbmVyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBub2RlLm5vZGVUeXBlID09PSAzID8gY3JlYXRlVGV4dFZOb2RlKFwiXCIpIDogY3JlYXRlVk5vZGUoXG4gICAgICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gOCA/IENvbW1lbnQgOiBcImRpdlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJUcmVlLmVsID0gbm9kZTtcbiAgICAgICAgICAgIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlID0gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gOCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKHBhcmVudE5vZGUobm9kZSkpLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICBoeWRyYXRlTm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHROb2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBkeW5hbWljUHJvcHMsXG4gICAgICBwcm9wcyxcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIHNoYXBlRmxhZyxcbiAgICAgIGRpcnMsXG4gICAgICB0cmFuc2l0aW9uXG4gICAgfSA9IHZub2RlO1xuICAgIGNvbnN0IGZvcmNlUGF0Y2ggPSB0eXBlID09PSBcImlucHV0XCIgfHwgdHlwZSA9PT0gXCJvcHRpb25cIjtcbiAgICBjb25zdCBoYXNEeW5hbWljUHJvcHMgPSAhIWR5bmFtaWNQcm9wcztcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoIHx8IGhhc0R5bmFtaWNQcm9wcyB8fCBwYXRjaEZsYWcgIT09IC0xKSB7XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgLy8gbm8gbmVlZCBjaGVjayBwYXJlbnRTdXNwZW5zZSBpbiBoeWRyYXRpb25cbiAgICAgICAgICB0cmFuc2l0aW9uXG4gICAgICAgICkgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcyAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMuYXBwZWFyO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgICBjb25zdCBjbHMgPSBjb250ZW50LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgICAgICAgIGlmIChjbHMpIGNvbnRlbnQuJGNscyA9IGNscztcbiAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VOb2RlKGNvbnRlbnQsIGVsLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB2bm9kZS5lbCA9IGVsID0gY29udGVudDtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAmJiAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAhKHByb3BzICYmIChwcm9wcy5pbm5lckhUTUwgfHwgcHJvcHMudGV4dENvbnRlbnQpKSkge1xuICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBlbC5maXJzdENoaWxkLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZXh0ICYmICFpc01pc21hdGNoQWxsb3dlZChlbCwgMSAvKiBDSElMRFJFTiAqLykpIHtcbiAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBgXG5TZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3VyID0gbmV4dDtcbiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgIGxldCBjbGllbnRUZXh0ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChjbGllbnRUZXh0WzBdID09PSBcIlxcblwiICYmIChlbC50YWdOYW1lID09PSBcIlBSRVwiIHx8IGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikpIHtcbiAgICAgICAgICBjbGllbnRUZXh0ID0gY2xpZW50VGV4dC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHRleHRDb250ZW50IH0gPSBlbDtcbiAgICAgICAgaWYgKHRleHRDb250ZW50ICE9PSBjbGllbnRUZXh0ICYmIC8vIGlubmVySFRNTCBub3JtYWxpemUgXFxyXFxuIG9yIFxcciBpbnRvIGEgc2luZ2xlIFxcbiBpbiB0aGUgRE9NXG4gICAgICAgIHRleHRDb250ZW50ICE9PSBjbGllbnRUZXh0LnJlcGxhY2UoL1xcclxcbnxcXHIvZywgXCJcXG5cIikpIHtcbiAgICAgICAgICBpZiAoIWlzTWlzbWF0Y2hBbGxvd2VkKGVsLCAwIC8qIFRFWFQgKi8pKSB7XG4gICAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHt0ZXh0Q29udGVudH1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7Y2xpZW50VGV4dH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fIHx8IGZvcmNlUGF0Y2ggfHwgaGFzRHluYW1pY1Byb3BzIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gZWwudGFnTmFtZS5pbmNsdWRlcyhcIi1cIik7XG4gICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gZWwubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwic3ZnXCIpID8gXCJzdmdcIiA6IGVsLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcIk1hdGhNTFwiKSA/IFwibWF0aG1sXCIgOiB2b2lkIDA7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIC8vICMxMTE4OSBza2lwIGlmIHRoaXMgbm9kZSBoYXMgZGlyZWN0aXZlcyB0aGF0IGhhdmUgY3JlYXRlZCBob29rc1xuICAgICAgICAgICAgLy8gYXMgaXQgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBET00gaW4gYW55IHBvc3NpYmxlIHdheVxuICAgICAgICAgICAgIShkaXJzICYmIGRpcnMuc29tZSgoZCkgPT4gZC5kaXIuY3JlYXRlZCkpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9yY2VQYXRjaCAmJiAoa2V5LmVuZHNXaXRoKFwidmFsdWVcIikgfHwga2V5ID09PSBcImluZGV0ZXJtaW5hdGVcIikgfHwgaXNPbihrZXkpICYmICFpc1Jlc2VydmVkUHJvcChrZXkpIHx8IC8vIGZvcmNlIGh5ZHJhdGUgdi1iaW5kIHdpdGggLnByb3AgbW9kaWZpZXJzXG4gICAgICAgICAgICBrZXlbMF0gPT09IFwiLlwiIHx8IGlzQ3VzdG9tRWxlbWVudCAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSB8fCBkeW5hbWljUHJvcHMgJiYgZHluYW1pY1Byb3BzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVW5jaGFuZ2VkUmVzb3VyY2VQcm9wKGVsLCBrZXksIHByb3BzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGF0Y2hQcm9wKGVsLCBrZXksIG51bGwsIHByb3BzW2tleV0sIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMub25DbGljaykge1xuICAgICAgICAgIHBhdGNoUHJvcChcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJvbkNsaWNrXCIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHMub25DbGljayxcbiAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgNCAmJiBpc1JlYWN0aXZlKHByb3BzLnN0eWxlKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzLnN0eWxlKSBwcm9wcy5zdHlsZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgdm5vZGVIb29rcztcbiAgICAgIGlmICh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSB7XG4gICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2tzLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICgodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVNb3VudGVkKSB8fCBkaXJzIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICAgIHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlKCgpID0+IHtcbiAgICAgICAgICB2bm9kZUhvb2tzICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2tzLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJtb3VudGVkXCIpO1xuICAgICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbC5uZXh0U2libGluZztcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUNoaWxkcmVuID0gKG5vZGUsIHBhcmVudFZOb2RlLCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhcGFyZW50Vk5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Vk5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgbCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBsZXQgaGFzQ2hlY2tlZE1pc21hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IHZub2RlID0gb3B0aW1pemVkID8gY2hpbGRyZW5baV0gOiBjaGlsZHJlbltpXSA9IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIGNvbnN0IGlzVGV4dCA9IHZub2RlLnR5cGUgPT09IFRleHQ7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBpZiAoaXNUZXh0ICYmICFvcHRpbWl6ZWQpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBsICYmIG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2kgKyAxXSkudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICAgICAgaW5zZXJ0KFxuICAgICAgICAgICAgICBjcmVhdGVUZXh0KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5zbGljZSh2bm9kZS5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBjb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFoYXNDaGVja2VkTWlzbWF0Y2gpIHtcbiAgICAgICAgICBoYXNDaGVja2VkTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGlmICghaXNNaXNtYXRjaEFsbG93ZWQoY29udGFpbmVyLCAxIC8qIENISUxEUkVOICovKSkge1xuICAgICAgICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIGBcblNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUZyYWdtZW50ID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IHsgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gdm5vZGU7XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIGNvbnN0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBvcHRpbWl6ZWRcbiAgICApO1xuICAgIGlmIChuZXh0ICYmIGlzQ29tbWVudChuZXh0KSAmJiBuZXh0LmRhdGEgPT09IFwiXVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yID0gbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgIGluc2VydCh2bm9kZS5hbmNob3IgPSBjcmVhdGVDb21tZW50KGBdYCksIGNvbnRhaW5lciwgbmV4dCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZU1pc21hdGNoID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIGlzRnJhZ21lbnQpID0+IHtcbiAgICBpZiAoIWlzTm9kZU1pc21hdGNoQWxsb3dlZChub2RlLCB2bm9kZSkpIHtcbiAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICBgSHlkcmF0aW9uIG5vZGUgbWlzbWF0Y2g6XG4tIHJlbmRlcmVkIG9uIHNlcnZlcjpgLFxuICAgICAgICBub2RlLFxuICAgICAgICBub2RlLm5vZGVUeXBlID09PSAzID8gYCh0ZXh0KWAgOiBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIiA/IGAoc3RhcnQgb2YgZnJhZ21lbnQpYCA6IGBgLFxuICAgICAgICBgXG4tIGV4cGVjdGVkIG9uIGNsaWVudDpgLFxuICAgICAgICB2bm9kZS50eXBlXG4gICAgICApO1xuICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgIH1cbiAgICB2bm9kZS5lbCA9IG51bGw7XG4gICAgaWYgKGlzRnJhZ21lbnQpIHtcbiAgICAgIGNvbnN0IGVuZCA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXh0MiA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBpZiAobmV4dDIgJiYgbmV4dDIgIT09IGVuZCkge1xuICAgICAgICAgIHJlbW92ZShuZXh0Mik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgcmVtb3ZlKG5vZGUpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgbmV4dCxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgc2xvdFNjb3BlSWRzXG4gICAgKTtcbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBwYXJlbnRDb21wb25lbnQudm5vZGUuZWwgPSB2bm9kZS5lbDtcbiAgICAgIHVwZGF0ZUhPQ0hvc3RFbChwYXJlbnRDb21wb25lbnQsIHZub2RlLmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG4gIGNvbnN0IGxvY2F0ZUNsb3NpbmdBbmNob3IgPSAobm9kZSwgb3BlbiA9IFwiW1wiLCBjbG9zZSA9IFwiXVwiKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gMDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5vZGUgJiYgaXNDb21tZW50KG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IG9wZW4pIG1hdGNoKys7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IGNsb3NlKSB7XG4gICAgICAgICAgaWYgKG1hdGNoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBjb25zdCByZXBsYWNlTm9kZSA9IChuZXdOb2RlLCBvbGROb2RlLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBjb25zdCBwYXJlbnROb2RlMiA9IG9sZE5vZGUucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZTIpIHtcbiAgICAgIHBhcmVudE5vZGUyLnJlcGxhY2VDaGlsZChuZXdOb2RlLCBvbGROb2RlKTtcbiAgICB9XG4gICAgbGV0IHBhcmVudCA9IHBhcmVudENvbXBvbmVudDtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LnZub2RlLmVsID09PSBvbGROb2RlKSB7XG4gICAgICAgIHBhcmVudC52bm9kZS5lbCA9IHBhcmVudC5zdWJUcmVlLmVsID0gbmV3Tm9kZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1RlbXBsYXRlTm9kZSA9IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS50YWdOYW1lID09PSBcIlRFTVBMQVRFXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuY29uc3QgcmVzb3VyY2VQcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcInNyY1wiLCBcInNyY3NldFwiLCBcImhyZWZcIiwgXCJwb3N0ZXJcIl0pO1xuZnVuY3Rpb24gaXNVbmNoYW5nZWRSZXNvdXJjZVByb3AoZWwsIGtleSwgY2xpZW50VmFsdWUpIHtcbiAgaWYgKCFyZXNvdXJjZVByb3BzLmhhcyhrZXkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoa2V5KSA9PT0gKGNsaWVudFZhbHVlID09IG51bGwgPyBudWxsIDogYCR7Y2xpZW50VmFsdWV9YCk7XG59XG5mdW5jdGlvbiBwcm9wSGFzTWlzbWF0Y2goZWwsIGtleSwgY2xpZW50VmFsdWUsIHZub2RlLCBpbnN0YW5jZSkge1xuICBsZXQgbWlzbWF0Y2hUeXBlO1xuICBsZXQgbWlzbWF0Y2hLZXk7XG4gIGxldCBhY3R1YWw7XG4gIGxldCBleHBlY3RlZDtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgaWYgKGVsLiRjbHMpIHtcbiAgICAgIGFjdHVhbCA9IGVsLiRjbHM7XG4gICAgICBkZWxldGUgZWwuJGNscztcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSAyIC8qIENMQVNTICovO1xuICAgICAgbWlzbWF0Y2hLZXkgPSBgY2xhc3NgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpIHx8IFwiXCI7XG4gICAgZXhwZWN0ZWQgPSBpc1N0cmluZyhjbGllbnRWYWx1ZSkgPyBjbGllbnRWYWx1ZSA6IHN0cmluZ2lmeVN0eWxlKG5vcm1hbGl6ZVN0eWxlKGNsaWVudFZhbHVlKSk7XG4gICAgY29uc3QgYWN0dWFsTWFwID0gdG9TdHlsZU1hcChhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkTWFwID0gdG9TdHlsZU1hcChleHBlY3RlZCk7XG4gICAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICAgIGZvciAoY29uc3QgeyBkaXIsIHZhbHVlIH0gb2Ygdm5vZGUuZGlycykge1xuICAgICAgICBpZiAoZGlyLm5hbWUgPT09IFwic2hvd1wiICYmICF2YWx1ZSkge1xuICAgICAgICAgIGV4cGVjdGVkTWFwLnNldChcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UsIHZub2RlLCBleHBlY3RlZE1hcCk7XG4gICAgfVxuICAgIGlmICghaXNNYXBFcXVhbChhY3R1YWxNYXAsIGV4cGVjdGVkTWFwKSkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gMyAvKiBTVFlMRSAqLztcbiAgICAgIG1pc21hdGNoS2V5ID0gXCJzdHlsZVwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgJiYgaXNLbm93blN2Z0F0dHIoa2V5KSB8fCBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIChpc0Jvb2xlYW5BdHRyKGtleSkgfHwgaXNLbm93bkh0bWxBdHRyKGtleSkpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgYWN0dWFsID0gbm9ybWFsaXplSGlkZGVuVmFsdWUoZWwuZ2V0QXR0cmlidXRlKGtleSkpO1xuICAgICAgZXhwZWN0ZWQgPSBub3JtYWxpemVIaWRkZW5WYWx1ZShjbGllbnRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAgIGFjdHVhbCA9IGVsLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgICAgZXhwZWN0ZWQgPSBpbmNsdWRlQm9vbGVhbkF0dHIoY2xpZW50VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY2xpZW50VmFsdWUgPT0gbnVsbCkge1xuICAgICAgYWN0dWFsID0gZWwuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgICBleHBlY3RlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJ2YWx1ZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICBhY3R1YWwgPSBlbC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZXhwZWN0ZWQgPSBpc1JlbmRlcmFibGVBdHRyVmFsdWUoY2xpZW50VmFsdWUpID8gU3RyaW5nKGNsaWVudFZhbHVlKSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gNCAvKiBBVFRSSUJVVEUgKi87XG4gICAgICBtaXNtYXRjaEtleSA9IGtleTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc21hdGNoVHlwZSAhPSBudWxsICYmICFpc01pc21hdGNoQWxsb3dlZChlbCwgbWlzbWF0Y2hUeXBlKSkge1xuICAgIGNvbnN0IGZvcm1hdCA9ICh2KSA9PiB2ID09PSBmYWxzZSA/IGAobm90IHJlbmRlcmVkKWAgOiBgJHttaXNtYXRjaEtleX09XCIke3Z9XCJgO1xuICAgIGNvbnN0IHByZVNlZ21lbnQgPSBgSHlkcmF0aW9uICR7TWlzbWF0Y2hUeXBlU3RyaW5nW21pc21hdGNoVHlwZV19IG1pc21hdGNoIG9uYDtcbiAgICBjb25zdCBwb3N0U2VnbWVudCA9IGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7Zm9ybWF0KGFjdHVhbCl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke2Zvcm1hdChleHBlY3RlZCl9XG4gIE5vdGU6IHRoaXMgbWlzbWF0Y2ggaXMgY2hlY2stb25seS4gVGhlIERPTSB3aWxsIG5vdCBiZSByZWN0aWZpZWQgaW4gcHJvZHVjdGlvbiBkdWUgdG8gcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuXG4gIFlvdSBzaG91bGQgZml4IHRoZSBzb3VyY2Ugb2YgdGhlIG1pc21hdGNoLmA7XG4gICAge1xuICAgICAgd2FybiQxKHByZVNlZ21lbnQsIGVsLCBwb3N0U2VnbWVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhpZGRlblZhbHVlKHZhbHVlKSB7XG4gIGlmICghaXNSZW5kZXJhYmxlQXR0clZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidW50aWwtZm91bmRcIiA/IFwidW50aWwtZm91bmRcIiA6IFwiXCI7XG4gIH1cbiAgcmV0dXJuIGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkgPyBcIlwiIDogZmFsc2U7XG59XG5mdW5jdGlvbiB0b0NsYXNzU2V0KHN0cikge1xuICByZXR1cm4gbmV3IFNldChzdHIudHJpbSgpLnNwbGl0KC9cXHMrLykpO1xufVxuZnVuY3Rpb24gaXNTZXRFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IHMgb2YgYSkge1xuICAgIGlmICghYi5oYXMocykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0b1N0eWxlTWFwKHN0cikge1xuICBjb25zdCBzdHlsZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzdHIuc3BsaXQoXCI7XCIpKSB7XG4gICAgbGV0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoXCI6XCIpO1xuICAgIGtleSA9IGtleS50cmltKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSAmJiB2YWx1ZS50cmltKCk7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgc3R5bGVNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVNYXA7XG59XG5mdW5jdGlvbiBpc01hcEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICBpZiAodmFsdWUgIT09IGIuZ2V0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNvbHZlQ3NzVmFycyhpbnN0YW5jZSwgdm5vZGUsIGV4cGVjdGVkTWFwKSB7XG4gIGNvbnN0IHJvb3QgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICBpZiAoaW5zdGFuY2UuZ2V0Q3NzVmFycyAmJiAodm5vZGUgPT09IHJvb3QgfHwgcm9vdCAmJiByb290LnR5cGUgPT09IEZyYWdtZW50ICYmIHJvb3QuY2hpbGRyZW4uaW5jbHVkZXModm5vZGUpKSkge1xuICAgIGNvbnN0IGNzc1ZhcnMgPSBpbnN0YW5jZS5nZXRDc3NWYXJzKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3NzVmFycykge1xuICAgICAgY29uc3QgdmFsdWUgPSBub3JtYWxpemVDc3NWYXJWYWx1ZShjc3NWYXJzW2tleV0pO1xuICAgICAgZXhwZWN0ZWRNYXAuc2V0KGAtLSR7Z2V0RXNjYXBlZENzc1Zhck5hbWUoa2V5LCBmYWxzZSl9YCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBpZiAodm5vZGUgPT09IHJvb3QgJiYgaW5zdGFuY2UucGFyZW50KSB7XG4gICAgcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UucGFyZW50LCBpbnN0YW5jZS52bm9kZSwgZXhwZWN0ZWRNYXApO1xuICB9XG59XG5jb25zdCBhbGxvd01pc21hdGNoQXR0ciA9IFwiZGF0YS1hbGxvdy1taXNtYXRjaFwiO1xuY29uc3QgTWlzbWF0Y2hUeXBlU3RyaW5nID0ge1xuICBbMCAvKiBURVhUICovXTogXCJ0ZXh0XCIsXG4gIFsxIC8qIENISUxEUkVOICovXTogXCJjaGlsZHJlblwiLFxuICBbMiAvKiBDTEFTUyAqL106IFwiY2xhc3NcIixcbiAgWzMgLyogU1RZTEUgKi9dOiBcInN0eWxlXCIsXG4gIFs0IC8qIEFUVFJJQlVURSAqL106IFwiYXR0cmlidXRlXCJcbn07XG5mdW5jdGlvbiBpc01pc21hdGNoQWxsb3dlZChlbCwgYWxsb3dlZFR5cGUpIHtcbiAgaWYgKGFsbG93ZWRUeXBlID09PSAwIC8qIFRFWFQgKi8gfHwgYWxsb3dlZFR5cGUgPT09IDEgLyogQ0hJTERSRU4gKi8pIHtcbiAgICB3aGlsZSAoZWwgJiYgIWVsLmhhc0F0dHJpYnV0ZShhbGxvd01pc21hdGNoQXR0cikpIHtcbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGlzTWlzbWF0Y2hBbGxvd2VkQnlBdHRyKFxuICAgIGVsICYmIGVsLmdldEF0dHJpYnV0ZShhbGxvd01pc21hdGNoQXR0ciksXG4gICAgYWxsb3dlZFR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzTWlzbWF0Y2hBbGxvd2VkQnlBdHRyKGFsbG93ZWRBdHRyLCBhbGxvd2VkVHlwZSkge1xuICBpZiAoYWxsb3dlZEF0dHIgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChhbGxvd2VkQXR0ciA9PT0gXCJcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpc3QgPSBhbGxvd2VkQXR0ci5zcGxpdChcIixcIik7XG4gICAgaWYgKGFsbG93ZWRUeXBlID09PSAwIC8qIFRFWFQgKi8gJiYgbGlzdC5pbmNsdWRlcyhcImNoaWxkcmVuXCIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3QuaW5jbHVkZXMoTWlzbWF0Y2hUeXBlU3RyaW5nW2FsbG93ZWRUeXBlXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTm9kZU1pc21hdGNoQWxsb3dlZChub2RlLCB2bm9kZSkge1xuICByZXR1cm4gaXNNaXNtYXRjaEFsbG93ZWQobm9kZS5wYXJlbnRFbGVtZW50LCAxIC8qIENISUxEUkVOICovKSB8fCBpc01pc21hdGNoQWxsb3dlZEJ5Tm9kZShub2RlKSB8fCBpc01pc21hdGNoQWxsb3dlZEJ5Vk5vZGUodm5vZGUpO1xufVxuZnVuY3Rpb24gaXNNaXNtYXRjaEFsbG93ZWRCeU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc01pc21hdGNoQWxsb3dlZEJ5QXR0cihcbiAgICBub2RlLmdldEF0dHJpYnV0ZShhbGxvd01pc21hdGNoQXR0ciksXG4gICAgMSAvKiBDSElMRFJFTiAqL1xuICApO1xufVxuZnVuY3Rpb24gaXNNaXNtYXRjaEFsbG93ZWRCeVZOb2RlKHsgcHJvcHMgfSkge1xuICBjb25zdCBhbGxvd2VkQXR0ciA9IHByb3BzICYmIHByb3BzW2FsbG93TWlzbWF0Y2hBdHRyXTtcbiAgcmV0dXJuIHR5cGVvZiBhbGxvd2VkQXR0ciA9PT0gXCJzdHJpbmdcIiAmJiBpc01pc21hdGNoQWxsb3dlZEJ5QXR0cihhbGxvd2VkQXR0ciwgMSAvKiBDSElMRFJFTiAqLyk7XG59XG5cbmNvbnN0IHJlcXVlc3RJZGxlQ2FsbGJhY2sgPSBnZXRHbG9iYWxUaGlzKCkucmVxdWVzdElkbGVDYWxsYmFjayB8fCAoKGNiKSA9PiBzZXRUaW1lb3V0KGNiLCAxKSk7XG5jb25zdCBjYW5jZWxJZGxlQ2FsbGJhY2sgPSBnZXRHbG9iYWxUaGlzKCkuY2FuY2VsSWRsZUNhbGxiYWNrIHx8ICgoaWQpID0+IGNsZWFyVGltZW91dChpZCkpO1xuY29uc3QgaHlkcmF0ZU9uSWRsZSA9ICh0aW1lb3V0ID0gMWU0KSA9PiAoaHlkcmF0ZSkgPT4ge1xuICBjb25zdCBpZCA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soaHlkcmF0ZSwgeyB0aW1lb3V0IH0pO1xuICByZXR1cm4gKCkgPT4gY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTtcbn07XG5mdW5jdGlvbiBlbGVtZW50SXNWaXNpYmxlSW5WaWV3cG9ydChlbCkge1xuICBjb25zdCB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHsgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGggfSA9IHdpbmRvdztcbiAgcmV0dXJuICh0b3AgPiAwICYmIHRvcCA8IGlubmVySGVpZ2h0IHx8IGJvdHRvbSA+IDAgJiYgYm90dG9tIDwgaW5uZXJIZWlnaHQpICYmIChsZWZ0ID4gMCAmJiBsZWZ0IDwgaW5uZXJXaWR0aCB8fCByaWdodCA+IDAgJiYgcmlnaHQgPCBpbm5lcldpZHRoKTtcbn1cbmNvbnN0IGh5ZHJhdGVPblZpc2libGUgPSAob3B0cykgPT4gKGh5ZHJhdGUsIGZvckVhY2gpID0+IHtcbiAgY29uc3Qgb2IgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlLmlzSW50ZXJzZWN0aW5nKSBjb250aW51ZTtcbiAgICAgIG9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSwgb3B0cyk7XG4gIGZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKCEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgIGlmIChlbGVtZW50SXNWaXNpYmxlSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIG9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2Iub2JzZXJ2ZShlbCk7XG4gIH0pO1xuICByZXR1cm4gKCkgPT4gb2IuZGlzY29ubmVjdCgpO1xufTtcbmNvbnN0IGh5ZHJhdGVPbk1lZGlhUXVlcnkgPSAocXVlcnkpID0+IChoeWRyYXRlKSA9PiB7XG4gIGlmIChxdWVyeSkge1xuICAgIGNvbnN0IG1xbCA9IG1hdGNoTWVkaWEocXVlcnkpO1xuICAgIGlmIChtcWwubWF0Y2hlcykge1xuICAgICAgaHlkcmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBoeWRyYXRlLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgaHlkcmF0ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3QgaHlkcmF0ZU9uSW50ZXJhY3Rpb24gPSAoaW50ZXJhY3Rpb25zID0gW10pID0+IChoeWRyYXRlLCBmb3JFYWNoKSA9PiB7XG4gIGlmIChpc1N0cmluZyhpbnRlcmFjdGlvbnMpKSBpbnRlcmFjdGlvbnMgPSBbaW50ZXJhY3Rpb25zXTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGRvSHlkcmF0ZSA9IChlKSA9PiB7XG4gICAgaWYgKCFoYXNIeWRyYXRlZCkge1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgdGVhcmRvd24oKTtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLCBlKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB0ZWFyZG93biA9ICgpID0+IHtcbiAgICBmb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGksIGRvSHlkcmF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZvckVhY2goKGVsKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihpLCBkb0h5ZHJhdGUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGVhcmRvd247XG59O1xuZnVuY3Rpb24gZm9yRWFjaEVsZW1lbnQobm9kZSwgY2IpIHtcbiAgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiKSB7XG4gICAgbGV0IGRlcHRoID0gMTtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNiKG5leHQpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tbWVudChuZXh0KSkge1xuICAgICAgICBpZiAobmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgICAgIGlmICgtLWRlcHRoID09PSAwKSBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0LmRhdGEgPT09IFwiW1wiKSB7XG4gICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNiKG5vZGUpO1xuICB9XG59XG5cbmNvbnN0IGlzQXN5bmNXcmFwcGVyID0gKGkpID0+ICEhaS50eXBlLl9fYXN5bmNMb2FkZXI7XG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIGh5ZHJhdGU6IGh5ZHJhdGVTdHJhdGVneSxcbiAgICB0aW1lb3V0LFxuICAgIC8vIHVuZGVmaW5lZCA9IG5ldmVyIHRpbWVzIG91dFxuICAgIHN1c3BlbnNpYmxlID0gdHJ1ZSxcbiAgICBvbkVycm9yOiB1c2VyT25FcnJvclxuICB9ID0gc291cmNlO1xuICBsZXQgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICBsZXQgcmVzb2x2ZWRDb21wO1xuICBsZXQgcmV0cmllcyA9IDA7XG4gIGNvbnN0IHJldHJ5ID0gKCkgPT4ge1xuICAgIHJldHJpZXMrKztcbiAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgcmV0dXJuIGxvYWQoKTtcbiAgfTtcbiAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICBsZXQgdGhpc1JlcXVlc3Q7XG4gICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0IHx8ICh0aGlzUmVxdWVzdCA9IHBlbmRpbmdSZXF1ZXN0ID0gbG9hZGVyKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpO1xuICAgICAgaWYgKHVzZXJPbkVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlclJldHJ5ID0gKCkgPT4gcmVzb2x2ZShyZXRyeSgpKTtcbiAgICAgICAgICBjb25zdCB1c2VyRmFpbCA9ICgpID0+IHJlamVjdChlcnIpO1xuICAgICAgICAgIHVzZXJPbkVycm9yKGVyciwgdXNlclJldHJ5LCB1c2VyRmFpbCwgcmV0cmllcyArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KS50aGVuKChjb21wKSA9PiB7XG4gICAgICBpZiAodGhpc1JlcXVlc3QgIT09IHBlbmRpbmdSZXF1ZXN0ICYmIHBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjb21wKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wICYmIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSBcIk1vZHVsZVwiKSkge1xuICAgICAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tcCAmJiAhaXNPYmplY3QoY29tcCkgJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRDb21wID0gY29tcDtcbiAgICAgIHJldHVybiBjb21wO1xuICAgIH0pKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmluZUNvbXBvbmVudCh7XG4gICAgbmFtZTogXCJBc3luY0NvbXBvbmVudFdyYXBwZXJcIixcbiAgICBfX2FzeW5jTG9hZGVyOiBsb2FkLFxuICAgIF9fYXN5bmNIeWRyYXRlKGVsLCBpbnN0YW5jZSwgaHlkcmF0ZSkge1xuICAgICAgY29uc3Qgd2FzQ29ubmVjdGVkID0gZWwuaXNDb25uZWN0ZWQ7XG4gICAgICBsZXQgcGF0Y2hlZCA9IGZhbHNlO1xuICAgICAgKGluc3RhbmNlLmJ1IHx8IChpbnN0YW5jZS5idSA9IFtdKSkucHVzaCgoKSA9PiBwYXRjaGVkID0gdHJ1ZSk7XG4gICAgICBjb25zdCBwZXJmb3JtSHlkcmF0ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGNoZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgU2tpcHBpbmcgbGF6eSBoeWRyYXRpb24gZm9yIGNvbXBvbmVudCAnJHtnZXRDb21wb25lbnROYW1lKHJlc29sdmVkQ29tcCkgfHwgcmVzb2x2ZWRDb21wLl9fZmlsZX0nOiBpdCB3YXMgdXBkYXRlZCBiZWZvcmUgbGF6eSBoeWRyYXRpb24gcGVyZm9ybWVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVsLnBhcmVudE5vZGUgfHwgd2FzQ29ubmVjdGVkICYmICFlbC5pc0Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgICAgICBoeWRyYXRlKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZG9IeWRyYXRlID0gaHlkcmF0ZVN0cmF0ZWd5ID8gKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZWFyZG93biA9IGh5ZHJhdGVTdHJhdGVneShcbiAgICAgICAgICBwZXJmb3JtSHlkcmF0ZSxcbiAgICAgICAgICAoY2IpID0+IGZvckVhY2hFbGVtZW50KGVsLCBjYilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRlYXJkb3duKSB7XG4gICAgICAgICAgKGluc3RhbmNlLmJ1bSB8fCAoaW5zdGFuY2UuYnVtID0gW10pKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgICAgfVxuICAgICAgfSA6IHBlcmZvcm1IeWRyYXRlO1xuICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICBkb0h5ZHJhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWQoKS50aGVuKCgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBkb0h5ZHJhdGUoKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXQgX19hc3luY1Jlc29sdmVkKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQ29tcDtcbiAgICB9LFxuICAgIHNldHVwKCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICBtYXJrQXN5bmNCb3VuZGFyeShpbnN0YW5jZSk7XG4gICAgICBpZiAocmVzb2x2ZWRDb21wKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGhhbmRsZUVycm9yKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAxMyxcbiAgICAgICAgICAhZXJyb3JDb21wb25lbnRcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGxldCB0aW1lb3V0VGltZXI7XG4gICAgICBsZXQgZGVsYXlUaW1lcjtcbiAgICAgIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRpbWVvdXRUaW1lciAhPSBudWxsKSBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKTtcbiAgICAgICAgaWYgKGRlbGF5VGltZXIgIT0gbnVsbCkgY2xlYXJUaW1lb3V0KGRlbGF5VGltZXIpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgZGVsYXlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCkgcmV0dXJuO1xuICAgICAgICAgIGRlbGF5ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICB0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIWxvYWRlZC52YWx1ZSAmJiAhZXJyb3IudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgbG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgaW5zdGFuY2UucGFyZW50LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZC52YWx1ZSAmJiByZXNvbHZlZENvbXApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUlubmVyQ29tcChcbiAgICAgICAgICAgIGxvYWRpbmdDb21wb25lbnQsXG4gICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUlubmVyQ29tcChjb21wLCBwYXJlbnQpIHtcbiAgY29uc3QgeyByZWY6IHJlZjIsIHByb3BzLCBjaGlsZHJlbiwgY2UgfSA9IHBhcmVudC52bm9kZTtcbiAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShjb21wLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5yZWYgPSByZWYyO1xuICB2bm9kZS5jZSA9IGNlO1xuICBkZWxldGUgcGFyZW50LnZub2RlLmNlO1xuICByZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IGlzS2VlcEFsaXZlID0gKHZub2RlKSA9PiB2bm9kZS50eXBlLl9faXNLZWVwQWxpdmU7XG5jb25zdCBLZWVwQWxpdmVJbXBsID0ge1xuICBuYW1lOiBgS2VlcEFsaXZlYCxcbiAgLy8gTWFya2VyIGZvciBzcGVjaWFsIGhhbmRsaW5nIGluc2lkZSB0aGUgcmVuZGVyZXIuIFdlIGFyZSBub3QgdXNpbmcgYSA9PT1cbiAgLy8gY2hlY2sgZGlyZWN0bHkgb24gS2VlcEFsaXZlIGluIHRoZSByZW5kZXJlciwgYmVjYXVzZSBpbXBvcnRpbmcgaXQgZGlyZWN0bHlcbiAgLy8gd291bGQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHRyZWUtc2hha2VuLlxuICBfX2lzS2VlcEFsaXZlOiB0cnVlLFxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIGV4Y2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzaGFyZWRDb250ZXh0ID0gaW5zdGFuY2UuY3R4O1xuICAgIGlmICghc2hhcmVkQ29udGV4dC5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSA/IGNoaWxkcmVuWzBdIDogY2hpbGRyZW47XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3Qga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGV0IGN1cnJlbnQgPSBudWxsO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaW5zdGFuY2UuX192X2NhY2hlID0gY2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFN1c3BlbnNlID0gaW5zdGFuY2Uuc3VzcGVuc2U7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyZXI6IHtcbiAgICAgICAgcDogcGF0Y2gsXG4gICAgICAgIG06IG1vdmUsXG4gICAgICAgIHVtOiBfdW5tb3VudCxcbiAgICAgICAgbzogeyBjcmVhdGVFbGVtZW50IH1cbiAgICAgIH1cbiAgICB9ID0gc2hhcmVkQ29udGV4dDtcbiAgICBjb25zdCBzdG9yYWdlQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBzaGFyZWRDb250ZXh0LmFjdGl2YXRlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCAwLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgaW5zdGFuY2UyLnZub2RlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGluc3RhbmNlMixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UyLmEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZU1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICBkZXZ0b29sc0NvbXBvbmVudEFkZGVkKGluc3RhbmNlMik7XG4gICAgICB9XG4gICAgfTtcbiAgICBzaGFyZWRDb250ZXh0LmRlYWN0aXZhdGUgPSAodm5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIGludmFsaWRhdGVNb3VudChpbnN0YW5jZTIubSk7XG4gICAgICBpbnZhbGlkYXRlTW91bnQoaW5zdGFuY2UyLmEpO1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgICAgICBpbnN0YW5jZTIuX19rZWVwQWxpdmVTdG9yYWdlQ29udGFpbmVyID0gc3RvcmFnZUNvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHVubW91bnQodm5vZGUpIHtcbiAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgIF91bm1vdW50KHZub2RlLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlKGZpbHRlcikge1xuICAgICAgY2FjaGUuZm9yRWFjaCgodm5vZGUsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpc0FzeW5jV3JhcHBlcih2bm9kZSkgPyB2bm9kZS50eXBlLl9fYXN5bmNSZXNvbHZlZCB8fCB7fSA6IHZub2RlLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgIWZpbHRlcihuYW1lKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5KGtleSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAoY2FjaGVkICYmICghY3VycmVudCB8fCAhaXNTYW1lVk5vZGVUeXBlKGNhY2hlZCwgY3VycmVudCkpKSB7XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgICByZXNldFNoYXBlRmxhZyhjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sXG4gICAgICAoW2luY2x1ZGUsIGV4Y2x1ZGVdKSA9PiB7XG4gICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSk7XG4gICAgICAgIGV4Y2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgfSxcbiAgICAgIC8vIHBydW5lIHBvc3QtcmVuZGVyIGFmdGVyIGBjdXJyZW50YCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiwgZGVlcDogdHJ1ZSB9XG4gICAgKTtcbiAgICBsZXQgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICBjb25zdCBjYWNoZVN1YnRyZWUgPSAoKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzU3VzcGVuc2UoaW5zdGFuY2Uuc3ViVHJlZS50eXBlKSkge1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSk7XG4gICAgICAgICAgICBpZiAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIHZub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBpbnN0YW5jZS5zdWJUcmVlLnN1c3BlbnNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZS5zZXQocGVuZGluZ0NhY2hlS2V5LCBnZXRJbm5lckNoaWxkKGluc3RhbmNlLnN1YlRyZWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgb25Nb3VudGVkKGNhY2hlU3VidHJlZSk7XG4gICAgb25VcGRhdGVkKGNhY2hlU3VidHJlZSk7XG4gICAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICAgIGNhY2hlLmZvckVhY2goKGNhY2hlZCkgPT4ge1xuICAgICAgICBjb25zdCB7IHN1YlRyZWUsIHN1c3BlbnNlIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3Qgdm5vZGUgPSBnZXRJbm5lckNoaWxkKHN1YlRyZWUpO1xuICAgICAgICBpZiAoY2FjaGVkLnR5cGUgPT09IHZub2RlLnR5cGUgJiYgY2FjaGVkLmtleSA9PT0gdm5vZGUua2V5KSB7XG4gICAgICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgICAgIGNvbnN0IGRhID0gdm5vZGUuY29tcG9uZW50LmRhO1xuICAgICAgICAgIGRhICYmIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChkYSwgc3VzcGVuc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICAgIGlmICghc2xvdHMuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHJhd1ZOb2RlID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgfSBlbHNlIGlmICghaXNWTm9kZShyYXdWTm9kZSkgfHwgIShyYXdWTm9kZS5zaGFwZUZsYWcgJiA0KSAmJiAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCkpIHtcbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZSA9IGdldElubmVyQ2hpbGQocmF3Vk5vZGUpO1xuICAgICAgaWYgKHZub2RlLnR5cGUgPT09IENvbW1lbnQpIHtcbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXAgPSB2bm9kZS50eXBlO1xuICAgICAgY29uc3QgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIGlzQXN5bmNXcmFwcGVyKHZub2RlKSA/IHZub2RlLnR5cGUuX19hc3luY1Jlc29sdmVkIHx8IHt9IDogY29tcFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaW5jbHVkZSwgZXhjbHVkZSwgbWF4IH0gPSBwcm9wcztcbiAgICAgIGlmIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkgfHwgZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpIHtcbiAgICAgICAgdm5vZGUuc2hhcGVGbGFnICY9IC0yNTc7XG4gICAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdm5vZGUua2V5ID09IG51bGwgPyBjb21wIDogdm5vZGUua2V5O1xuICAgICAgY29uc3QgY2FjaGVkVk5vZGUgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmICh2bm9kZS5lbCkge1xuICAgICAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgICAgICBpZiAocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgcmF3Vk5vZGUuc3NDb250ZW50ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IGtleTtcbiAgICAgIGlmIChjYWNoZWRWTm9kZSkge1xuICAgICAgICB2bm9kZS5lbCA9IGNhY2hlZFZOb2RlLmVsO1xuICAgICAgICB2bm9kZS5jb21wb25lbnQgPSBjYWNoZWRWTm9kZS5jb21wb25lbnQ7XG4gICAgICAgIGlmICh2bm9kZS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gNTEyO1xuICAgICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaWYgKG1heCAmJiBrZXlzLnNpemUgPiBwYXJzZUludChtYXgsIDEwKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSAyNTY7XG4gICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICByZXR1cm4gaXNTdXNwZW5zZShyYXdWTm9kZS50eXBlKSA/IHJhd1ZOb2RlIDogdm5vZGU7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEtlZXBBbGl2ZSA9IEtlZXBBbGl2ZUltcGw7XG5mdW5jdGlvbiBtYXRjaGVzKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKGlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKChwKSA9PiBtYXRjaGVzKHAsIG5hbWUpKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhuYW1lKTtcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uQWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBvbkRlYWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJkYVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIHR5cGUsIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkge1xuICBjb25zdCB3cmFwcGVkSG9vayA9IGhvb2suX193ZGMgfHwgKGhvb2suX193ZGMgPSAoKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChjdXJyZW50LmlzRGVhY3RpdmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gaG9vaygpO1xuICB9KTtcbiAgaW5qZWN0SG9vayh0eXBlLCB3cmFwcGVkSG9vaywgdGFyZ2V0KTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0LnBhcmVudDtcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudCkge1xuICAgICAgaWYgKGlzS2VlcEFsaXZlKGN1cnJlbnQucGFyZW50LnZub2RlKSkge1xuICAgICAgICBpbmplY3RUb0tlZXBBbGl2ZVJvb3Qod3JhcHBlZEhvb2ssIHR5cGUsIHRhcmdldCwgY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbmplY3RUb0tlZXBBbGl2ZVJvb3QoaG9vaywgdHlwZSwgdGFyZ2V0LCBrZWVwQWxpdmVSb290KSB7XG4gIGNvbnN0IGluamVjdGVkID0gaW5qZWN0SG9vayhcbiAgICB0eXBlLFxuICAgIGhvb2ssXG4gICAga2VlcEFsaXZlUm9vdCxcbiAgICB0cnVlXG4gICAgLyogcHJlcGVuZCAqL1xuICApO1xuICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgcmVtb3ZlKGtlZXBBbGl2ZVJvb3RbdHlwZV0sIGluamVjdGVkKTtcbiAgfSwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlc2V0U2hhcGVGbGFnKHZub2RlKSB7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSAtMjU3O1xuICB2bm9kZS5zaGFwZUZsYWcgJj0gLTUxMztcbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmIDEyOCA/IHZub2RlLnNzQ29udGVudCA6IHZub2RlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RIb29rKHR5cGUsIGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSwgcHJlcGVuZCA9IGZhbHNlKSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCBob29rcyA9IHRhcmdldFt0eXBlXSB8fCAodGFyZ2V0W3R5cGVdID0gW10pO1xuICAgIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dlaCB8fCAoaG9vay5fX3dlaCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgdGFyZ2V0LCB0eXBlLCBhcmdzKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBob29rcy51bnNoaWZ0KHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkSG9vaztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4kMShcbiAgICAgIGAke2FwaU5hbWV9IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuYCArIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC5gIClcbiAgICApO1xuICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4ge1xuICBpZiAoIWlzSW5TU1JDb21wb25lbnRTZXR1cCB8fCBsaWZlY3ljbGUgPT09IFwic3BcIikge1xuICAgIGluamVjdEhvb2sobGlmZWN5Y2xlLCAoLi4uYXJncykgPT4gaG9vayguLi5hcmdzKSwgdGFyZ2V0KTtcbiAgfVxufTtcbmNvbnN0IG9uQmVmb3JlTW91bnQgPSBjcmVhdGVIb29rKFwiYm1cIik7XG5jb25zdCBvbk1vdW50ZWQgPSBjcmVhdGVIb29rKFwibVwiKTtcbmNvbnN0IG9uQmVmb3JlVXBkYXRlID0gY3JlYXRlSG9vayhcbiAgXCJidVwiXG4pO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIik7XG5jb25zdCBvbkJlZm9yZVVubW91bnQgPSBjcmVhdGVIb29rKFxuICBcImJ1bVwiXG4pO1xuY29uc3Qgb25Vbm1vdW50ZWQgPSBjcmVhdGVIb29rKFwidW1cIik7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcbiAgXCJzcFwiXG4pO1xuY29uc3Qgb25SZW5kZXJUcmlnZ2VyZWQgPSBjcmVhdGVIb29rKFwicnRnXCIpO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcInJ0Y1wiKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgaW5qZWN0SG9vayhcImVjXCIsIGhvb2ssIHRhcmdldCk7XG59XG5cbmNvbnN0IENPTVBPTkVOVFMgPSBcImNvbXBvbmVudHNcIjtcbmNvbnN0IERJUkVDVElWRVMgPSBcImRpcmVjdGl2ZXNcIjtcbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnQobmFtZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgbmFtZSwgdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB8fCBuYW1lO1xufVxuY29uc3QgTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwidi1uZGNcIik7XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIGNvbXBvbmVudCwgZmFsc2UpIHx8IGNvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUobmFtZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KERJUkVDVElWRVMsIG5hbWUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0KHR5cGUsIG5hbWUsIHdhcm5NaXNzaW5nID0gdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEluc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZk5hbWUgJiYgKHNlbGZOYW1lID09PSBuYW1lIHx8IHNlbGZOYW1lID09PSBjYW1lbGl6ZShuYW1lKSB8fCBzZWxmTmFtZSA9PT0gY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSkpKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IChcbiAgICAgIC8vIGxvY2FsIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gY2hlY2sgaW5zdGFuY2VbdHlwZV0gZmlyc3Qgd2hpY2ggaXMgcmVzb2x2ZWQgZm9yIG9wdGlvbnMgQVBJXG4gICAgICByZXNvbHZlKGluc3RhbmNlW3R5cGVdIHx8IENvbXBvbmVudFt0eXBlXSwgbmFtZSkgfHwgLy8gZ2xvYmFsIHJlZ2lzdHJhdGlvblxuICAgICAgcmVzb2x2ZShpbnN0YW5jZS5hcHBDb250ZXh0W3R5cGVdLCBuYW1lKVxuICAgICk7XG4gICAgaWYgKCFyZXMgJiYgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgICBjb25zdCBleHRyYSA9IHR5cGUgPT09IENPTVBPTkVOVFMgPyBgXG5JZiB0aGlzIGlzIGEgbmF0aXZlIGN1c3RvbSBlbGVtZW50LCBtYWtlIHN1cmUgdG8gZXhjbHVkZSBpdCBmcm9tIGNvbXBvbmVudCByZXNvbHV0aW9uIHZpYSBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50LmAgOiBgYDtcbiAgICAgIHdhcm4kMShgRmFpbGVkIHRvIHJlc29sdmUgJHt0eXBlLnNsaWNlKDAsIC0xKX06ICR7bmFtZX0ke2V4dHJhfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgcmVzb2x2ZSR7Y2FwaXRhbGl6ZSh0eXBlLnNsaWNlKDAsIC0xKSl9IGNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICByZXR1cm4gcmVnaXN0cnkgJiYgKHJlZ2lzdHJ5W25hbWVdIHx8IHJlZ2lzdHJ5W2NhbWVsaXplKG5hbWUpXSB8fCByZWdpc3RyeVtjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKV0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KHNvdXJjZSwgcmVuZGVySXRlbSwgY2FjaGUsIGluZGV4KSB7XG4gIGxldCByZXQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlICYmIGNhY2hlW2luZGV4XTtcbiAgY29uc3Qgc291cmNlSXNBcnJheSA9IGlzQXJyYXkoc291cmNlKTtcbiAgaWYgKHNvdXJjZUlzQXJyYXkgfHwgaXNTdHJpbmcoc291cmNlKSkge1xuICAgIGNvbnN0IHNvdXJjZUlzUmVhY3RpdmVBcnJheSA9IHNvdXJjZUlzQXJyYXkgJiYgaXNSZWFjdGl2ZShzb3VyY2UpO1xuICAgIGxldCBuZWVkc1dyYXAgPSBmYWxzZTtcbiAgICBsZXQgaXNSZWFkb25seVNvdXJjZSA9IGZhbHNlO1xuICAgIGlmIChzb3VyY2VJc1JlYWN0aXZlQXJyYXkpIHtcbiAgICAgIG5lZWRzV3JhcCA9ICFpc1NoYWxsb3coc291cmNlKTtcbiAgICAgIGlzUmVhZG9ubHlTb3VyY2UgPSBpc1JlYWRvbmx5KHNvdXJjZSk7XG4gICAgICBzb3VyY2UgPSBzaGFsbG93UmVhZEFycmF5KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldCA9IG5ldyBBcnJheShzb3VyY2UubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNvdXJjZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oXG4gICAgICAgIG5lZWRzV3JhcCA/IGlzUmVhZG9ubHlTb3VyY2UgPyB0b1JlYWRvbmx5KHRvUmVhY3RpdmUoc291cmNlW2ldKSkgOiB0b1JlYWN0aXZlKHNvdXJjZVtpXSkgOiBzb3VyY2VbaV0sXG4gICAgICAgIGksXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgY2FjaGVkICYmIGNhY2hlZFtpXVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICghTnVtYmVyLmlzSW50ZWdlcihzb3VyY2UpIHx8IHNvdXJjZSA8IDApKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBUaGUgdi1mb3IgcmFuZ2UgZXhwZWN0cyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgYnV0IGdvdCAke3NvdXJjZX0uYFxuICAgICAgKTtcbiAgICAgIHJldCA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlOyBpKyspIHtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShpICsgMSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGlmIChzb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gQXJyYXkuZnJvbShcbiAgICAgICAgc291cmNlLFxuICAgICAgICAoaXRlbSwgaSkgPT4gcmVuZGVySXRlbShpdGVtLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oc291cmNlW2tleV0sIGtleSwgaSwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlW2luZGV4XSA9IHJldDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTbG90cyhzbG90cywgZHluYW1pY1Nsb3RzKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Nsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2xvdCA9IGR5bmFtaWNTbG90c1tpXTtcbiAgICBpZiAoaXNBcnJheShzbG90KSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzbG90Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHNsb3RzW3Nsb3Rbal0ubmFtZV0gPSBzbG90W2pdLmZuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2xvdCkge1xuICAgICAgc2xvdHNbc2xvdC5uYW1lXSA9IHNsb3Qua2V5ID8gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gc2xvdC5mbiguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlcykgcmVzLmtleSA9IHNsb3Qua2V5O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSA6IHNsb3QuZm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2xvdChzbG90cywgbmFtZSwgcHJvcHMsIGZhbGxiYWNrLCBub1Nsb3R0ZWQsIGJyYW5jaEtleSkge1xuICBpZiAocHJvcHMgPT0gbnVsbCkgcHJvcHMgPSB7fTtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50ICYmIGlzQXN5bmNXcmFwcGVyKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQuY2UpIHtcbiAgICBjb25zdCBzbG90UHJvcHMgPSBicmFuY2hLZXkgIT0gbnVsbCAmJiBwcm9wcy5rZXkgPT0gbnVsbCA/IGV4dGVuZCh7fSwgcHJvcHMsIHsga2V5OiBicmFuY2hLZXkgfSkgOiBwcm9wcztcbiAgICBjb25zdCBoYXNQcm9wcyA9IE9iamVjdC5rZXlzKHNsb3RQcm9wcykubGVuZ3RoID4gMDtcbiAgICBpZiAobmFtZSAhPT0gXCJkZWZhdWx0XCIpIHNsb3RQcm9wcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gb3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKFxuICAgICAgRnJhZ21lbnQsXG4gICAgICBudWxsLFxuICAgICAgW2NyZWF0ZVZOb2RlKFwic2xvdFwiLCBzbG90UHJvcHMsIGZhbGxiYWNrICYmIGZhbGxiYWNrKCkpXSxcbiAgICAgIGhhc1Byb3BzID8gLTIgOiA2NFxuICAgICk7XG4gIH1cbiAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2xvdCAmJiBzbG90Lmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmV2U3RhY2tTaXplID0gYmxvY2tTdGFjay5sZW5ndGg7XG4gIG9wZW5CbG9jaygpO1xuICBsZXQgcmVuZGVyZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gICAgY29uc3Qgc2xvdEtleSA9IHByb3BzLmtleSB8fCBicmFuY2hLZXkgfHwgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgLy8ga2V5IGF0dGFjaGVkIGluIHRoZSBgY3JlYXRlU2xvdHNgIGhlbHBlciwgcmVzcGVjdCB0aGF0XG4gICAgdmFsaWRTbG90Q29udGVudCAmJiB2YWxpZFNsb3RDb250ZW50LmtleTtcbiAgICByZW5kZXJlZCA9IGNyZWF0ZUJsb2NrKFxuICAgICAgRnJhZ21lbnQsXG4gICAgICB7XG4gICAgICAgIGtleTogKHNsb3RLZXkgJiYgIWlzU3ltYm9sKHNsb3RLZXkpID8gc2xvdEtleSA6IGBfJHtuYW1lfWApICsgLy8gIzcyNTYgZm9yY2UgZGlmZmVyZW50aWF0ZSBmYWxsYmFjayBjb250ZW50IGZyb20gYWN0dWFsIGNvbnRlbnRcbiAgICAgICAgKCF2YWxpZFNsb3RDb250ZW50ICYmIGZhbGxiYWNrID8gXCJfZmJcIiA6IFwiXCIpXG4gICAgICB9LFxuICAgICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgICAgdmFsaWRTbG90Q29udGVudCAmJiBzbG90cy5fID09PSAxID8gNjQgOiAtMlxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZvciAobGV0IGkgPSBibG9ja1N0YWNrLmxlbmd0aDsgaSA+IHByZXZTdGFja1NpemU7IGktLSkgY2xvc2VCbG9jaygpO1xuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgICBzbG90Ll9kID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5mdW5jdGlvbiBlbnN1cmVWYWxpZFZOb2RlKHZub2Rlcykge1xuICByZXR1cm4gdm5vZGVzLnNvbWUoKGNoaWxkKSA9PiB7XG4gICAgaWYgKCFpc1ZOb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuJDEoYHYtb24gd2l0aCBubyBhcmd1bWVudCBleHBlY3RzIGFuIG9iamVjdCB2YWx1ZS5gKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJldFtwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSAmJiAvW0EtWl0vLnRlc3Qoa2V5KSA/IGBvbjoke2tleX1gIDogdG9IYW5kbGVyS2V5KGtleSldID0gb2JqW2tleV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuY29uc3QgZ2V0UHVibGljSW5zdGFuY2UgPSAoaSkgPT4ge1xuICBpZiAoIWkpIHJldHVybiBudWxsO1xuICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSkgcmV0dXJuIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGkpO1xuICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoaS5wYXJlbnQpO1xufTtcbmNvbnN0IHJlc29sdmVEZXZSb290RWwgPSAodm5vZGUpID0+IHtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgY29uc3Qgcm9vdCA9IGZpbHRlclNpbmdsZVJvb3Qodm5vZGUuY2hpbGRyZW4pO1xuICAgICAgaWYgKCFyb290KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZub2RlID0gcm9vdDtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnQgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuc3ViVHJlZSkge1xuICAgICAgdm5vZGUgPSBjb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIGlmIChzdXNwZW5zZSAmJiBzdXNwZW5zZS5hY3RpdmVCcmFuY2gpIHtcbiAgICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZCA/IHZub2RlLmVsIDogdm9pZCAwO1xuICB9XG59O1xuY29uc3QgZ2V0RGV2Um9vdEZyYWdtZW50RWwgPSAoaSkgPT4ge1xuICBjb25zdCBlbCA9IGkuc3ViVHJlZSAmJiByZXNvbHZlRGV2Um9vdEVsKGkuc3ViVHJlZSk7XG4gIHJldHVybiBlbCA9PT0gdm9pZCAwID8gaS52bm9kZS5lbCA6IGVsO1xufTtcbmNvbnN0IHB1YmxpY1Byb3BlcnRpZXNNYXAgPSAoXG4gIC8vIE1vdmUgUFVSRSBtYXJrZXIgdG8gbmV3IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21waWxlciBkaXNjYXJkaW5nIGl0XG4gIC8vIGR1ZSB0byB0eXBlIGFubm90YXRpb25cbiAgLyogQF9fUFVSRV9fICovIGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwge1xuICAgICQ6IChpKSA9PiBpLFxuICAgICRlbDogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBnZXREZXZSb290RnJhZ21lbnRFbChpKSA6IGkudm5vZGUuZWwsXG4gICAgJGRhdGE6IChpKSA9PiBpLmRhdGEsXG4gICAgJHByb3BzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnByb3BzKSA6IGkucHJvcHMsXG4gICAgJGF0dHJzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLmF0dHJzKSA6IGkuYXR0cnMsXG4gICAgJHNsb3RzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnNsb3RzKSA6IGkuc2xvdHMsXG4gICAgJHJlZnM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkucmVmcykgOiBpLnJlZnMsXG4gICAgJHBhcmVudDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KSxcbiAgICAkcm9vdDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucm9vdCksXG4gICAgJGhvc3Q6IChpKSA9PiBpLmNlLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0LFxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4ge1xuICAgICAgcXVldWVKb2IoaS51cGRhdGUpO1xuICAgIH0pLFxuICAgICRuZXh0VGljazogKGkpID0+IGkubiB8fCAoaS5uID0gbmV4dFRpY2suYmluZChpLnByb3h5KSksXG4gICAgJHdhdGNoOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1BcbiAgfSlcbik7XG5jb25zdCBpc1Jlc2VydmVkUHJlZml4ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJFwiO1xuY29uc3QgaGFzU2V0dXBCaW5kaW5nID0gKHN0YXRlLCBrZXkpID0+IHN0YXRlICE9PSBFTVBUWV9PQkogJiYgIXN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc3RhdGUsIGtleSk7XG5jb25zdCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSB7XG4gIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiX192X3NraXBcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlLCBkYXRhLCBwcm9wcywgYWNjZXNzQ2FjaGUsIHR5cGUsIGFwcENvbnRleHQgfSA9IGluc3RhbmNlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCJfX2lzVnVlXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5WzBdICE9PSBcIiRcIikge1xuICAgICAgY29uc3QgbiA9IGFjY2Vzc0NhY2hlW2tleV07XG4gICAgICBpZiAobiAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgIGNhc2UgMSAvKiBTRVRVUCAqLzpcbiAgICAgICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICAgICAgY2FzZSAyIC8qIERBVEEgKi86XG4gICAgICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgICAgIGNhc2UgNCAvKiBDT05URVhUICovOlxuICAgICAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgICAgIGNhc2UgMyAvKiBQUk9QUyAqLzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAxIC8qIFNFVFVQICovO1xuICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmIGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMiAvKiBEQVRBICovO1xuICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDMgLyogUFJPUFMgKi87XG4gICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoIV9fVlVFX09QVElPTlNfQVBJX18gfHwgc2hvdWxkQ2FjaGVBY2Nlc3MpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDAgLyogT1RIRVIgKi87XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY0dldHRlciA9IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XTtcbiAgICBsZXQgY3NzTW9kdWxlLCBnbG9iYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChwdWJsaWNHZXR0ZXIpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiJGF0dHJzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UuYXR0cnMsIFwiZ2V0XCIsIFwiXCIpO1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIiRzbG90c1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHB1YmxpY0dldHRlcihpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGNzcyBtb2R1bGUgKGluamVjdGVkIGJ5IHZ1ZS1sb2FkZXIpXG4gICAgICAoY3NzTW9kdWxlID0gdHlwZS5fX2Nzc01vZHVsZXMpICYmIChjc3NNb2R1bGUgPSBjc3NNb2R1bGVba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBjc3NNb2R1bGU7XG4gICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgZ2xvYmFsUHJvcGVydGllcyA9IGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGhhc093bihnbG9iYWxQcm9wZXJ0aWVzLCBrZXkpXG4gICAgKSB7XG4gICAgICB7XG4gICAgICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSAmJiAoIWlzU3RyaW5nKGtleSkgfHwgLy8gIzEwOTEgYXZvaWQgaW50ZXJuYWwgaXNSZWYvaXNWTm9kZSBjaGVja3Mgb24gY29tcG9uZW50IGluc3RhbmNlIGxlYWRpbmdcbiAgICAvLyB0byBpbmZpbml0ZSB3YXJuaW5nIGxvb3BcbiAgICBrZXkuaW5kZXhPZihcIl9fdlwiKSAhPT0gMCkpIHtcbiAgICAgIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCBjaGFyYWN0ZXIgKFwiJFwiIG9yIFwiX1wiKSBhbmQgaXMgbm90IHByb3hpZWQgb24gdGhlIHJlbmRlciBjb250ZXh0LmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UgPT09IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHNldCh7IF86IGluc3RhbmNlIH0sIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICBzZXR1cFN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgd2FybiQxKGBDYW5ub3QgbXV0YXRlIDxzY3JpcHQgc2V0dXA+IGJpbmRpbmcgXCIke2tleX1cIiBmcm9tIE9wdGlvbnMgQVBJLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiBkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oaW5zdGFuY2UucHJvcHMsIGtleSkpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwcm9wIFwiJHtrZXl9XCIuIFByb3BzIGFyZSByZWFkb25seS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGtleVswXSA9PT0gXCIkXCIgJiYga2V5LnNsaWNlKDEpIGluIGluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHB1YmxpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiLiBQcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggJCBhcmUgcmVzZXJ2ZWQgYW5kIHJlYWRvbmx5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGhhcyh7XG4gICAgXzogeyBkYXRhLCBzZXR1cFN0YXRlLCBhY2Nlc3NDYWNoZSwgY3R4LCBhcHBDb250ZXh0LCBwcm9wcywgdHlwZSB9XG4gIH0sIGtleSkge1xuICAgIGxldCBjc3NNb2R1bGVzO1xuICAgIHJldHVybiAhIShhY2Nlc3NDYWNoZVtrZXldIHx8IF9fVlVFX09QVElPTlNfQVBJX18gJiYgZGF0YSAhPT0gRU1QVFlfT0JKICYmIGtleVswXSAhPT0gXCIkXCIgJiYgaGFzT3duKGRhdGEsIGtleSkgfHwgaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkgfHwgaGFzT3duKHByb3BzLCBrZXkpIHx8IGhhc093bihjdHgsIGtleSkgfHwgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHwgaGFzT3duKGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGtleSkgfHwgKGNzc01vZHVsZXMgPSB0eXBlLl9fY3NzTW9kdWxlcykgJiYgY3NzTW9kdWxlc1trZXldKTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICBpZiAoZGVzY3JpcHRvci5nZXQgIT0gbnVsbCkge1xuICAgICAgdGFyZ2V0Ll8uYWNjZXNzQ2FjaGVba2V5XSA9IDA7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oZGVzY3JpcHRvciwgXCJ2YWx1ZVwiKSkge1xuICAgICAgdGhpcy5zZXQodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IudmFsdWUsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5vd25LZXlzID0gKHRhcmdldCkgPT4ge1xuICAgIHdhcm4kMShcbiAgICAgIGBBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuYFxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9O1xufVxuY29uc3QgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLCB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIGlmIChrZXkgPT09IFN5bWJvbC51bnNjb3BhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmdldCh0YXJnZXQsIGtleSwgdGFyZ2V0KTtcbiAgfSxcbiAgaGFzKF8sIGtleSkge1xuICAgIGNvbnN0IGhhcyA9IGtleVswXSAhPT0gXCJfXCIgJiYgIWlzR2xvYmFsbHlBbGxvd2VkKGtleSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAga2V5XG4gICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBfIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgcHJlZml4IGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBoYXM7XG4gIH1cbn0pO1xuZnVuY3Rpb24gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYF9gLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogKCkgPT4gaW5zdGFuY2VcbiAgfSk7XG4gIE9iamVjdC5rZXlzKHB1YmxpY1Byb3BlcnRpZXNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSksXG4gICAgICAvLyBpbnRlcmNlcHRlZCBieSB0aGUgcHJveHkgc28gbm8gbmVlZCBmb3IgaW1wbGVtZW50YXRpb24sXG4gICAgICAvLyBidXQgbmVlZGVkIHRvIHByZXZlbnQgc2V0IGVycm9yc1xuICAgICAgc2V0OiBOT09QXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGN0eCxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gIH0gPSBpbnN0YW5jZTtcbiAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgIE9iamVjdC5rZXlzKHByb3BzT3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUgfSA9IGluc3RhbmNlO1xuICBPYmplY3Qua2V5cyh0b1JhdyhzZXR1cFN0YXRlKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYHNldHVwKCkgcmV0dXJuIHByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXCIkXCIgb3IgXCJfXCIgd2hpY2ggYXJlIHJlc2VydmVkIHByZWZpeGVzIGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBzZXR1cFN0YXRlW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3Qgd2FyblJ1bnRpbWVVc2FnZSA9IChtZXRob2QpID0+IHdhcm4kMShcbiAgYCR7bWV0aG9kfSgpIGlzIGEgY29tcGlsZXItaGludCBoZWxwZXIgdGhhdCBpcyBvbmx5IHVzYWJsZSBpbnNpZGUgPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkIGF3YXkgYW5kIHBhc3NpbmcgaXQgYXQgcnVudGltZSBoYXMgbm8gZWZmZWN0LmBcbik7XG5mdW5jdGlvbiBkZWZpbmVQcm9wcygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVQcm9wc2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRW1pdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRW1pdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUV4cG9zZShleHBvc2VkKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRXhwb3NlYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZU9wdGlvbnMob3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZU9wdGlvbnNgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lU2xvdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lU2xvdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZU1vZGVsKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoXCJkZWZpbmVNb2RlbFwiKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHByb3BzLCBkZWZhdWx0cykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYHdpdGhEZWZhdWx0c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdXNlU2xvdHMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KFwidXNlU2xvdHNcIikuc2xvdHM7XG59XG5mdW5jdGlvbiB1c2VBdHRycygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoXCJ1c2VBdHRyc1wiKS5hdHRycztcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoY2FsbGVkRnVuY3Rpb25OYW1lKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYCR7Y2FsbGVkRnVuY3Rpb25OYW1lfSgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgfVxuICByZXR1cm4gaS5zZXR1cENvbnRleHQgfHwgKGkuc2V0dXBDb250ZXh0ID0gY3JlYXRlU2V0dXBDb250ZXh0KGkpKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhwcm9wcykge1xuICByZXR1cm4gaXNBcnJheShwcm9wcykgPyBwcm9wcy5yZWR1Y2UoXG4gICAgKG5vcm1hbGl6ZWQsIHApID0+IChub3JtYWxpemVkW3BdID0gbnVsbCwgbm9ybWFsaXplZCksXG4gICAge31cbiAgKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWZhdWx0cyhyYXcsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHByb3BzID0gbm9ybWFsaXplUHJvcHNPckVtaXRzKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiX19za2lwXCIpKSBjb250aW51ZTtcbiAgICBsZXQgb3B0ID0gcHJvcHNba2V5XTtcbiAgICBpZiAob3B0KSB7XG4gICAgICBpZiAoaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSkge1xuICAgICAgICBvcHQgPSBwcm9wc1trZXldID0geyB0eXBlOiBvcHQsIGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdC5kZWZhdWx0ID0gZGVmYXVsdHNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdCA9PT0gbnVsbCkge1xuICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm9wcyBkZWZhdWx0IGtleSBcIiR7a2V5fVwiIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLmApO1xuICAgIH1cbiAgICBpZiAob3B0ICYmIGRlZmF1bHRzW2BfX3NraXBfJHtrZXl9YF0pIHtcbiAgICAgIG9wdC5za2lwRmFjdG9yeSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlTW9kZWxzKGEsIGIpIHtcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gYSB8fCBiO1xuICBpZiAoaXNBcnJheShhKSAmJiBpc0FycmF5KGIpKSByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgY29uc3QgaW5TU1JTZXR1cCA9IGlzSW5TU1JDb21wb25lbnRTZXR1cDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4kMShcbiAgICAgIGB3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpblNTUlNldHVwKSB7XG4gICAgc2V0SW5TU1JTZXR1cFN0YXRlKGZhbHNlKTtcbiAgfVxuICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdHgpO1xuICAgIGlmIChpblNTUlNldHVwKSB7XG4gICAgICBzZXRJblNTUlNldHVwU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmIChnZXRDdXJyZW50SW5zdGFuY2UoKSAhPT0gY3R4KSBjdHguc2NvcGUub2ZmKCk7XG4gICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoaW5TU1JTZXR1cCkge1xuICAgICAgc2V0SW5TU1JTZXR1cFN0YXRlKGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIGlmIChpc1Byb21pc2UoYXdhaXRhYmxlKSkge1xuICAgIGF3YWl0YWJsZSA9IGF3YWl0YWJsZS5jYXRjaCgoZSkgPT4ge1xuICAgICAgcmVzdG9yZSgpO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNsZWFudXApKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBhd2FpdGFibGUsXG4gICAgKCkgPT4ge1xuICAgICAgcmVzdG9yZSgpO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihjbGVhbnVwKTtcbiAgICB9XG4gIF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAodHlwZSwga2V5KSA9PiB7XG4gICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgIHdhcm4kMShgJHt0eXBlfSBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAke2NhY2hlW2tleV19LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVtrZXldID0gdHlwZTtcbiAgICB9XG4gIH07XG59XG5sZXQgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuZnVuY3Rpb24gYXBwbHlPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSk7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgY3R4ID0gaW5zdGFuY2UuY3R4O1xuICBzaG91bGRDYWNoZUFjY2VzcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5iZWZvcmVDcmVhdGUpIHtcbiAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIC8vIHN0YXRlXG4gICAgZGF0YTogZGF0YU9wdGlvbnMsXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkT3B0aW9ucyxcbiAgICBtZXRob2RzLFxuICAgIHdhdGNoOiB3YXRjaE9wdGlvbnMsXG4gICAgcHJvdmlkZTogcHJvdmlkZU9wdGlvbnMsXG4gICAgaW5qZWN0OiBpbmplY3RPcHRpb25zLFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIGNyZWF0ZWQsXG4gICAgYmVmb3JlTW91bnQsXG4gICAgbW91bnRlZCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgdXBkYXRlZCxcbiAgICBhY3RpdmF0ZWQsXG4gICAgZGVhY3RpdmF0ZWQsXG4gICAgYmVmb3JlRGVzdHJveSxcbiAgICBiZWZvcmVVbm1vdW50LFxuICAgIGRlc3Ryb3llZCxcbiAgICB1bm1vdW50ZWQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlclRyYWNrZWQsXG4gICAgcmVuZGVyVHJpZ2dlcmVkLFxuICAgIGVycm9yQ2FwdHVyZWQsXG4gICAgc2VydmVyUHJlZmV0Y2gsXG4gICAgLy8gcHVibGljIEFQSVxuICAgIGV4cG9zZSxcbiAgICBpbmhlcml0QXR0cnMsXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGZpbHRlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkgOiBudWxsO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzT3B0aW9ucykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIFBST1BTICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5qZWN0T3B0aW9ucykge1xuICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKTtcbiAgfVxuICBpZiAobWV0aG9kcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eFtrZXldID0gbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGRhdGEgZmV0Y2hpbmcgYmVmb3JlIGNvbXBvbmVudCByZW5kZXJzLCB1c2UgYXN5bmMgc2V0dXAoKSArIDxTdXNwZW5zZT4uYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybiQxKGBDb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGhhcyBubyBnZXR0ZXIuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSAhaXNGdW5jdGlvbihvcHQpICYmIGlzRnVuY3Rpb24ob3B0LnNldCkgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcykgOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYFxuICAgICAgICApO1xuICAgICAgfSA6IE5PT1A7XG4gICAgICBjb25zdCBjID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGMudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGMudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkNvbXB1dGVkXCIgLyogQ09NUFVURUQgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh3YXRjaE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB3YXRjaE9wdGlvbnMpIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIod2F0Y2hPcHRpb25zW2tleV0sIGN0eCwgcHVibGljVGhpcywga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3ZpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpc0Z1bmN0aW9uKHByb3ZpZGVPcHRpb25zKSA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcykgOiBwcm92aWRlT3B0aW9ucztcbiAgICBSZWZsZWN0Lm93bktleXMocHJvdmlkZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChjcmVhdGVkKSB7XG4gICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaG9vay5mb3JFYWNoKChfaG9vaykgPT4gcmVnaXN0ZXIoX2hvb2suYmluZChwdWJsaWNUaGlzKSkpO1xuICAgIH0gZWxzZSBpZiAoaG9vaykge1xuICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlTW91bnQsIGJlZm9yZU1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uTW91bnRlZCwgbW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVXBkYXRlZCwgdXBkYXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkFjdGl2YXRlZCwgYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRXJyb3JDYXB0dXJlZCwgZXJyb3JDYXB0dXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyYWNrZWQsIHJlbmRlclRyYWNrZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVubW91bnQsIGJlZm9yZVVubW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Vbm1vdW50ZWQsIHVubW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gIGlmIChpc0FycmF5KGV4cG9zZSkpIHtcbiAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICBleHBvc2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHB1YmxpY1RoaXNba2V5XSxcbiAgICAgICAgICBzZXQ6ICh2YWwpID0+IHB1YmxpY1RoaXNba2V5XSA9IHZhbCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAocmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCkge1xuICAgIGluc3RhbmNlLnJlbmRlciA9IHJlbmRlcjtcbiAgfVxuICBpZiAoaW5oZXJpdEF0dHJzICE9IG51bGwpIHtcbiAgICBpbnN0YW5jZS5pbmhlcml0QXR0cnMgPSBpbmhlcml0QXR0cnM7XG4gIH1cbiAgaWYgKGNvbXBvbmVudHMpIGluc3RhbmNlLmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICBpZiAoZGlyZWN0aXZlcykgaW5zdGFuY2UuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gIGlmIChzZXJ2ZXJQcmVmZXRjaCkge1xuICAgIG1hcmtBc3luY0JvdW5kYXJ5KGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBsZXQgZ2V0dGVyID0ga2V5LmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywga2V5KSA6ICgpID0+IHB1YmxpY1RoaXNba2V5XTtcbiAgaWYgKGlzU3RyaW5nKHJhdykpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gY3R4W3Jhd107XG4gICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhd31cImAsIGhhbmRsZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHJhdykpIHtcbiAgICB7XG4gICAgICB3YXRjaChnZXR0ZXIsIHJhdy5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhdy5oYW5kbGVyfVwiYCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggb3B0aW9uOiBcIiR7a2V5fVwiYCwgcmF3KTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbmNlLnR5cGU7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gYmFzZTtcbiAgY29uc3Qge1xuICAgIG1peGluczogZ2xvYmFsTWl4aW5zLFxuICAgIG9wdGlvbnNDYWNoZTogY2FjaGUsXG4gICAgY29uZmlnOiB7IG9wdGlvbk1lcmdlU3RyYXRlZ2llcyB9XG4gIH0gPSBpbnN0YW5jZS5hcHBDb250ZXh0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoYmFzZSk7XG4gIGxldCByZXNvbHZlZDtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJlc29sdmVkID0gY2FjaGVkO1xuICB9IGVsc2UgaWYgKCFnbG9iYWxNaXhpbnMubGVuZ3RoICYmICFtaXhpbnMgJiYgIWV4dGVuZHNPcHRpb25zKSB7XG4gICAge1xuICAgICAgcmVzb2x2ZWQgPSBiYXNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXNvbHZlZCA9IHt9O1xuICAgIGlmIChnbG9iYWxNaXhpbnMubGVuZ3RoKSB7XG4gICAgICBnbG9iYWxNaXhpbnMuZm9yRWFjaChcbiAgICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgbSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzLCB0cnVlKVxuICAgICAgKTtcbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBiYXNlLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMpO1xuICB9XG4gIGlmIChpc09iamVjdChiYXNlKSkge1xuICAgIGNhY2hlLnNldChiYXNlLCByZXNvbHZlZCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tLCBzdHJhdHMsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGZyb207XG4gIGlmIChleHRlbmRzT3B0aW9ucykge1xuICAgIG1lcmdlT3B0aW9ucyh0bywgZXh0ZW5kc09wdGlvbnMsIHN0cmF0cywgdHJ1ZSk7XG4gIH1cbiAgaWYgKG1peGlucykge1xuICAgIG1peGlucy5mb3JFYWNoKFxuICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyh0bywgbSwgc3RyYXRzLCB0cnVlKVxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIGlmIChhc01peGluICYmIGtleSA9PT0gXCJleHBvc2VcIikge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bykgcmV0dXJuIGZyb207XG4gIGlmICghZnJvbSkgcmV0dXJuIHRvO1xuICBjb25zdCBtZXJnZWQgPSBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRvKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIG1lcmdlZFtrZXldID0gbWVyZ2VBc0FycmF5KHRvW2tleV0sIGZyb21ba2V5XSk7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBwQ29udGV4dCgpIHtcbiAgcmV0dXJuIHtcbiAgICBhcHA6IG51bGwsXG4gICAgY29uZmlnOiB7XG4gICAgICBpc05hdGl2ZVRhZzogTk8sXG4gICAgICBwZXJmb3JtYW5jZTogZmFsc2UsXG4gICAgICBnbG9iYWxQcm9wZXJ0aWVzOiB7fSxcbiAgICAgIG9wdGlvbk1lcmdlU3RyYXRlZ2llczoge30sXG4gICAgICBlcnJvckhhbmRsZXI6IHZvaWQgMCxcbiAgICAgIHdhcm5IYW5kbGVyOiB2b2lkIDAsXG4gICAgICBjb21waWxlck9wdGlvbnM6IHt9XG4gICAgfSxcbiAgICBtaXhpbnM6IFtdLFxuICAgIGNvbXBvbmVudHM6IHt9LFxuICAgIGRpcmVjdGl2ZXM6IHt9LFxuICAgIHByb3ZpZGVzOiAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICBvcHRpb25zQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIHByb3BzQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIGVtaXRzQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpXG4gIH07XG59XG5sZXQgdWlkJDEgPSAwO1xuZnVuY3Rpb24gY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXBwKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyA9IG51bGwpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24ocm9vdENvbXBvbmVudCkpIHtcbiAgICAgIHJvb3RDb21wb25lbnQgPSBleHRlbmQoe30sIHJvb3RDb21wb25lbnQpO1xuICAgIH1cbiAgICBpZiAocm9vdFByb3BzICE9IG51bGwgJiYgIWlzT2JqZWN0KHJvb3RQcm9wcykpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGByb290IHByb3BzIHBhc3NlZCB0byBhcHAubW91bnQoKSBtdXN0IGJlIGFuIG9iamVjdC5gKTtcbiAgICAgIHJvb3RQcm9wcyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2lucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICAgIGNvbnN0IHBsdWdpbkNsZWFudXBGbnMgPSBbXTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgYXBwLmNvbmZpZyBjYW5ub3QgYmUgcmVwbGFjZWQuIE1vZGlmeSBpbmRpdmlkdWFsIG9wdGlvbnMgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZShwbHVnaW4sIC4uLm9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaGFzKHBsdWdpbikpIHtcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHBsdWdpbiAmJiBpc0Z1bmN0aW9uKHBsdWdpbi5pbnN0YWxsKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luLmluc3RhbGwoYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHBsdWdpbikpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbihhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwXCIgKyAobWl4aW4ubmFtZSA/IGA6ICR7bWl4aW4ubmFtZX1gIDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJNaXhpbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGJ1aWxkcyBzdXBwb3J0aW5nIE9wdGlvbnMgQVBJXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50KG5hbWUsIGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb250ZXh0LmNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5jb21wb25lbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgICAgIHdhcm4kMShgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYERpcmVjdGl2ZSBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgbW91bnQocm9vdENvbnRhaW5lciwgaXNIeWRyYXRlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cbiBJZiB5b3Ugd2FudCB0byBtb3VudCBhbm90aGVyIGFwcCBvbiB0aGUgc2FtZSBob3N0IGNvbnRhaW5lciwgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgXFxgYXBwLnVubW91bnQoKVxcYCBmaXJzdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2bm9kZSA9IGFwcC5fY2VWTm9kZSB8fCBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgICAgICAgIGNsb25lZC5lbCA9IG51bGw7XG4gICAgICAgICAgICAgIHJlbmRlcihjbG9uZWQsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgYXBwLl9jb250YWluZXIgPSByb290Q29udGFpbmVyO1xuICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSh2bm9kZS5jb21wb25lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Vbm1vdW50KGNsZWFudXBGbikge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0eXBlb2YgY2xlYW51cEZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgZnVuY3Rpb24gYXMgZmlyc3QgYXJndW1lbnQgdG8gYXBwLm9uVW5tb3VudCgpLCBidXQgZ290ICR7dHlwZW9mIGNsZWFudXBGbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwbHVnaW5DbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuKTtcbiAgICAgIH0sXG4gICAgICB1bm1vdW50KCkge1xuICAgICAgICBpZiAoaXNNb3VudGVkKSB7XG4gICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgICAgICBwbHVnaW5DbGVhbnVwRm5zLFxuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSxcbiAgICAgICAgICAgIDE2XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZW5kZXIobnVsbCwgYXBwLl9jb250YWluZXIpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBkZXZ0b29sc1VubW91bnRBcHAoYXBwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFwcC5fY29udGFpbmVyLl9fdnVlX2FwcF9fO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoYENhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLmApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBjb250ZXh0LnByb3ZpZGVzKSB7XG4gICAgICAgICAgaWYgKGhhc093bihjb250ZXh0LnByb3ZpZGVzLCBrZXkpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBBcHAgYWxyZWFkeSBwcm92aWRlcyBwcm9wZXJ0eSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIuIEl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEFwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGVsZW1lbnQuIEl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV3IHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQucHJvdmlkZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIHJ1bldpdGhDb250ZXh0KGZuKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBcHAgPSBjdXJyZW50QXBwO1xuICAgICAgICBjdXJyZW50QXBwID0gYXBwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGN1cnJlbnRBcHAgPSBsYXN0QXBwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBwO1xuICB9O1xufVxubGV0IGN1cnJlbnRBcHAgPSBudWxsO1xuXG5mdW5jdGlvbiB1c2VNb2RlbChwcm9wcywgbmFtZSwgb3B0aW9ucyA9IEVNUFRZX09CSikge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybiQxKGB1c2VNb2RlbCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm4gcmVmKCk7XG4gIH1cbiAgY29uc3QgY2FtZWxpemVkTmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bY2FtZWxpemVkTmFtZV0pIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGggcHJvcCBcIiR7bmFtZX1cIiB3aGljaCBpcyBub3QgZGVjbGFyZWQuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGNvbnN0IGh5cGhlbmF0ZWROYW1lID0gaHlwaGVuYXRlKG5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RlbE1vZGlmaWVycyhwcm9wcywgY2FtZWxpemVkTmFtZSk7XG4gIGNvbnN0IHJlcyA9IGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcbiAgICBsZXQgbG9jYWxWYWx1ZTtcbiAgICBsZXQgcHJldlNldFZhbHVlID0gRU1QVFlfT0JKO1xuICAgIGxldCBwcmV2RW1pdHRlZFZhbHVlO1xuICAgIHdhdGNoU3luY0VmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1tjYW1lbGl6ZWROYW1lXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKGxvY2FsVmFsdWUsIHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxWYWx1ZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHRyYWNrKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmdldCA/IG9wdGlvbnMuZ2V0KGxvY2FsVmFsdWUpIDogbG9jYWxWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZW1pdHRlZFZhbHVlID0gb3B0aW9ucy5zZXQgPyBvcHRpb25zLnNldCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKCFoYXNDaGFuZ2VkKGVtaXR0ZWRWYWx1ZSwgbG9jYWxWYWx1ZSkgJiYgIShwcmV2U2V0VmFsdWUgIT09IEVNUFRZX09CSiAmJiBoYXNDaGFuZ2VkKHZhbHVlLCBwcmV2U2V0VmFsdWUpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXdQcm9wcyA9IGkudm5vZGUucHJvcHM7XG4gICAgICAgIGNvbnN0IGhhc1ZNb2RlbCA9ICEhKHJhd1Byb3BzICYmIC8vIGNoZWNrIGlmIHBhcmVudCBoYXMgcGFzc2VkIHYtbW9kZWxcbiAgICAgICAgKG5hbWUgaW4gcmF3UHJvcHMgfHwgY2FtZWxpemVkTmFtZSBpbiByYXdQcm9wcyB8fCBoeXBoZW5hdGVkTmFtZSBpbiByYXdQcm9wcykgJiYgKGBvblVwZGF0ZToke25hbWV9YCBpbiByYXdQcm9wcyB8fCBgb25VcGRhdGU6JHtjYW1lbGl6ZWROYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7aHlwaGVuYXRlZE5hbWV9YCBpbiByYXdQcm9wcykpO1xuICAgICAgICBpZiAoIWhhc1ZNb2RlbCkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIGVtaXR0ZWRWYWx1ZSk7XG4gICAgICAgIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBwcmV2U2V0VmFsdWUpICYmIChoYXNDaGFuZ2VkKHZhbHVlLCBlbWl0dGVkVmFsdWUpICYmICFoYXNDaGFuZ2VkKGVtaXR0ZWRWYWx1ZSwgcHJldkVtaXR0ZWRWYWx1ZSkgfHwgLy8gIzEzNTI0OiBicm93c2VycyBkaWZmZXIgaW4gd2hlbiB0aGV5IGZsdXNoIG1pY3JvdGFza3MgYmV0d2VlblxuICAgICAgICAvLyBldmVudCBsaXN0ZW5lcnMuIElmIGEgdi1tb2RlbCBsaXN0ZW5lciBlbWl0cyBhbiBpbnRlcm1lZGlhdGUgdmFsdWVcbiAgICAgICAgLy8gYW5kIGEgZm9sbG93aW5nIGxpc3RlbmVyIHJlc3RvcmVzIHRoZSBtb2RlbCB0byBpdHMgcHJldmlvdXMgcHJvcFxuICAgICAgICAvLyB2YWx1ZSBiZWZvcmUgcGFyZW50IHVwZGF0ZXMgYXJlIGZsdXNoZWQsIHRoZSBwYXJlbnQgcmVuZGVyIGNhbiBiZVxuICAgICAgICAvLyBkZWR1cGVkIGFzIGhhdmluZyBubyBwcm9wIGNoYW5nZS4gRm9yY2UgYSBsb2NhbCB1cGRhdGUgc28gRE9NIHN0YXRlXG4gICAgICAgIC8vIHN1Y2ggYXMgYW4gaW5wdXQncyB2YWx1ZSBpcyBzeW5jaHJvbml6ZWQgYmFjayB0byB0aGUgY3VycmVudCBtb2RlbC5cbiAgICAgICAgaGFzVk1vZGVsICYmIHByZXZTZXRWYWx1ZSAhPT0gRU1QVFlfT0JKICYmICFoYXNDaGFuZ2VkKGVtaXR0ZWRWYWx1ZSwgbG9jYWxWYWx1ZSkpKSB7XG4gICAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgICB9XG4gICAgICAgIHByZXZTZXRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBwcmV2RW1pdHRlZFZhbHVlID0gZW1pdHRlZFZhbHVlO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICByZXNbU3ltYm9sLml0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICBsZXQgaTIgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCkge1xuICAgICAgICBpZiAoaTIgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGkyKysgPyBtb2RpZmllcnMgfHwgRU1QVFlfT0JKIDogcmVzLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG4gIHJldHVybiByZXM7XG59XG5jb25zdCBnZXRNb2RlbE1vZGlmaWVycyA9IChwcm9wcywgbW9kZWxOYW1lKSA9PiB7XG4gIHJldHVybiBtb2RlbE5hbWUgPT09IFwibW9kZWxWYWx1ZVwiIHx8IG1vZGVsTmFtZSA9PT0gXCJtb2RlbC12YWx1ZVwiID8gcHJvcHMubW9kZWxNb2RpZmllcnMgOiBwcm9wc1tgJHttb2RlbE5hbWV9TW9kaWZpZXJzYF0gfHwgcHJvcHNbYCR7Y2FtZWxpemUobW9kZWxOYW1lKX1Nb2RpZmllcnNgXSB8fCBwcm9wc1tgJHtoeXBoZW5hdGUobW9kZWxOYW1lKX1Nb2RpZmllcnNgXTtcbn07XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCkgcmV0dXJuO1xuICBjb25zdCBwcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCB7XG4gICAgICBlbWl0c09wdGlvbnMsXG4gICAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gICAgfSA9IGluc3RhbmNlO1xuICAgIGlmIChlbWl0c09wdGlvbnMpIHtcbiAgICAgIGlmICghKGV2ZW50IGluIGVtaXRzT3B0aW9ucykgJiYgdHJ1ZSkge1xuICAgICAgICBpZiAoIXByb3BzT3B0aW9ucyB8fCAhKHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpIGluIHByb3BzT3B0aW9ucykpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IGVtaXR0ZWQgZXZlbnQgXCIke2V2ZW50fVwiIGJ1dCBpdCBpcyBuZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBlbWl0cyBvcHRpb24gbm9yIGFzIGFuIFwiJHt0b0hhbmRsZXJLZXkoY2FtZWxpemUoZXZlbnQpKX1cIiBwcm9wLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBlbWl0c09wdGlvbnNbZXZlbnRdO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWxpZGF0b3IpKSB7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbGlkYXRvciguLi5yYXdBcmdzKTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEludmFsaWQgZXZlbnQgYXJndW1lbnRzOiBldmVudCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgZXZlbnQgXCIke2V2ZW50fVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBhcmdzID0gcmF3QXJncztcbiAgY29uc3QgaXNNb2RlbExpc3RlbmVyID0gZXZlbnQuc3RhcnRzV2l0aChcInVwZGF0ZTpcIik7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGlzTW9kZWxMaXN0ZW5lciAmJiBnZXRNb2RlbE1vZGlmaWVycyhwcm9wcywgZXZlbnQuc2xpY2UoNykpO1xuICBpZiAobW9kaWZpZXJzKSB7XG4gICAgaWYgKG1vZGlmaWVycy50cmltKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAoKGEpID0+IGlzU3RyaW5nKGEpID8gYS50cmltKCkgOiBhKTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5udW1iZXIpIHtcbiAgICAgIGFyZ3MgPSBhcmdzLm1hcChsb29zZVRvTnVtYmVyKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNDb21wb25lbnRFbWl0KGluc3RhbmNlLCBldmVudCwgYXJncyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiBwcm9wc1t0b0hhbmRsZXJLZXkobG93ZXJDYXNlRXZlbnQpXSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKFxuICAgICAgICAgIGV2ZW50XG4gICAgICAgICl9XCIgaW5zdGVhZCBvZiBcIiR7ZXZlbnR9XCIuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IGhhbmRsZXJOYW1lO1xuICBsZXQgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGV2ZW50KV0gfHwgLy8gYWxzbyB0cnkgY2FtZWxDYXNlIGV2ZW50IGhhbmRsZXIgKCMyMjQ5KVxuICBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpXTtcbiAgaWYgKCFoYW5kbGVyICYmIGlzTW9kZWxMaXN0ZW5lcikge1xuICAgIGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShoeXBoZW5hdGUoZXZlbnQpKV07XG4gIH1cbiAgaWYgKGhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIGhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxuICBjb25zdCBvbmNlSGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lICsgYE9uY2VgXTtcbiAgaWYgKG9uY2VIYW5kbGVyKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5lbWl0dGVkKSB7XG4gICAgICBpbnN0YW5jZS5lbWl0dGVkID0ge307XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSA9IHRydWU7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBvbmNlSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG59XG5jb25zdCBtaXhpbkVtaXRzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBfX1ZVRV9PUFRJT05TX0FQSV9fICYmIGFzTWl4aW4gPyBtaXhpbkVtaXRzQ2FjaGUgOiBhcHBDb250ZXh0LmVtaXRzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLmVtaXRzO1xuICBsZXQgbm9ybWFsaXplZCA9IHt9O1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZEVtaXRzID0gKHJhdzIpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKSB7XG4gICAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZEVtaXRzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICByYXcuZm9yRWFjaCgoa2V5KSA9PiBub3JtYWxpemVkW2tleV0gPSBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgfVxuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgbm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiBpc0VtaXRMaXN0ZW5lcihvcHRpb25zLCBrZXkpIHtcbiAgaWYgKCFvcHRpb25zIHx8ICFpc09uKGtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAga2V5ID0ga2V5LnNsaWNlKDIpO1xuICBrZXkgPSBrZXkgPT09IFwiT25jZVwiID8ga2V5IDoga2V5LnJlcGxhY2UoL09uY2UkLywgXCJcIik7XG4gIHJldHVybiBoYXNPd24ob3B0aW9ucywga2V5WzBdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkpIHx8IGhhc093bihvcHRpb25zLCBoeXBoZW5hdGUoa2V5KSkgfHwgaGFzT3duKG9wdGlvbnMsIGtleSk7XG59XG5cbmxldCBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG5mdW5jdGlvbiBtYXJrQXR0cnNBY2Nlc3NlZCgpIHtcbiAgYWNjZXNzZWRBdHRycyA9IHRydWU7XG59XG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlOiBDb21wb25lbnQsXG4gICAgdm5vZGUsXG4gICAgcHJveHksXG4gICAgd2l0aFByb3h5LFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc10sXG4gICAgc2xvdHMsXG4gICAgYXR0cnMsXG4gICAgZW1pdCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyQ2FjaGUsXG4gICAgcHJvcHMsXG4gICAgZGF0YSxcbiAgICBzZXR1cFN0YXRlLFxuICAgIGN0eCxcbiAgICBpbmhlcml0QXR0cnNcbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKTtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IGZhbGx0aHJvdWdoQXR0cnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDQpIHtcbiAgICAgIGNvbnN0IHByb3h5VG9Vc2UgPSB3aXRoUHJveHkgfHwgcHJveHk7XG4gICAgICBjb25zdCB0aGlzUHJveHkgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwID8gbmV3IFByb3h5KHByb3h5VG9Vc2UsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBQcm9wZXJ0eSAnJHtTdHJpbmcoXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKX0nIHdhcyBhY2Nlc3NlZCB2aWEgJ3RoaXMnLiBBdm9pZCB1c2luZyAndGhpcycgaW4gdGVtcGxhdGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgICB9KSA6IHByb3h5VG9Vc2U7XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyLmNhbGwoXG4gICAgICAgICAgdGhpc1Byb3h5LFxuICAgICAgICAgIHByb3h5VG9Vc2UsXG4gICAgICAgICAgcmVuZGVyQ2FjaGUsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocHJvcHMpIDogcHJvcHMsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNoYWxsb3dSZWFkb25seShhdHRycyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xvdHMsXG4gICAgICAgICAgICBlbWl0XG4gICAgICAgICAgfSA6IHsgYXR0cnMsIHNsb3RzLCBlbWl0IH1cbiAgICAgICAgKSA6IHJlbmRlcjIoXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gQ29tcG9uZW50LnByb3BzID8gYXR0cnMgOiBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2goYXR0cnMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYmxvY2tTdGFjay5sZW5ndGggPSAwO1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDEpO1xuICAgIHJlc3VsdCA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9XG4gIGxldCByb290ID0gcmVzdWx0O1xuICBsZXQgc2V0Um9vdCA9IHZvaWQgMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVzdWx0LnBhdGNoRmxhZyA+IDAgJiYgcmVzdWx0LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICBbcm9vdCwgc2V0Um9vdF0gPSBnZXRDaGlsZFJvb3QocmVzdWx0KTtcbiAgfVxuICBpZiAoZmFsbHRocm91Z2hBdHRycyAmJiBpbmhlcml0QXR0cnMgIT09IGZhbHNlKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnIH0gPSByb290O1xuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNikpIHtcbiAgICAgICAgaWYgKHByb3BzT3B0aW9ucyAmJiBrZXlzLnNvbWUoaXNNb2RlbExpc3RlbmVyKSkge1xuICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBmaWx0ZXJNb2RlbExpc3RlbmVycyhcbiAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMsXG4gICAgICAgICAgICBwcm9wc09wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIGZhbGx0aHJvdWdoQXR0cnMsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhYWNjZXNzZWRBdHRycyAmJiByb290LnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgYWxsQXR0cnMgPSBPYmplY3Qua2V5cyhhdHRycyk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXR0cnMgPSBbXTtcbiAgICAgICAgY29uc3QgZXh0cmFBdHRycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFsbEF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGFsbEF0dHJzW2ldO1xuICAgICAgICAgIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgICAgICAgICAgZXZlbnRBdHRycy5wdXNoKGtleVsyXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cmFBdHRycy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRyYUF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1wcm9wcyBhdHRyaWJ1dGVzICgke2V4dHJhQXR0cnMuam9pbihcIiwgXCIpfSkgd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IG9yIHRlbGVwb3J0IHJvb3Qgbm9kZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50QXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoJHtldmVudEF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlIFwiZW1pdHNcIiBvcHRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgUnVudGltZSBkaXJlY3RpdmUgdXNlZCBvbiBjb21wb25lbnQgd2l0aCBub24tZWxlbWVudCByb290IG5vZGUuIFRoZSBkaXJlY3RpdmVzIHdpbGwgbm90IGZ1bmN0aW9uIGFzIGludGVuZGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIG51bGwsIGZhbHNlLCB0cnVlKTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGNvbnN0IGNoaWxkID0gaXNUZWxlcG9ydChyb290LnR5cGUpID8gZ2V0SW5uZXJDaGlsZCQxKHJvb3QpIHx8IHJvb3QgOiByb290O1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KGNoaWxkKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgc2V0VHJhbnNpdGlvbkhvb2tzKGNoaWxkLCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXRSb290KSB7XG4gICAgc2V0Um9vdChyb290KTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSByb290O1xuICB9XG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCByYXdDaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICBjb25zdCBkeW5hbWljQ2hpbGRyZW4gPSB2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4sIGZhbHNlKTtcbiAgaWYgKCFjaGlsZFJvb3QpIHtcbiAgICByZXR1cm4gW3Zub2RlLCB2b2lkIDBdO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hpbGRSb290LnBhdGNoRmxhZyA+IDAgJiYgY2hpbGRSb290LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICByZXR1cm4gZ2V0Q2hpbGRSb290KGNoaWxkUm9vdCk7XG4gIH1cbiAgY29uc3QgaW5kZXggPSByYXdDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCk7XG4gIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgY29uc3Qgc2V0Um9vdCA9ICh1cGRhdGVkUm9vdCkgPT4ge1xuICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgfSBlbHNlIGlmICh1cGRhdGVkUm9vdC5wYXRjaEZsYWcgPiAwKSB7XG4gICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbbm9ybWFsaXplVk5vZGUoY2hpbGRSb290KSwgc2V0Um9vdF07XG59O1xuZnVuY3Rpb24gZmlsdGVyU2luZ2xlUm9vdChjaGlsZHJlbiwgcmVjdXJzZSA9IHRydWUpIHtcbiAgbGV0IHNpbmdsZVJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuICAgICAgaWYgKGNoaWxkLnR5cGUgIT09IENvbW1lbnQgfHwgY2hpbGQuY2hpbGRyZW4gPT09IFwidi1pZlwiKSB7XG4gICAgICAgIGlmIChzaW5nbGVSb290KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNpbmdsZVJvb3QgPSBjaGlsZDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZWN1cnNlICYmIHNpbmdsZVJvb3QucGF0Y2hGbGFnID4gMCAmJiBzaW5nbGVSb290LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJTaW5nbGVSb290KHNpbmdsZVJvb3QuY2hpbGRyZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzaW5nbGVSb290O1xufVxuY29uc3QgZ2V0RnVuY3Rpb25hbEZhbGx0aHJvdWdoID0gKGF0dHJzKSA9PiB7XG4gIGxldCByZXM7XG4gIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiIHx8IGtleSA9PT0gXCJzdHlsZVwiIHx8IGlzT24oa2V5KSkge1xuICAgICAgKHJlcyB8fCAocmVzID0ge30pKVtrZXldID0gYXR0cnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5jb25zdCBmaWx0ZXJNb2RlbExpc3RlbmVycyA9IChhdHRycywgcHJvcHMpID0+IHtcbiAgY29uc3QgcmVzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSB8fCAhKGtleS5zbGljZSg5KSBpbiBwcm9wcykpIHtcbiAgICAgIHJlc1trZXldID0gYXR0cnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5jb25zdCBpc0VsZW1lbnRSb290ID0gKHZub2RlKSA9PiB7XG4gIHJldHVybiB2bm9kZS5zaGFwZUZsYWcgJiAoNiB8IDEpIHx8IHZub2RlLnR5cGUgPT09IENvbW1lbnQ7XG59O1xuZnVuY3Rpb24gc2hvdWxkVXBkYXRlQ29tcG9uZW50KHByZXZWTm9kZSwgbmV4dFZOb2RlLCBvcHRpbWl6ZWQpIHtcbiAgY29uc3QgeyBwcm9wczogcHJldlByb3BzLCBjaGlsZHJlbjogcHJldkNoaWxkcmVuLCBjb21wb25lbnQgfSA9IHByZXZWTm9kZTtcbiAgY29uc3QgeyBwcm9wczogbmV4dFByb3BzLCBjaGlsZHJlbjogbmV4dENoaWxkcmVuLCBwYXRjaEZsYWcgfSA9IG5leHRWTm9kZTtcbiAgY29uc3QgZW1pdHMgPSBjb21wb25lbnQuZW1pdHNPcHRpb25zO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAocHJldkNoaWxkcmVuIHx8IG5leHRDaGlsZHJlbikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChuZXh0Vk5vZGUuZGlycyB8fCBuZXh0Vk5vZGUudHJhbnNpdGlvbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChvcHRpbWl6ZWQgJiYgcGF0Y2hGbGFnID49IDApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgMTAyNCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgaWYgKCFwcmV2UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgZHluYW1pY1Byb3BzID0gbmV4dFZOb2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgICAgaWYgKGhhc1Byb3BWYWx1ZUNoYW5nZWQobmV4dFByb3BzLCBwcmV2UHJvcHMsIGtleSkgJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuIHx8ICFuZXh0Q2hpbGRyZW4uJHN0YWJsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZXZQcm9wcyA9PT0gbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgfVxuICAgIGlmICghbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHNPcHRpb25zKSB7XG4gIGNvbnN0IG5leHRLZXlzID0gT2JqZWN0LmtleXMobmV4dFByb3BzKTtcbiAgaWYgKG5leHRLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocHJldlByb3BzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gbmV4dEtleXNbaV07XG4gICAgaWYgKGhhc1Byb3BWYWx1ZUNoYW5nZWQobmV4dFByb3BzLCBwcmV2UHJvcHMsIGtleSkgJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1Byb3BWYWx1ZUNoYW5nZWQobmV4dFByb3BzLCBwcmV2UHJvcHMsIGtleSkge1xuICBjb25zdCBuZXh0UHJvcCA9IG5leHRQcm9wc1trZXldO1xuICBjb25zdCBwcmV2UHJvcCA9IHByZXZQcm9wc1trZXldO1xuICBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgaXNPYmplY3QobmV4dFByb3ApICYmIGlzT2JqZWN0KHByZXZQcm9wKSkge1xuICAgIHJldHVybiAhbG9vc2VFcXVhbChuZXh0UHJvcCwgcHJldlByb3ApO1xuICB9XG4gIHJldHVybiBuZXh0UHJvcCAhPT0gcHJldlByb3A7XG59XG5mdW5jdGlvbiB1cGRhdGVIT0NIb3N0RWwoeyB2bm9kZSwgcGFyZW50LCBzdXNwZW5zZSB9LCBlbCkge1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgY29uc3Qgcm9vdCA9IHBhcmVudC5zdWJUcmVlO1xuICAgIGlmIChyb290LnN1c3BlbnNlICYmIHJvb3Quc3VzcGVuc2UuYWN0aXZlQnJhbmNoID09PSB2bm9kZSkge1xuICAgICAgcm9vdC5zdXNwZW5zZS52bm9kZS5lbCA9IHJvb3QuZWwgPSBlbDtcbiAgICAgIHZub2RlID0gcm9vdDtcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IHZub2RlKSB7XG4gICAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHN1c3BlbnNlICYmIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9PT0gdm5vZGUpIHtcbiAgICBzdXNwZW5zZS52bm9kZS5lbCA9IGVsO1xuICB9XG59XG5cbmNvbnN0IGludGVybmFsT2JqZWN0UHJvdG8gPSB7fTtcbmNvbnN0IGNyZWF0ZUludGVybmFsT2JqZWN0ID0gKCkgPT4gT2JqZWN0LmNyZWF0ZShpbnRlcm5hbE9iamVjdFByb3RvKTtcbmNvbnN0IGlzSW50ZXJuYWxPYmplY3QgPSAob2JqKSA9PiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gaW50ZXJuYWxPYmplY3RQcm90bztcblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IGNyZWF0ZUludGVybmFsT2JqZWN0KCk7XG4gIGluc3RhbmNlLnByb3BzRGVmYXVsdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb3BzKSkge1xuICAgICAgcHJvcHNba2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzIHx8IHt9LCBwcm9wcywgaW5zdGFuY2UpO1xuICB9XG4gIGlmIChpc1N0YXRlZnVsKSB7XG4gICAgaW5zdGFuY2UucHJvcHMgPSBpc1NTUiA/IHByb3BzIDogc2hhbGxvd1JlYWN0aXZlKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWluc3RhbmNlLnR5cGUucHJvcHMpIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmF0dHJzID0gYXR0cnM7XG59XG5mdW5jdGlvbiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkge1xuICB3aGlsZSAoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX2htcklkKSByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UuYXR0cnMsIFwic2V0XCIsIFwiXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RhbmNlLmNlKSB7XG4gICAgICAgIGluc3RhbmNlLmNlLl9zZXRQcm9wKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0WzAgLyogc2hvdWxkQ2FzdCAqL10pIHtcbiAgICAgIGlmIChpc0Fic2VudCAmJiAhaGFzRGVmYXVsdCkge1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvcHRbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gJiYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBtaXhpblByb3BzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBfX1ZVRV9PUFRJT05TX0FQSV9fICYmIGFzTWl4aW4gPyBtaXhpblByb3BzQ2FjaGUgOiBhcHBDb250ZXh0LnByb3BzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5wcm9wcztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBjb25zdCBuZWVkQ2FzdEtleXMgPSBbXTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRQcm9wcyA9IChyYXcyKSA9PiB7XG4gICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IFtwcm9wcywga2V5c10gPSBub3JtYWxpemVQcm9wc09wdGlvbnMocmF3MiwgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICBleHRlbmQobm9ybWFsaXplZCwgcHJvcHMpO1xuICAgICAgaWYgKGtleXMpIG5lZWRDYXN0S2V5cy5wdXNoKC4uLmtleXMpO1xuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZFByb3BzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgRU1QVFlfQVJSKTtcbiAgICB9XG4gICAgcmV0dXJuIEVNUFRZX0FSUjtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc1N0cmluZyhyYXdbaV0pKSB7XG4gICAgICAgIHdhcm4kMShgcHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LmAsIHJhd1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUocmF3W2ldKTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHJhdykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChyYXcpKSB7XG4gICAgICB3YXJuJDEoYGludmFsaWQgcHJvcHMgb3B0aW9uc2AsIHJhdyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHJhdykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKGtleSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBjb25zdCBvcHQgPSByYXdba2V5XTtcbiAgICAgICAgY29uc3QgcHJvcCA9IG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpID8geyB0eXBlOiBvcHQgfSA6IGV4dGVuZCh7fSwgb3B0KTtcbiAgICAgICAgY29uc3QgcHJvcFR5cGUgPSBwcm9wLnR5cGU7XG4gICAgICAgIGxldCBzaG91bGRDYXN0ID0gZmFsc2U7XG4gICAgICAgIGxldCBzaG91bGRDYXN0VHJ1ZSA9IHRydWU7XG4gICAgICAgIGlmIChpc0FycmF5KHByb3BUeXBlKSkge1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcm9wVHlwZS5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwcm9wVHlwZVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGlzRnVuY3Rpb24odHlwZSkgJiYgdHlwZS5uYW1lO1xuICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09PSBcIkJvb2xlYW5cIikge1xuICAgICAgICAgICAgICBzaG91bGRDYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVOYW1lID09PSBcIlN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIHNob3VsZENhc3RUcnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3VsZENhc3QgPSBpc0Z1bmN0aW9uKHByb3BUeXBlKSAmJiBwcm9wVHlwZS5uYW1lID09PSBcIkJvb2xlYW5cIjtcbiAgICAgICAgfVxuICAgICAgICBwcm9wWzAgLyogc2hvdWxkQ2FzdCAqL10gPSBzaG91bGRDYXN0O1xuICAgICAgICBwcm9wWzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dID0gc2hvdWxkQ2FzdFRydWU7XG4gICAgICAgIGlmIChzaG91bGRDYXN0IHx8IGhhc093bihwcm9wLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICBuZWVkQ2FzdEtleXMucHVzaChub3JtYWxpemVkS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcE5hbWUoa2V5KSB7XG4gIGlmIChrZXlbMF0gIT09IFwiJFwiICYmICFpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgSW52YWxpZCBwcm9wIG5hbWU6IFwiJHtrZXl9XCIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS5gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRUeXBlKGN0b3IpIHtcbiAgaWYgKGN0b3IgPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgaWYgKHR5cGVvZiBjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY3Rvci5uYW1lIHx8IFwiXCI7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGN0b3IgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBuYW1lID0gY3Rvci5jb25zdHJ1Y3RvciAmJiBjdG9yLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIG5hbWUgfHwgXCJcIjtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMsIHByb3BzLCBpbnN0YW5jZSkge1xuICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRvUmF3KHByb3BzKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXTtcbiAgY29uc3QgY2FtZWxpemVQcm9wc0tleSA9IE9iamVjdC5rZXlzKHJhd1Byb3BzKS5tYXAoKGtleSkgPT4gY2FtZWxpemUoa2V5KSk7XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbCkgY29udGludWU7XG4gICAgdmFsaWRhdGVQcm9wKFxuICAgICAga2V5LFxuICAgICAgcmVzb2x2ZWRWYWx1ZXNba2V5XSxcbiAgICAgIG9wdCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocmVzb2x2ZWRWYWx1ZXMpIDogcmVzb2x2ZWRWYWx1ZXMsXG4gICAgICAhY2FtZWxpemVQcm9wc0tleS5pbmNsdWRlcyhrZXkpXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wKG5hbWUsIHZhbHVlLCBwcm9wLCBwcm9wcywgaXNBYnNlbnQpIHtcbiAgY29uc3QgeyB0eXBlLCByZXF1aXJlZCwgdmFsaWRhdG9yLCBza2lwQ2hlY2sgfSA9IHByb3A7XG4gIGlmIChyZXF1aXJlZCAmJiBpc0Fic2VudCkge1xuICAgIHdhcm4kMSgnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICFyZXF1aXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgIT09IHRydWUgJiYgIXNraXBDaGVjaykge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZXMgPSBpc0FycmF5KHR5cGUpID8gdHlwZSA6IFt0eXBlXTtcbiAgICBjb25zdCBleHBlY3RlZFR5cGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGggJiYgIWlzVmFsaWQ7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWxpZCwgZXhwZWN0ZWRUeXBlIH0gPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlc1tpXSk7XG4gICAgICBleHBlY3RlZFR5cGVzLnB1c2goZXhwZWN0ZWRUeXBlIHx8IFwiXCIpO1xuICAgICAgaXNWYWxpZCA9IHZhbGlkO1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHdhcm4kMShnZXRJbnZhbGlkVHlwZU1lc3NhZ2UobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yKHZhbHVlLCBwcm9wcykpIHtcbiAgICB3YXJuJDEoJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nKTtcbiAgfVxufVxuY29uc3QgaXNTaW1wbGVUeXBlID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIFwiU3RyaW5nLE51bWJlcixCb29sZWFuLEZ1bmN0aW9uLFN5bWJvbCxCaWdJbnRcIlxuKTtcbmZ1bmN0aW9uIGFzc2VydFR5cGUodmFsdWUsIHR5cGUpIHtcbiAgbGV0IHZhbGlkO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBnZXRUeXBlKHR5cGUpO1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgIHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG4gIH0gZWxzZSBpZiAoaXNTaW1wbGVUeXBlKGV4cGVjdGVkVHlwZSkpIHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIHZhbGlkID0gdCA9PT0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCF2YWxpZCAmJiB0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIk9iamVjdFwiKSB7XG4gICAgdmFsaWQgPSBpc09iamVjdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIkFycmF5XCIpIHtcbiAgICB2YWxpZCA9IGlzQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xuICB9XG4gIHJldHVybiB7XG4gICAgdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlXG4gIH07XG59XG5mdW5jdGlvbiBnZXRJbnZhbGlkVHlwZU1lc3NhZ2UobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGV4cGVjdGVkVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGBQcm9wIHR5cGUgW10gZm9yIHByb3AgXCIke25hbWV9XCIgd29uJ3QgbWF0Y2ggYW55dGhpbmcuIERpZCB5b3UgbWVhbiB0byB1c2UgdHlwZSBBcnJheSBpbnN0ZWFkP2A7XG4gIH1cbiAgbGV0IG1lc3NhZ2UgPSBgSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIiR7bmFtZX1cIi4gRXhwZWN0ZWQgJHtleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKFwiIHwgXCIpfWA7XG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZXNbMF07XG4gIGNvbnN0IHJlY2VpdmVkVHlwZSA9IHRvUmF3VHlwZSh2YWx1ZSk7XG4gIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCBleHBlY3RlZFR5cGUpO1xuICBjb25zdCByZWNlaXZlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgcmVjZWl2ZWRUeXBlKTtcbiAgaWYgKGV4cGVjdGVkVHlwZXMubGVuZ3RoID09PSAxICYmIGlzRXhwbGljYWJsZShleHBlY3RlZFR5cGUpICYmIGlzQ29lcmNpYmxlKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNDb2VyY2libGUoLi4uYXJncykge1xuICByZXR1cm4gYXJncy5ldmVyeSgoZWxlbSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZWxlbS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB2YWx1ZSAhPT0gXCJib29sZWFuXCIgJiYgdmFsdWUgIT09IFwic3ltYm9sXCI7XG4gIH0pO1xufVxuXG5jb25zdCBpc0ludGVybmFsS2V5ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiX2N0eFwiIHx8IGtleSA9PT0gXCIkc3RhYmxlXCI7XG5jb25zdCBub3JtYWxpemVTbG90VmFsdWUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZOb2RlKSA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICBpZiAocmF3U2xvdC5fbikge1xuICAgIHJldHVybiByYXdTbG90O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRoQ3R4KCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudEluc3RhbmNlICYmICEoY3R4ID09PSBudWxsICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkgJiYgIShjdHggJiYgY3R4LnJvb3QgIT09IGN1cnJlbnRJbnN0YW5jZS5yb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgU2xvdCBcIiR7a2V5fVwiIGludm9rZWQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyIGZ1bmN0aW9uOiB0aGlzIHdpbGwgbm90IHRyYWNrIGRlcGVuZGVuY2llcyB1c2VkIGluIHRoZSBzbG90LiBJbnZva2UgdGhlIHNsb3QgZnVuY3Rpb24gaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplU2xvdFZhbHVlKHJhd1Nsb3QoLi4uYXJncykpO1xuICB9LCBjdHgpO1xuICBub3JtYWxpemVkLl9jID0gZmFsc2U7XG4gIHJldHVybiBub3JtYWxpemVkO1xufTtcbmNvbnN0IG5vcm1hbGl6ZU9iamVjdFNsb3RzID0gKHJhd1Nsb3RzLCBzbG90cywgaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgY3R4ID0gcmF3U2xvdHMuX2N0eDtcbiAgZm9yIChjb25zdCBrZXkgaW4gcmF3U2xvdHMpIHtcbiAgICBpZiAoaXNJbnRlcm5hbEtleShrZXkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHJhd1Nsb3RzW2tleV07XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICBzbG90c1trZXldID0gbm9ybWFsaXplU2xvdChrZXksIHZhbHVlLCBjdHgpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCBcIiR7a2V5fVwiLiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0tlZXBBbGl2ZShpbnN0YW5jZS52bm9kZSkgJiYgdHJ1ZSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZShjaGlsZHJlbik7XG4gIGluc3RhbmNlLnNsb3RzLmRlZmF1bHQgPSAoKSA9PiBub3JtYWxpemVkO1xufTtcbmNvbnN0IGFzc2lnblNsb3RzID0gKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIGNoaWxkcmVuKSB7XG4gICAgaWYgKG9wdGltaXplZCB8fCAhaXNJbnRlcm5hbEtleShrZXkpKSB7XG4gICAgICBzbG90c1trZXldID0gY2hpbGRyZW5ba2V5XTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBpbml0U2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgY29uc3Qgc2xvdHMgPSBpbnN0YW5jZS5zbG90cyA9IGNyZWF0ZUludGVybmFsT2JqZWN0KCk7XG4gIGlmIChpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBhc3NpZ25TbG90cyhzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgICBpZiAob3B0aW1pemVkKSB7XG4gICAgICAgIGRlZihzbG90cywgXCJfXCIsIHR5cGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhjaGlsZHJlbiwgc2xvdHMpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIG5vcm1hbGl6ZVZOb2RlU2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgfVxufTtcbmNvbnN0IHVwZGF0ZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGNvbnN0IHsgdm5vZGUsIHNsb3RzIH0gPSBpbnN0YW5jZTtcbiAgbGV0IG5lZWREZWxldGlvbkNoZWNrID0gdHJ1ZTtcbiAgbGV0IGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IEVNUFRZX09CSjtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgICAgYXNzaWduU2xvdHMoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgICB0cmlnZ2VyKGluc3RhbmNlLCBcInNldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2lnblNsb3RzKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSAhY2hpbGRyZW4uJHN0YWJsZTtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IHsgZGVmYXVsdDogMSB9O1xuICB9XG4gIGlmIChuZWVkRGVsZXRpb25DaGVjaykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICBpZiAoIWlzSW50ZXJuYWxLZXkoa2V5KSAmJiBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBzbG90c1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubGV0IHN1cHBvcnRlZDtcbmxldCBwZXJmO1xuZnVuY3Rpb24gc3RhcnRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgcGVyZi5tYXJrKGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZTdGFydChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5kTWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgIGNvbnN0IHN0YXJ0VGFnID0gYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWA7XG4gICAgY29uc3QgZW5kVGFnID0gc3RhcnRUYWcgKyBgOmVuZGA7XG4gICAgY29uc3QgbWVhc3VyZU5hbWUgPSBgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YDtcbiAgICBwZXJmLm1hcmsoZW5kVGFnKTtcbiAgICBwZXJmLm1lYXN1cmUobWVhc3VyZU5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIHBlcmYuY2xlYXJNZWFzdXJlcyhtZWFzdXJlTmFtZSk7XG4gICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICBwZXJmLmNsZWFyTWFya3MoZW5kVGFnKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZFbmQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICBpZiAoc3VwcG9ydGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gc3VwcG9ydGVkO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZXJmb3JtYW5jZSkge1xuICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgfSBlbHNlIHtcbiAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiBpbml0RmVhdHVyZUZsYWdzKCkge1xuICBjb25zdCBuZWVkV2FybiA9IFtdO1xuICBpZiAodHlwZW9mIF9fVlVFX09QVElPTlNfQVBJX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9PUFRJT05TX0FQSV9fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX09QVElPTlNfQVBJX18gPSB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9ERVZUT09MU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9ERVZUT09MU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfREVWVE9PTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bHRpID0gbmVlZFdhcm4ubGVuZ3RoID4gMTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgRmVhdHVyZSBmbGFnJHttdWx0aSA/IGBzYCA6IGBgfSAke25lZWRXYXJuLmpvaW4oXCIsIFwiKX0gJHttdWx0aSA/IGBhcmVgIDogYGlzYH0gbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsIHdoaWNoIGV4cGVjdHMgdGhlc2UgY29tcGlsZS10aW1lIGZlYXR1cmUgZmxhZ3MgdG8gYmUgZ2xvYmFsbHkgaW5qZWN0ZWQgdmlhIHRoZSBidW5kbGVyIGNvbmZpZyBpbiBvcmRlciB0byBnZXQgYmV0dGVyIHRyZWUtc2hha2luZyBpbiB0aGUgcHJvZHVjdGlvbiBidW5kbGUuXG5cbkZvciBtb3JlIGRldGFpbHMsIHNlZSBodHRwczovL2xpbmsudnVlanMub3JnL2ZlYXR1cmUtZmxhZ3MuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcXVldWVQb3N0UmVuZGVyRWZmZWN0ID0gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UgO1xuZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMsIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyk7XG59XG5mdW5jdGlvbiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gIHtcbiAgICBpbml0RmVhdHVyZUZsYWdzKCk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gZ2V0R2xvYmFsVGhpcygpO1xuICB0YXJnZXQuX19WVUVfXyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIHNldERldnRvb2xzSG9vayQxKHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLCB0YXJnZXQpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbnNlcnQ6IGhvc3RJbnNlcnQsXG4gICAgcmVtb3ZlOiBob3N0UmVtb3ZlLFxuICAgIHBhdGNoUHJvcDogaG9zdFBhdGNoUHJvcCxcbiAgICBjcmVhdGVFbGVtZW50OiBob3N0Q3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVUZXh0OiBob3N0Q3JlYXRlVGV4dCxcbiAgICBjcmVhdGVDb21tZW50OiBob3N0Q3JlYXRlQ29tbWVudCxcbiAgICBzZXRUZXh0OiBob3N0U2V0VGV4dCxcbiAgICBzZXRFbGVtZW50VGV4dDogaG9zdFNldEVsZW1lbnRUZXh0LFxuICAgIHBhcmVudE5vZGU6IGhvc3RQYXJlbnROb2RlLFxuICAgIG5leHRTaWJsaW5nOiBob3N0TmV4dFNpYmxpbmcsXG4gICAgc2V0U2NvcGVJZDogaG9zdFNldFNjb3BlSWQgPSBOT09QLFxuICAgIGluc2VydFN0YXRpY0NvbnRlbnQ6IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXRjaCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yID0gbnVsbCwgcGFyZW50Q29tcG9uZW50ID0gbnVsbCwgcGFyZW50U3VzcGVuc2UgPSBudWxsLCBuYW1lc3BhY2UgPSB2b2lkIDAsIHNsb3RTY29wZUlkcyA9IG51bGwsIG9wdGltaXplZCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZyA/IGZhbHNlIDogISFuMi5keW5hbWljQ2hpbGRyZW4pID0+IHtcbiAgICBpZiAobjEgPT09IG4yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuMSAmJiAhaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgIGFuY2hvciA9IGdldE5leHRIb3N0Tm9kZShuMSk7XG4gICAgICB1bm1vdW50KG4xLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgIG4xID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4yLnBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgbjIuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4yLmR5bmFtaWNDaGlsZHJlbiAmJiBuMSAmJiBuMS5keW5hbWljQ2hpbGRyZW4gJiYgbjEuZHluYW1pY0NoaWxkcmVuLmhhc09uY2UpIHtcbiAgICAgIGlmIChuMi5keW5hbWljQ2hpbGRyZW4gPT09IEVNUFRZX0FSUikge1xuICAgICAgICBuMi5keW5hbWljQ2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cbiAgICAgIG4yLmR5bmFtaWNDaGlsZHJlbi5oYXNPbmNlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIHByb2Nlc3NUZXh0KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgICAgIG1vdW50U3RhdGljTm9kZShuMiwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBhdGNoU3RhdGljTm9kZShuMSwgbjIsIGNvbnRhaW5lciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIHByb2Nlc3NGcmFnbWVudChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIHR5cGUucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCBWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCAmJiBwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHNldFJlZihyZWYsIG4xICYmIG4xLnJlZiwgcGFyZW50U3VzcGVuc2UsIG4yIHx8IG4xLCAhbjIpO1xuICAgIH0gZWxzZSBpZiAocmVmID09IG51bGwgJiYgbjEgJiYgbjEucmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihuMS5yZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCBuMSwgdHJ1ZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzVGV4dCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZVRleHQobjIuY2hpbGRyZW4pLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgICBob3N0U2V0VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbW1lbnROb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlQ29tbWVudChuMi5jaGlsZHJlbiB8fCBcIlwiKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudFN0YXRpY05vZGUgPSAobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UpID0+IHtcbiAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgbjIuZWwsXG4gICAgICBuMi5hbmNob3JcbiAgICApO1xuICB9O1xuICBjb25zdCBwYXRjaFN0YXRpY05vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGhvc3ROZXh0U2libGluZyhuMS5hbmNob3IpO1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZShuMSk7XG4gICAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0pID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICB9O1xuICBjb25zdCBwcm9jZXNzRWxlbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgaWYgKG4yLnR5cGUgPT09IFwic3ZnXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgfSBlbHNlIGlmIChuMi50eXBlID09PSBcIm1hdGhcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50RWxlbWVudChcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gbjEuZWwgJiYgbjEuZWwuX2lzVnVlQ0UgPyBuMS5lbCA6IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY3VzdG9tRWxlbWVudCkge1xuICAgICAgICAgIGN1c3RvbUVsZW1lbnQuX2JlZ2luUGF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaEVsZW1lbnQoXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoY3VzdG9tRWxlbWVudCkge1xuICAgICAgICAgIGN1c3RvbUVsZW1lbnQuX2VuZFBhdGNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50RWxlbWVudCA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBjb25zdCB7IHByb3BzLCBzaGFwZUZsYWcsIHRyYW5zaXRpb24sIGRpcnMgfSA9IHZub2RlO1xuICAgIGVsID0gdm5vZGUuZWwgPSBob3N0Q3JlYXRlRWxlbWVudChcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wcyAmJiBwcm9wcy5pcyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCB2bm9kZS5jaGlsZHJlbik7XG4gICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2Uodm5vZGUsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgfVxuICAgIHNldFNjb3BlSWQoZWwsIHZub2RlLCB2bm9kZS5zY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoa2V5ICE9PSBcInZhbHVlXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIG51bGwsIHByb3BzW2tleV0sIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYoZWwsIFwiX192bm9kZVwiLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICBkZWYoZWwsIFwiX192dWVQYXJlbnRDb21wb25lbnRcIiwgcGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIGNvbnN0IGlzSG1yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgbGV0IHByZXY7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSBwcmV2ID0gc2V0SG1yVXBkYXRpbmcoaXNIbXIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJtb3VudGVkXCIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSBzZXRIbXJVcGRhdGluZyhwcmV2KTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0U2NvcGVJZCA9IChlbCwgdm5vZGUsIHNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KSA9PiB7XG4gICAgaWYgKHNjb3BlSWQpIHtcbiAgICAgIGhvc3RTZXRTY29wZUlkKGVsLCBzY29wZUlkKTtcbiAgICB9XG4gICAgaWYgKHNsb3RTY29wZUlkcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbG90U2NvcGVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNsb3RTY29wZUlkc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIGxldCBzdWJUcmVlID0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWU7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzdWJUcmVlLnBhdGNoRmxhZyA+IDAgJiYgc3ViVHJlZS5wYXRjaEZsYWcgJiAyMDQ4KSB7XG4gICAgICAgIHN1YlRyZWUgPSBmaWx0ZXJTaW5nbGVSb290KHN1YlRyZWUuY2hpbGRyZW4pIHx8IHN1YlRyZWU7XG4gICAgICB9XG4gICAgICBpZiAodm5vZGUgPT09IHN1YlRyZWUgfHwgaXNTdXNwZW5zZShzdWJUcmVlLnR5cGUpICYmIChzdWJUcmVlLnNzQ29udGVudCA9PT0gdm5vZGUgfHwgc3ViVHJlZS5zc0ZhbGxiYWNrID09PSB2bm9kZSkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Vk5vZGUgPSBwYXJlbnRDb21wb25lbnQudm5vZGU7XG4gICAgICAgIHNldFNjb3BlSWQoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcGFyZW50Vk5vZGUsXG4gICAgICAgICAgcGFyZW50Vk5vZGUuc2NvcGVJZCxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LnBhcmVudFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoY2hpbGRyZW5baV0pIDogbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pO1xuICAgICAgcGF0Y2goXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNoaWxkLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoRWxlbWVudCA9IChuMSwgbjIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBlbCA9IG4yLmVsID0gbjEuZWw7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBlbC5fX3Zub2RlID0gbjI7XG4gICAgfVxuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBkaXJzIH0gPSBuMjtcbiAgICBwYXRjaEZsYWcgfD0gbjEucGF0Y2hGbGFnICYgMTY7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBuMS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBuMi5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIGZhbHNlKTtcbiAgICBpZiAodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVcGRhdGVcIik7XG4gICAgfVxuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgaWYgKFxuICAgICAgLy8gSE1SIHVwZGF0ZWQsIGZvcmNlIGZ1bGwgZGlmZlxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nIHx8IC8vICM2Mzg1IHRoZSBvbGQgdm5vZGUgbWF5IGJlIGEgdXNlci13cmFwcGVkIG5vbi1pc29tb3JwaGljIGJsb2NrXG4gICAgICAvLyBGb3JjZSBmdWxsIGRpZmYgd2hlbiBibG9jayBtZXRhZGF0YSBpcyB1bnN0YWJsZS5cbiAgICAgIGR5bmFtaWNDaGlsZHJlbiAmJiAoIW4xLmR5bmFtaWNDaGlsZHJlbiB8fCBuMS5keW5hbWljQ2hpbGRyZW4ubGVuZ3RoICE9PSBkeW5hbWljQ2hpbGRyZW4ubGVuZ3RoKVxuICAgICkge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG9sZFByb3BzLmlubmVySFRNTCAmJiBuZXdQcm9wcy5pbm5lckhUTUwgPT0gbnVsbCB8fCBvbGRQcm9wcy50ZXh0Q29udGVudCAmJiBuZXdQcm9wcy50ZXh0Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIFwiXCIpO1xuICAgIH1cbiAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBlbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKG4yLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICBwYXRjaENoaWxkcmVuKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UobjIsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgPiAwKSB7XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMTYpIHtcbiAgICAgICAgcGF0Y2hQcm9wcyhlbCwgb2xkUHJvcHMsIG5ld1Byb3BzLCBwYXJlbnRDb21wb25lbnQsIG5hbWVzcGFjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGF0Y2hGbGFnICYgMikge1xuICAgICAgICAgIGlmIChvbGRQcm9wcy5jbGFzcyAhPT0gbmV3UHJvcHMuY2xhc3MpIHtcbiAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwiY2xhc3NcIiwgbnVsbCwgbmV3UHJvcHMuY2xhc3MsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA0KSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJzdHlsZVwiLCBvbGRQcm9wcy5zdHlsZSwgbmV3UHJvcHMuc3R5bGUsIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDgpIHtcbiAgICAgICAgICBjb25zdCBwcm9wc1RvVXBkYXRlID0gbjIuZHluYW1pY1Byb3BzO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gcHJldiB8fCBrZXkgPT09IFwidmFsdWVcIikge1xuICAgICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIHByZXYsIG5leHQsIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxKSB7XG4gICAgICAgIGlmIChuMS5jaGlsZHJlbiAhPT0gbjIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW9wdGltaXplZCAmJiBkeW5hbWljQ2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgcGF0Y2hQcm9wcyhlbCwgb2xkUHJvcHMsIG5ld1Byb3BzLCBwYXJlbnRDb21wb25lbnQsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGlmICgodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZVVwZGF0ZWQpIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJ1cGRhdGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hCbG9ja0NoaWxkcmVuID0gKG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgZmFsbGJhY2tDb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IG5ld1ZOb2RlID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICBjb25zdCBjb250YWluZXIgPSAoXG4gICAgICAgIC8vIG9sZFZOb2RlIG1heSBiZSBhbiBlcnJvcmVkIGFzeW5jIHNldHVwKCkgY29tcG9uZW50IGluc2lkZSBTdXNwZW5zZVxuICAgICAgICAvLyB3aGljaCB3aWxsIG5vdCBoYXZlIGEgbW91bnRlZCBlbGVtZW50XG4gICAgICAgIG9sZFZOb2RlLmVsICYmIC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBGcmFnbWVudCwgd2UgbmVlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgcGFyZW50XG4gICAgICAgIC8vIG9mIHRoZSBGcmFnbWVudCBpdHNlbGYgc28gaXQgY2FuIG1vdmUgaXRzIGNoaWxkcmVuLlxuICAgICAgICAob2xkVk5vZGUudHlwZSA9PT0gRnJhZ21lbnQgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBkaWZmZXJlbnQgbm9kZXMsIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gd2hpY2ggYWxzbyByZXF1aXJlcyB0aGUgY29ycmVjdCBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgICFpc1NhbWVWTm9kZVR5cGUob2xkVk5vZGUsIG5ld1ZOb2RlKSB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50LCBpdCBjb3VsZCBjb250YWluIGFueXRoaW5nLlxuICAgICAgICBvbGRWTm9kZS5zaGFwZUZsYWcgJiAoNiB8IDY0IHwgMTI4KSkgPyBob3N0UGFyZW50Tm9kZShvbGRWTm9kZS5lbCkgOiAoXG4gICAgICAgICAgLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIG5vdCBhY3R1YWxseSB1c2VkIHNvIHdlXG4gICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBibG9jayBlbGVtZW50IGhlcmUgdG8gYXZvaWQgYSBET00gcGFyZW50Tm9kZSBjYWxsLlxuICAgICAgICAgIGZhbGxiYWNrQ29udGFpbmVyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwYXRjaChcbiAgICAgICAgb2xkVk5vZGUsXG4gICAgICAgIG5ld1ZOb2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hQcm9wcyA9IChlbCwgb2xkUHJvcHMsIG5ld1Byb3BzLCBwYXJlbnRDb21wb25lbnQsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMpIHtcbiAgICAgIGlmIChvbGRQcm9wcyAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9sZFByb3BzKSB7XG4gICAgICAgICAgaWYgKCFpc1Jlc2VydmVkUHJvcChrZXkpICYmICEoa2V5IGluIG5ld1Byb3BzKSkge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgb2xkUHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdQcm9wcykge1xuICAgICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG5leHQgIT09IHByZXYgJiYga2V5ICE9PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIHByZXYsIG5leHQsIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBuZXdQcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG9sZFByb3BzLnZhbHVlLCBuZXdQcm9wcy52YWx1ZSwgbmFtZXNwYWNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NGcmFnbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZnJhZ21lbnRTdGFydEFuY2hvciA9IG4yLmVsID0gbjEgPyBuMS5lbCA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGNvbnN0IGZyYWdtZW50RW5kQW5jaG9yID0gbjIuYW5jaG9yID0gbjEgPyBuMS5hbmNob3IgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBsZXQgeyBwYXRjaEZsYWcsIGR5bmFtaWNDaGlsZHJlbiwgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgLy8gIzU1MjMgZGV2IHJvb3QgZnJhZ21lbnQgbWF5IGluaGVyaXQgZGlyZWN0aXZlc1xuICAgIChpc0htclVwZGF0aW5nIHx8IHBhdGNoRmxhZyAmIDIwNDgpKSB7XG4gICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcyA/IHNsb3RTY29wZUlkcy5jb25jYXQoZnJhZ21lbnRTbG90U2NvcGVJZHMpIDogZnJhZ21lbnRTbG90U2NvcGVJZHM7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50U3RhcnRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRFbmRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIC8vICMxMDAwN1xuICAgICAgICAvLyBzdWNoIGZyYWdtZW50IGxpa2UgYDw+PC8+YCB3aWxsIGJlIGNvbXBpbGVkIGludG9cbiAgICAgICAgLy8gYSBmcmFnbWVudCB3aGljaCBkb2Vzbid0IGhhdmUgYSBjaGlsZHJlbi5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGZhbGxiYWNrIHRvIGFuIGVtcHR5IGFycmF5XG4gICAgICAgIG4yLmNoaWxkcmVuIHx8IFtdLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGF0Y2hGbGFnID4gMCAmJiBwYXRjaEZsYWcgJiA2NCAmJiBkeW5hbWljQ2hpbGRyZW4gJiYgLy8gIzI3MTUgdGhlIHByZXZpb3VzIGZyYWdtZW50IGNvdWxkJ3ZlIGJlZW4gYSBCQUlMZWQgb25lIGFzIGEgcmVzdWx0XG4gICAgICAvLyBvZiByZW5kZXJTbG90KCkgd2l0aCBubyB2YWxpZCBjaGlsZHJlblxuICAgICAgbjEuZHluYW1pY0NoaWxkcmVuICYmIG4xLmR5bmFtaWNDaGlsZHJlbi5sZW5ndGggPT09IGR5bmFtaWNDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENvbXBvbmVudCA9IChpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBmYWxzZSwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIGluaXRpYWxWTm9kZS5lbCA9IG51bGw7XG4gICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5yZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QsIG9wdGltaXplZCk7XG4gICAgICBpZiAoIWluaXRpYWxWTm9kZS5lbCkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGluc3RhbmNlLnN1YlRyZWUgPSBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG51bGwsIHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGluaXRpYWxWTm9kZS5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyLmVsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudCA9IChuMSwgbjIsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50O1xuICAgIGlmIChzaG91bGRVcGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobjIpO1xuICAgICAgICB9XG4gICAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbjI7XG4gICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgaW5zdGFuY2Uudm5vZGUgPSBuMjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldHVwUmVuZGVyRWZmZWN0ID0gKGluc3RhbmNlLCBpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBjb21wb25lbnRVcGRhdGVGbiA9ICgpID0+IHtcbiAgICAgIGlmICghaW5zdGFuY2UuaXNNb3VudGVkKSB7XG4gICAgICAgIGxldCB2bm9kZUhvb2s7XG4gICAgICAgIGNvbnN0IHsgZWwsIHByb3BzIH0gPSBpbml0aWFsVk5vZGU7XG4gICAgICAgIGNvbnN0IHsgYm0sIG0sIHBhcmVudCwgcm9vdCwgdHlwZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGlzQXN5bmNXcmFwcGVyVk5vZGUgPSBpc0FzeW5jV3JhcHBlcihpbml0aWFsVk5vZGUpO1xuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChibSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXN5bmNXcmFwcGVyVk5vZGUgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkpIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIGluaXRpYWxWTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChlbCAmJiBoeWRyYXRlTm9kZSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVTdWJUcmVlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoeWRyYXRlTm9kZShcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXJWTm9kZSAmJiB0eXBlLl9fYXN5bmNIeWRyYXRlKSB7XG4gICAgICAgICAgICB0eXBlLl9fYXN5bmNIeWRyYXRlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGh5ZHJhdGVTdWJUcmVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocm9vdC5jZSAmJiByb290LmNlLl9oYXNTaGFkb3dSb290KCkpIHtcbiAgICAgICAgICAgIHJvb3QuY2UuX2luamVjdENoaWxkU3R5bGUoXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLnBhcmVudCA/IGluc3RhbmNlLnBhcmVudC50eXBlIDogdm9pZCAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5pc1VubW91bnRlZCkgdXBkYXRlKCk7XG4gICAgICAgICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgb3JpZ2luTmV4dCA9IG5leHQ7XG4gICAgICAgIGxldCB2bm9kZUhvb2s7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG5leHQgfHwgaW5zdGFuY2Uudm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0LmVsID0gdm5vZGUuZWw7XG4gICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnUpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhidSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZub2RlSG9vayA9IG5leHQucHJvcHMgJiYgbmV4dC5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dFRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICAgICAgICBpbnN0YW5jZS5zdWJUcmVlID0gbmV4dFRyZWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBwcmV2VHJlZSxcbiAgICAgICAgICBuZXh0VHJlZSxcbiAgICAgICAgICAvLyBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBpZiBpdCdzIGluIGEgdGVsZXBvcnRcbiAgICAgICAgICBob3N0UGFyZW50Tm9kZShwcmV2VHJlZS5lbCksXG4gICAgICAgICAgLy8gYW5jaG9yIG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIGZyYWdtZW50XG4gICAgICAgICAgZ2V0TmV4dEhvc3ROb2RlKHByZXZUcmVlKSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmVsID0gbmV4dFRyZWUuZWw7XG4gICAgICAgIGlmIChvcmlnaW5OZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSE9DSG9zdEVsKGluc3RhbmNlLCBuZXh0VHJlZS5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QodSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZVVwZGF0ZWQpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIG5leHQsIHZub2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaW5zdGFuY2Uuc2NvcGUub24oKTtcbiAgICBjb25zdCBlZmZlY3QgPSBpbnN0YW5jZS5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoY29tcG9uZW50VXBkYXRlRm4pO1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGluc3RhbmNlLnVwZGF0ZSA9IGVmZmVjdC5ydW4uYmluZChlZmZlY3QpO1xuICAgIGNvbnN0IGpvYiA9IGluc3RhbmNlLmpvYiA9IGVmZmVjdC5ydW5JZkRpcnR5LmJpbmQoZWZmZWN0KTtcbiAgICBqb2IuaSA9IGluc3RhbmNlO1xuICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBlZmZlY3Quc2NoZWR1bGVyID0gKCkgPT4gcXVldWVKb2Ioam9iKTtcbiAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZWZmZWN0Lm9uVHJhY2sgPSBpbnN0YW5jZS5ydGMgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRjLCBlKSA6IHZvaWQgMDtcbiAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBpbnN0YW5jZS5ydGcgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRnLCBlKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgdXBkYXRlKCk7XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlciA9IChpbnN0YW5jZSwgbmV4dFZOb2RlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBuZXh0Vk5vZGUuY29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgY29uc3QgcHJldlByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHM7XG4gICAgaW5zdGFuY2Uudm5vZGUgPSBuZXh0Vk5vZGU7XG4gICAgaW5zdGFuY2UubmV4dCA9IG51bGw7XG4gICAgdXBkYXRlUHJvcHMoaW5zdGFuY2UsIG5leHRWTm9kZS5wcm9wcywgcHJldlByb3BzLCBvcHRpbWl6ZWQpO1xuICAgIHVwZGF0ZVNsb3RzKGluc3RhbmNlLCBuZXh0Vk5vZGUuY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIGZsdXNoUHJlRmx1c2hDYnMoaW5zdGFuY2UpO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgfTtcbiAgY29uc3QgcGF0Y2hDaGlsZHJlbiA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBjMSA9IG4xICYmIG4xLmNoaWxkcmVuO1xuICAgIGNvbnN0IHByZXZTaGFwZUZsYWcgPSBuMSA/IG4xLnNoYXBlRmxhZyA6IDA7XG4gICAgY29uc3QgYzIgPSBuMi5jaGlsZHJlbjtcbiAgICBjb25zdCB7IHBhdGNoRmxhZywgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEyOCkge1xuICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgYzEsXG4gICAgICAgICAgYzIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiAyNTYpIHtcbiAgICAgICAgcGF0Y2hVbmtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgYzEsXG4gICAgICAgICAgYzIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGMyICE9PSBjMSkge1xuICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoY29udGFpbmVyLCBjMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgICAgYzEsXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoY29udGFpbmVyLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgYzIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoVW5rZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjMSA9IGMxIHx8IEVNUFRZX0FSUjtcbiAgICBjMiA9IGMyIHx8IEVNUFRZX0FSUjtcbiAgICBjb25zdCBvbGRMZW5ndGggPSBjMS5sZW5ndGg7XG4gICAgY29uc3QgbmV3TGVuZ3RoID0gYzIubGVuZ3RoO1xuICAgIGNvbnN0IGNvbW1vbkxlbmd0aCA9IE1hdGgubWluKG9sZExlbmd0aCwgbmV3TGVuZ3RoKTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29tbW9uTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgcGF0Y2goXG4gICAgICAgIGMxW2ldLFxuICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9sZExlbmd0aCA+IG5ld0xlbmd0aCkge1xuICAgICAgdW5tb3VudENoaWxkcmVuKFxuICAgICAgICBjMSxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGNvbW1vbkxlbmd0aFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgYzIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBsMiA9IGMyLmxlbmd0aDtcbiAgICBsZXQgZTEgPSBjMS5sZW5ndGggLSAxO1xuICAgIGxldCBlMiA9IGwyIC0gMTtcbiAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICBjb25zdCBuMSA9IGMxW2ldO1xuICAgICAgY29uc3QgbjIgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICBjb25zdCBuMSA9IGMxW2UxXTtcbiAgICAgIGNvbnN0IG4yID0gYzJbZTJdID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbZTJdKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2UyXSk7XG4gICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGUxLS07XG4gICAgICBlMi0tO1xuICAgIH1cbiAgICBpZiAoaSA+IGUxKSB7XG4gICAgICBpZiAoaSA8PSBlMikge1xuICAgICAgICBjb25zdCBuZXh0UG9zID0gZTIgKyAxO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0UG9zIDwgbDIgPyBjMltuZXh0UG9zXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgd2hpbGUgKGkgPD0gZTIpIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGkgPiBlMikge1xuICAgICAgd2hpbGUgKGkgPD0gZTEpIHtcbiAgICAgICAgdW5tb3VudChjMVtpXSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgczEgPSBpO1xuICAgICAgY29uc3QgczIgPSBpO1xuICAgICAgY29uc3Qga2V5VG9OZXdJbmRleE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBmb3IgKGkgPSBzMjsgaSA8PSBlMjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgICBpZiAobmV4dENoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5VG9OZXdJbmRleE1hcC5oYXMobmV4dENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBrZXlzIGZvdW5kIGR1cmluZyB1cGRhdGU6YCxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dENoaWxkLmtleSksXG4gICAgICAgICAgICAgIGBNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleVRvTmV3SW5kZXhNYXAuc2V0KG5leHRDaGlsZC5rZXksIGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgajtcbiAgICAgIGxldCBwYXRjaGVkID0gMDtcbiAgICAgIGNvbnN0IHRvQmVQYXRjaGVkID0gZTIgLSBzMiArIDE7XG4gICAgICBsZXQgbW92ZWQgPSBmYWxzZTtcbiAgICAgIGxldCBtYXhOZXdJbmRleFNvRmFyID0gMDtcbiAgICAgIGNvbnN0IG5ld0luZGV4VG9PbGRJbmRleE1hcCA9IG5ldyBBcnJheSh0b0JlUGF0Y2hlZCk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdG9CZVBhdGNoZWQ7IGkrKykgbmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID0gMDtcbiAgICAgIGZvciAoaSA9IHMxOyBpIDw9IGUxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkID0gYzFbaV07XG4gICAgICAgIGlmIChwYXRjaGVkID49IHRvQmVQYXRjaGVkKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdJbmRleDtcbiAgICAgICAgaWYgKHByZXZDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld0luZGV4ID0ga2V5VG9OZXdJbmRleE1hcC5nZXQocHJldkNoaWxkLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChqID0gczI7IGogPD0gZTI7IGorKykge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtqIC0gczJdID09PSAwICYmIGlzU2FtZVZOb2RlVHlwZShwcmV2Q2hpbGQsIGMyW2pdKSkge1xuICAgICAgICAgICAgICBuZXdJbmRleCA9IGo7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3SW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdJbmRleFRvT2xkSW5kZXhNYXBbbmV3SW5kZXggLSBzMl0gPSBpICsgMTtcbiAgICAgICAgICBpZiAobmV3SW5kZXggPj0gbWF4TmV3SW5kZXhTb0Zhcikge1xuICAgICAgICAgICAgbWF4TmV3SW5kZXhTb0ZhciA9IG5ld0luZGV4O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgcHJldkNoaWxkLFxuICAgICAgICAgICAgYzJbbmV3SW5kZXhdLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXRjaGVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlID0gbW92ZWQgPyBnZXRTZXF1ZW5jZShuZXdJbmRleFRvT2xkSW5kZXhNYXApIDogRU1QVFlfQVJSO1xuICAgICAgaiA9IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKGkgPSB0b0JlUGF0Y2hlZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHMyICsgaTtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbbmV4dEluZGV4XTtcbiAgICAgICAgY29uc3QgYW5jaG9yVk5vZGUgPSBjMltuZXh0SW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dEluZGV4ICsgMSA8IGwyID8gKFxuICAgICAgICAgIC8vICMxMzU1OSwgIzE0MTczIGZhbGxiYWNrIHRvIGVsIHBsYWNlaG9sZGVyIGZvciB1bnJlc29sdmVkIGFzeW5jIGNvbXBvbmVudFxuICAgICAgICAgIGFuY2hvclZOb2RlLmVsIHx8IHJlc29sdmVBc3luY0NvbXBvbmVudFBsYWNlaG9sZGVyKGFuY2hvclZOb2RlKVxuICAgICAgICApIDogcGFyZW50QW5jaG9yO1xuICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID09PSAwKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgaWYgKGogPCAwIHx8IGkgIT09IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlW2pdKSB7XG4gICAgICAgICAgICBtb3ZlKG5leHRDaGlsZCwgY29udGFpbmVyLCBhbmNob3IsIDIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUsIHBhcmVudFN1c3BlbnNlID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHsgZWwsIHR5cGUsIHRyYW5zaXRpb24sIGNoaWxkcmVuLCBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICBtb3ZlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB2bm9kZS5zdXNwZW5zZS5tb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZS5tb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgaW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoY2hpbGRyZW5baV0sIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICB9XG4gICAgICBob3N0SW5zZXJ0KHZub2RlLmFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICBtb3ZlU3RhdGljTm9kZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZWVkVHJhbnNpdGlvbjIgPSBtb3ZlVHlwZSAhPT0gMiAmJiBzaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb247XG4gICAgaWYgKG5lZWRUcmFuc2l0aW9uMikge1xuICAgICAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgICAgIGlmICh0cmFuc2l0aW9uLnBlcnNpc3RlZCAmJiAhZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB0cmFuc2l0aW9uLmVudGVyKGVsKSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlLCBhZnRlckxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCByZW1vdmUyID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh2bm9kZS5jdHguaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd2FzTGVhdmluZyA9IGVsLl9pc0xlYXZpbmcgfHwgISFlbFtsZWF2ZUNiS2V5XTtcbiAgICAgICAgICBpZiAoZWwuX2lzTGVhdmluZykge1xuICAgICAgICAgICAgZWxbbGVhdmVDYktleV0oXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgIXdhc0xlYXZpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZTIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVtb3ZlMigpO1xuICAgICAgICAgICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgICBkZWxheUxlYXZlKGVsLCByZW1vdmUyLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnQgPSAodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgcmVmLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkaXJzLFxuICAgICAgY2FjaGVJbmRleCxcbiAgICAgIG1lbW9cbiAgICB9ID0gdm5vZGU7XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIgfHwgZHluYW1pY0NoaWxkcmVuICYmIGR5bmFtaWNDaGlsZHJlbi5oYXNPbmNlKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBzZXRSZWYocmVmLCBudWxsLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIHRydWUpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVJbmRleCAhPSBudWxsICYmICghdm5vZGUuY3R4IHx8IHZub2RlLmN0eCA9PT0gcGFyZW50Q29tcG9uZW50KSkge1xuICAgICAgcGFyZW50Q29tcG9uZW50LnJlbmRlckNhY2hlW2NhY2hlSW5kZXhdID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICBwYXJlbnRDb21wb25lbnQuY3R4LmRlYWN0aXZhdGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRJbnZva2VEaXJzID0gc2hhcGVGbGFnICYgMSAmJiBkaXJzO1xuICAgIGNvbnN0IHNob3VsZEludm9rZVZub2RlSG9vayA9ICFpc0FzeW5jV3JhcHBlcih2bm9kZSk7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBpZiAoc2hvdWxkSW52b2tlVm5vZGVIb29rICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlVW5tb3VudCkpIHtcbiAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgdW5tb3VudENvbXBvbmVudCh2bm9kZS5jb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgdm5vZGUuc3VzcGVuc2UudW5tb3VudChwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkSW52b2tlRGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlVW5tb3VudFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICB2bm9kZS50eXBlLnJlbW92ZShcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjNTE1NFxuICAgICAgLy8gd2hlbiB2LW9uY2UgaXMgdXNlZCBpbnNpZGUgYSBibG9jaywgc2V0QmxvY2tUcmFja2luZygtMSkgbWFya3MgdGhlXG4gICAgICAvLyBwYXJlbnQgYmxvY2sgd2l0aCBoYXNPbmNlOiB0cnVlXG4gICAgICAvLyBzbyB0aGF0IGl0IGRvZXNuJ3QgdGFrZSB0aGUgZmFzdCBwYXRoIGR1cmluZyB1bm1vdW50IC0gb3RoZXJ3aXNlXG4gICAgICAvLyBjb21wb25lbnRzIG5lc3RlZCBpbiB2LW9uY2UgYXJlIG5ldmVyIHVubW91bnRlZC5cbiAgICAgICFkeW5hbWljQ2hpbGRyZW4uaGFzT25jZSAmJiAvLyAjMTE1MzogZmFzdCBwYXRoIHNob3VsZCBub3QgYmUgdGFrZW4gZm9yIG5vbi1zdGFibGUgKHYtZm9yKSBmcmFnbWVudHNcbiAgICAgICh0eXBlICE9PSBGcmFnbWVudCB8fCBwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0KSkge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEZyYWdtZW50ICYmIHBhdGNoRmxhZyAmICgxMjggfCAyNTYpIHx8ICFvcHRpbWl6ZWQgJiYgc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb1JlbW92ZSkge1xuICAgICAgICByZW1vdmUodm5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzaG91bGRJbnZhbGlkYXRlTWVtbyA9IG1lbW8gIT0gbnVsbCAmJiBjYWNoZUluZGV4ID09IG51bGw7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZVVubW91bnRlZCkgfHwgc2hvdWxkSW52b2tlRGlycyB8fCBzaG91bGRJbnZhbGlkYXRlTWVtbykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBzaG91bGRJbnZva2VEaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJ1bm1vdW50ZWRcIik7XG4gICAgICAgIGlmIChzaG91bGRJbnZhbGlkYXRlTWVtbykge1xuICAgICAgICAgIHZub2RlLmVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkICYmIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmFmdGVyTGVhdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGVyZm9ybVJlbW92ZSA9ICgpID0+IHtcbiAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkICYmIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmFmdGVyTGVhdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4gbGVhdmUoZWwsIHBlcmZvcm1SZW1vdmUpO1xuICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgZGVsYXlMZWF2ZSh2bm9kZS5lbCwgcGVyZm9ybVJlbW92ZSwgcGVyZm9ybUxlYXZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZXJmb3JtUmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmVGcmFnbWVudCA9IChjdXIsIGVuZCkgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChjdXIgIT09IGVuZCkge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhjdXIpO1xuICAgICAgaG9zdFJlbW92ZShjdXIpO1xuICAgICAgY3VyID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShlbmQpO1xuICB9O1xuICBjb25zdCB1bm1vdW50Q29tcG9uZW50ID0gKGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBjb25zdCB7IGJ1bSwgc2NvcGUsIGpvYiwgc3ViVHJlZSwgdW0sIG0sIGEgfSA9IGluc3RhbmNlO1xuICAgIGludmFsaWRhdGVNb3VudChtKTtcbiAgICBpbnZhbGlkYXRlTW91bnQoYSk7XG4gICAgaWYgKGJ1bSkge1xuICAgICAgaW52b2tlQXJyYXlGbnMoYnVtKTtcbiAgICB9XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIGlmIChqb2IpIHtcbiAgICAgIGpvYi5mbGFncyB8PSA4O1xuICAgICAgdW5tb3VudChzdWJUcmVlLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLnZub2RlLmVsICYmIHN1YlRyZWUpIHtcbiAgICAgIHN1YlRyZWUudHJhbnNpdGlvbiA9IGluc3RhbmNlLnZub2RlLnRyYW5zaXRpb247XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdW5tb3VudChjaGlsZHJlbltpXSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBnZXROZXh0SG9zdE5vZGUgPSAodm5vZGUpID0+IHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNikge1xuICAgICAgcmV0dXJuIGdldE5leHRIb3N0Tm9kZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHJldHVybiB2bm9kZS5zdXNwZW5zZS5uZXh0KCk7XG4gICAgfVxuICAgIGNvbnN0IGVsID0gaG9zdE5leHRTaWJsaW5nKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCk7XG4gICAgY29uc3QgdGVsZXBvcnRFbmQgPSBlbCAmJiBlbFtUZWxlcG9ydEVuZEtleV07XG4gICAgcmV0dXJuIHRlbGVwb3J0RW5kID8gaG9zdE5leHRTaWJsaW5nKHRlbGVwb3J0RW5kKSA6IGVsO1xuICB9O1xuICBsZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xuICBjb25zdCByZW5kZXIgPSAodm5vZGUsIGNvbnRhaW5lciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgbGV0IGluc3RhbmNlO1xuICAgIGlmICh2bm9kZSA9PSBudWxsKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl92bm9kZSkge1xuICAgICAgICB1bm1vdW50KGNvbnRhaW5lci5fdm5vZGUsIG51bGwsIG51bGwsIHRydWUpO1xuICAgICAgICBpbnN0YW5jZSA9IGNvbnRhaW5lci5fdm5vZGUuY29tcG9uZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaChcbiAgICAgICAgY29udGFpbmVyLl92bm9kZSB8fCBudWxsLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSk7XG4gICAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgIHA6IHBhdGNoLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG06IG1vdmUsXG4gICAgcjogcmVtb3ZlLFxuICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICBuOiBnZXROZXh0SG9zdE5vZGUsXG4gICAgbzogb3B0aW9uc1xuICB9O1xuICBsZXQgaHlkcmF0ZTtcbiAgbGV0IGh5ZHJhdGVOb2RlO1xuICBpZiAoY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gICAgW2h5ZHJhdGUsIGh5ZHJhdGVOb2RlXSA9IGNyZWF0ZUh5ZHJhdGlvbkZucyhcbiAgICAgIGludGVybmFsc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW5kZXIsXG4gICAgaHlkcmF0ZSxcbiAgICBjcmVhdGVBcHA6IGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UoeyB0eXBlLCBwcm9wcyB9LCBjdXJyZW50TmFtZXNwYWNlKSB7XG4gIHJldHVybiBjdXJyZW50TmFtZXNwYWNlID09PSBcInN2Z1wiICYmIHR5cGUgPT09IFwiZm9yZWlnbk9iamVjdFwiIHx8IGN1cnJlbnROYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgJiYgdHlwZSA9PT0gXCJhbm5vdGF0aW9uLXhtbFwiICYmIHByb3BzICYmIHByb3BzLmVuY29kaW5nICYmIHByb3BzLmVuY29kaW5nLmluY2x1ZGVzKFwiaHRtbFwiKSA/IHZvaWQgMCA6IGN1cnJlbnROYW1lc3BhY2U7XG59XG5mdW5jdGlvbiB0b2dnbGVSZWN1cnNlKHsgZWZmZWN0LCBqb2IgfSwgYWxsb3dlZCkge1xuICBpZiAoYWxsb3dlZCkge1xuICAgIGVmZmVjdC5mbGFncyB8PSAzMjtcbiAgICBqb2IuZmxhZ3MgfD0gNDtcbiAgfSBlbHNlIHtcbiAgICBlZmZlY3QuZmxhZ3MgJj0gLTMzO1xuICAgIGpvYi5mbGFncyAmPSAtNTtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZFRyYW5zaXRpb24ocGFyZW50U3VzcGVuc2UsIHRyYW5zaXRpb24pIHtcbiAgcmV0dXJuICghcGFyZW50U3VzcGVuc2UgfHwgcGFyZW50U3VzcGVuc2UgJiYgIXBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkO1xufVxuZnVuY3Rpb24gdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHNoYWxsb3cgPSBmYWxzZSkge1xuICBjb25zdCBjaDEgPSBuMS5jaGlsZHJlbjtcbiAgY29uc3QgY2gyID0gbjIuY2hpbGRyZW47XG4gIGlmIChpc0FycmF5KGNoMSkgJiYgaXNBcnJheShjaDIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaDEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMxID0gY2gxW2ldO1xuICAgICAgbGV0IGMyID0gY2gyW2ldO1xuICAgICAgaWYgKGMyLnNoYXBlRmxhZyAmIDEgJiYgIWMyLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBpZiAoYzIucGF0Y2hGbGFnIDw9IDAgfHwgYzIucGF0Y2hGbGFnID09PSAzMikge1xuICAgICAgICAgIGMyID0gY2gyW2ldID0gY2xvbmVJZk1vdW50ZWQoY2gyW2ldKTtcbiAgICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hhbGxvdyAmJiBjMi5wYXRjaEZsYWcgIT09IC0yKVxuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oYzEsIGMyKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBUZXh0KSB7XG4gICAgICAgIGlmIChjMi5wYXRjaEZsYWcgPT09IC0xKSB7XG4gICAgICAgICAgYzIgPSBjaDJbaV0gPSBjbG9uZUlmTW91bnRlZChjMik7XG4gICAgICAgIH1cbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBDb21tZW50ICYmICFjMi5lbCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgYzIuZWwgJiYgKGMyLmVsLl9fdm5vZGUgPSBjMik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qgc3ViQ29tcG9uZW50ID0gaW5zdGFuY2Uuc3ViVHJlZS5jb21wb25lbnQ7XG4gIGlmIChzdWJDb21wb25lbnQpIHtcbiAgICBpZiAoc3ViQ29tcG9uZW50LmFzeW5jRGVwICYmICFzdWJDb21wb25lbnQuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHN1YkNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KHN1YkNvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlTW91bnQoaG9va3MpIHtcbiAgaWYgKGhvb2tzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKylcbiAgICAgIGhvb2tzW2ldLmZsYWdzIHw9IDg7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudFBsYWNlaG9sZGVyKGFuY2hvclZub2RlKSB7XG4gIGlmIChhbmNob3JWbm9kZS5wbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBhbmNob3JWbm9kZS5wbGFjZWhvbGRlcjtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGFuY2hvclZub2RlLmNvbXBvbmVudDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3luY0NvbXBvbmVudFBsYWNlaG9sZGVyKGluc3RhbmNlLnN1YlRyZWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBpc1N1c3BlbnNlID0gKHR5cGUpID0+IHR5cGUuX19pc1N1c3BlbnNlO1xubGV0IHN1c3BlbnNlSWQgPSAwO1xuY29uc3QgU3VzcGVuc2VJbXBsID0ge1xuICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gIC8vIEluIG9yZGVyIHRvIG1ha2UgU3VzcGVuc2UgdHJlZS1zaGFrYWJsZSwgd2UgbmVlZCB0byBhdm9pZCBpbXBvcnRpbmcgaXRcbiAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgLy8gb24gYSB2bm9kZSdzIHR5cGUgYW5kIGNhbGxzIHRoZSBgcHJvY2Vzc2AgbWV0aG9kLCBwYXNzaW5nIGluIHJlbmRlcmVyXG4gIC8vIGludGVybmFscy5cbiAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50U3VzcGVuc2UoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5kZXBzID4gMCAmJiAhbjEuc3VzcGVuc2UuaXNJbkZhbGxiYWNrICYmICFwYXJlbnRTdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICBuMi5zdXNwZW5zZS52bm9kZSA9IG4yO1xuICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG5jb25zdCBTdXNwZW5zZSA9IFN1c3BlbnNlSW1wbCA7XG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodm5vZGUsIG5hbWUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzW25hbWVdO1xuICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgIGV2ZW50TGlzdGVuZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFsc1xuICApO1xuICBwYXRjaChcbiAgICBudWxsLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIG51bGwsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHNcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPiAwKSB7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uUGVuZGluZ1wiKTtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25GYWxsYmFja1wiKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZS5zc0ZhbGxiYWNrLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICBjb25zdCBzdXNwZW5zZSA9IG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2U7XG4gIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gIG4yLmVsID0gbjEuZWw7XG4gIGNvbnN0IG5ld0JyYW5jaCA9IG4yLnNzQ29udGVudDtcbiAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICBjb25zdCB7IGFjdGl2ZUJyYW5jaCwgcGVuZGluZ0JyYW5jaCwgaXNJbkZhbGxiYWNrLCBpc0h5ZHJhdGluZyB9ID0gc3VzcGVuc2U7XG4gIGlmIChwZW5kaW5nQnJhbmNoKSB7XG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKHBlbmRpbmdCcmFuY2gsIG5ld0JyYW5jaCkpIHtcbiAgICAgIHN1c3BlbnNlLmRlcHMrKztcbiAgICAgIHBhdGNoKFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIC8vIGEgaHlkcmF0aW5nIHBlbmRpbmcgYnJhbmNoIGlzIGFkb3B0ZWQgU1NSIERPTSwgYWxyZWFkeSBpbiBwbGFjZVxuICAgICAgICBpc0h5ZHJhdGluZyA/IGNvbnRhaW5lciA6IHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHN1c3BlbnNlLmRlcHMtLTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKCFpc0h5ZHJhdGluZyAmJiAhc3VzcGVuc2UuaXNGYWxsYmFja01vdW50UGVuZGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IHBlbmRpbmdCcmFuY2g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KHBlbmRpbmdCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmICghc3VzcGVuc2UuaXNGYWxsYmFja01vdW50UGVuZGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShhY3RpdmVCcmFuY2gsIG5ld0JyYW5jaCkpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUoYWN0aXZlQnJhbmNoLCBuZXdCcmFuY2gpKSB7XG4gICAgICBwYXRjaChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdCcmFuY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXZlbnQobjIsIFwib25QZW5kaW5nXCIpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICAgIGlmIChuZXdCcmFuY2guc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IG5ld0JyYW5jaC5jb21wb25lbnQuc3VzcGVuc2VJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IHN1c3BlbnNlSWQrKztcbiAgICAgIH1cbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0LCBwZW5kaW5nSWQgfSA9IHN1c3BlbnNlO1xuICAgICAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nSWQgPT09IHBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGltZW91dCA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxubGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSh2bm9kZSwgcGFyZW50U3VzcGVuc2UsIHBhcmVudENvbXBvbmVudCwgY29udGFpbmVyLCBoaWRkZW5Db250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGlzSHlkcmF0aW5nID0gZmFsc2UpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSAmJiAhaGFzV2FybmVkKSB7XG4gICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/IFwiaW5mb1wiIDogXCJsb2dcIl0oXG4gICAgICBgPFN1c3BlbnNlPiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgaXRzIEFQSSB3aWxsIGxpa2VseSBjaGFuZ2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qge1xuICAgIHA6IHBhdGNoLFxuICAgIG06IG1vdmUsXG4gICAgdW06IHVubW91bnQsXG4gICAgbjogbmV4dCxcbiAgICBvOiB7IHBhcmVudE5vZGUsIHJlbW92ZSB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgbGV0IHBhcmVudFN1c3BlbnNlSWQ7XG4gIGNvbnN0IGlzU3VzcGVuc2libGUgPSBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpO1xuICBpZiAoaXNTdXNwZW5zaWJsZSkge1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZUlkID0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkO1xuICAgICAgcGFyZW50U3VzcGVuc2UuZGVwcysrO1xuICAgIH1cbiAgfVxuICBjb25zdCB0aW1lb3V0ID0gdm5vZGUucHJvcHMgPyB0b051bWJlcih2bm9kZS5wcm9wcy50aW1lb3V0KSA6IHZvaWQgMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhc3NlcnROdW1iZXIodGltZW91dCwgYFN1c3BlbnNlIHRpbWVvdXRgKTtcbiAgfVxuICBjb25zdCBpbml0aWFsQW5jaG9yID0gYW5jaG9yO1xuICBjb25zdCBzdXNwZW5zZSA9IHtcbiAgICB2bm9kZSxcbiAgICBwYXJlbnQ6IHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBuYW1lc3BhY2UsXG4gICAgY29udGFpbmVyLFxuICAgIGhpZGRlbkNvbnRhaW5lcixcbiAgICBkZXBzOiAwLFxuICAgIHBlbmRpbmdJZDogc3VzcGVuc2VJZCsrLFxuICAgIHRpbWVvdXQ6IHR5cGVvZiB0aW1lb3V0ID09PSBcIm51bWJlclwiID8gdGltZW91dCA6IC0xLFxuICAgIGFjdGl2ZUJyYW5jaDogbnVsbCxcbiAgICBpc0ZhbGxiYWNrTW91bnRQZW5kaW5nOiBmYWxzZSxcbiAgICBwZW5kaW5nQnJhbmNoOiBudWxsLFxuICAgIGlzSW5GYWxsYmFjazogIWlzSHlkcmF0aW5nLFxuICAgIGlzSHlkcmF0aW5nLFxuICAgIGlzVW5tb3VudGVkOiBmYWxzZSxcbiAgICBlZmZlY3RzOiBbXSxcbiAgICByZXNvbHZlKHJlc3VtZSA9IGZhbHNlLCBzeW5jID0gZmFsc2UpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGlmICghcmVzdW1lICYmICFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgd2l0aG91dCBhIHBlbmRpbmcgYnJhbmNoLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdXNwZW5zZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIG9uIGFuIGFscmVhZHkgdW5tb3VudGVkIHN1c3BlbnNlIGJvdW5kYXJ5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIHZub2RlOiB2bm9kZTIsXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgcGVuZGluZ0lkLFxuICAgICAgICBlZmZlY3RzLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQ6IHBhcmVudENvbXBvbmVudDIsXG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyMixcbiAgICAgICAgaXNJbkZhbGxiYWNrXG4gICAgICB9ID0gc3VzcGVuc2U7XG4gICAgICBsZXQgZGVsYXlFbnRlciA9IGZhbHNlO1xuICAgICAgaWYgKHN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCFyZXN1bWUpIHtcbiAgICAgICAgZGVsYXlFbnRlciA9IGFjdGl2ZUJyYW5jaCAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24gJiYgcGVuZGluZ0JyYW5jaC50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICAgIGxldCBoYXNVcGRhdGVkQW5jaG9yID0gZmFsc2U7XG4gICAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nSWQgPT09IHN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBtb3ZlKFxuICAgICAgICAgICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICAgICAgICBhbmNob3IgPT09IGluaXRpYWxBbmNob3IgJiYgIWhhc1VwZGF0ZWRBbmNob3IgPyBuZXh0KGFjdGl2ZUJyYW5jaCkgOiBhbmNob3IsXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgICAgICAgICBpZiAoaXNJbkZhbGxiYWNrICYmIHZub2RlMi5zc0ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdm5vZGUyLnNzRmFsbGJhY2suZWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoICYmICFzdXNwZW5zZS5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSA9PT0gY29udGFpbmVyMikge1xuICAgICAgICAgICAgYW5jaG9yID0gbmV4dChhY3RpdmVCcmFuY2gpO1xuICAgICAgICAgICAgaGFzVXBkYXRlZEFuY2hvciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQyLCBzdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKCFkZWxheUVudGVyICYmIGlzSW5GYWxsYmFjayAmJiB2bm9kZTIuc3NGYWxsYmFjaykge1xuICAgICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHZub2RlMi5zc0ZhbGxiYWNrLmVsID0gbnVsbCwgc3VzcGVuc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBtb3ZlKHBlbmRpbmdCcmFuY2gsIGNvbnRhaW5lcjIsIGFuY2hvciwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmlzRmFsbGJhY2tNb3VudFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgcGVuZGluZ0JyYW5jaCk7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbnVsbDtcbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IGZhbHNlO1xuICAgICAgbGV0IHBhcmVudCA9IHN1c3BlbnNlLnBhcmVudDtcbiAgICAgIGxldCBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXJlbnQuZWZmZWN0cy5wdXNoKGVmZmVjdHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1VucmVzb2x2ZWRBbmNlc3RvciAmJiAhZGVsYXlFbnRlcikge1xuICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZWZmZWN0cyA9IFtdO1xuICAgICAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgcGFyZW50U3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHZvaWQgMDtcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlLmRlcHMgPT09IDAgJiYgIXN5bmMpIHtcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25SZXNvbHZlXCIpO1xuICAgIH0sXG4gICAgZmFsbGJhY2soZmFsbGJhY2tWTm9kZSkge1xuICAgICAgaWYgKCFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdm5vZGU6IHZub2RlMiwgYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQ6IHBhcmVudENvbXBvbmVudDIsIGNvbnRhaW5lcjogY29udGFpbmVyMiwgbmFtZXNwYWNlOiBuYW1lc3BhY2UyIH0gPSBzdXNwZW5zZTtcbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25GYWxsYmFja1wiKTtcbiAgICAgIGNvbnN0IGFuY2hvcjIgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICBjb25zdCBtb3VudEZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBzdXNwZW5zZS5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhdGVzdEZhbGxiYWNrID0gc3VzcGVuc2Uudm5vZGUuc3NGYWxsYmFjaztcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgbmFtZXNwYWNlMixcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbGF0ZXN0RmFsbGJhY2spO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlbGF5RW50ZXIgPSBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24gJiYgZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICBpZiAoZGVsYXlFbnRlcikge1xuICAgICAgICBzdXNwZW5zZS5pc0ZhbGxiYWNrTW91bnRQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9IG1vdW50RmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgdW5tb3VudChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBudWxsLFxuICAgICAgICAvLyBubyBzdXNwZW5zZSBzbyB1bm1vdW50IGhvb2tzIGZpcmUgbm93XG4gICAgICAgIHRydWVcbiAgICAgICAgLy8gc2hvdWxkUmVtb3ZlXG4gICAgICApO1xuICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgIG1vdW50RmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vdmUoY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSkge1xuICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG1vdmUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKTtcbiAgICAgIHN1c3BlbnNlLmNvbnRhaW5lciA9IGNvbnRhaW5lcjI7XG4gICAgfSxcbiAgICBuZXh0KCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBuZXh0KHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCk7XG4gICAgfSxcbiAgICByZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QsIG9wdGltaXplZDIpIHtcbiAgICAgIGNvbnN0IGlzSW5QZW5kaW5nU3VzcGVuc2UgPSAhIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2g7XG4gICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSkge1xuICAgICAgICBzdXNwZW5zZS5kZXBzKys7XG4gICAgICB9XG4gICAgICBjb25zdCBoeWRyYXRlZEVsID0gaW5zdGFuY2Uudm5vZGUuZWw7XG4gICAgICBpbnN0YW5jZS5hc3luY0RlcC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDApO1xuICAgICAgfSkudGhlbigoYXN5bmNTZXR1cFJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UucGVuZGluZ0lkICE9PSBpbnN0YW5jZS5zdXNwZW5zZUlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgICAgIGlmIChoeWRyYXRlZEVsICYmICFpbnN0YW5jZS5zY29wZS5hY3RpdmUpIHtcbiAgICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIgfSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZTIpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBhc3luY1NldHVwUmVzdWx0LCBmYWxzZSk7XG4gICAgICAgIGlmIChoeWRyYXRlZEVsKSB7XG4gICAgICAgICAgdm5vZGUyLmVsID0gaHlkcmF0ZWRFbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICFoeWRyYXRlZEVsICYmIGluc3RhbmNlLnN1YlRyZWUuZWw7XG4gICAgICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHZub2RlMixcbiAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGhhdmUgYmVlbiBtb3ZlZCBiZWZvcmUgcmVzb2x2ZS5cbiAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCBhIGh5ZHJhdGlvbiwgaW5zdGFuY2Uuc3ViVHJlZSB3aWxsIGJlIHRoZSBjb21tZW50XG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIuXG4gICAgICAgICAgcGFyZW50Tm9kZShoeWRyYXRlZEVsIHx8IGluc3RhbmNlLnN1YlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoaXMgaXMgaHlkcmF0aW9uLCBzbyBvbmx5IG5lZWQgdG9cbiAgICAgICAgICAvLyBjb25zaWRlciB0aGUgY29tbWVudCBwbGFjZWhvbGRlciBjYXNlLlxuICAgICAgICAgIGh5ZHJhdGVkRWwgPyBudWxsIDogbmV4dChpbnN0YW5jZS5zdWJUcmVlKSxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkMlxuICAgICAgICApO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICB2bm9kZTIucGxhY2Vob2xkZXIgPSBudWxsO1xuICAgICAgICAgIHJlbW92ZShwbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlSE9DSG9zdEVsKGluc3RhbmNlLCB2bm9kZTIuZWwpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UgJiYgLS1zdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHVubW91bnQocGFyZW50U3VzcGVuc2UyLCBkb1JlbW92ZSkge1xuICAgICAgc3VzcGVuc2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCkge1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlMixcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN1c3BlbnNlO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVN1c3BlbnNlKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscywgaHlkcmF0ZU5vZGUpIHtcbiAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZSA9IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkoXG4gICAgdm5vZGUsXG4gICAgcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIG5vZGUucGFyZW50Tm9kZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICBudWxsLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgIHRydWVcbiAgKTtcbiAgY29uc3QgcmVzdWx0ID0gaHlkcmF0ZU5vZGUoXG4gICAgbm9kZSxcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gdm5vZGUuc3NDb250ZW50LFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBzdXNwZW5zZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkXG4gICk7XG4gIGlmIChzdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW4odm5vZGUpIHtcbiAgY29uc3QgeyBzaGFwZUZsYWcsIGNoaWxkcmVuIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNTbG90Q2hpbGRyZW4gPSBzaGFwZUZsYWcgJiAzMjtcbiAgdm5vZGUuc3NDb250ZW50ID0gbm9ybWFsaXplU3VzcGVuc2VTbG90KFxuICAgIGlzU2xvdENoaWxkcmVuID8gY2hpbGRyZW4uZGVmYXVsdCA6IGNoaWxkcmVuXG4gICk7XG4gIHZub2RlLnNzRmFsbGJhY2sgPSBpc1Nsb3RDaGlsZHJlbiA/IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChjaGlsZHJlbi5mYWxsYmFjaykgOiBjcmVhdGVWTm9kZShDb21tZW50KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChzKSB7XG4gIGxldCBibG9jaztcbiAgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICBjb25zdCB0cmFja0Jsb2NrID0gaXNCbG9ja1RyZWVFbmFibGVkICYmIHMuX2M7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSBmYWxzZTtcbiAgICAgIG9wZW5CbG9jaygpO1xuICAgIH1cbiAgICBzID0gcygpO1xuICAgIGlmICh0cmFja0Jsb2NrKSB7XG4gICAgICBzLl9kID0gdHJ1ZTtcbiAgICAgIGJsb2NrID0gY3VycmVudEJsb2NrO1xuICAgICAgY2xvc2VCbG9jaygpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNBcnJheShzKSkge1xuICAgIGNvbnN0IHNpbmdsZUNoaWxkID0gZmlsdGVyU2luZ2xlUm9vdChzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhc2luZ2xlQ2hpbGQgJiYgcy5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZCAhPT0gTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCkubGVuZ3RoID4gMCkge1xuICAgICAgd2FybiQxKGA8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuYCk7XG4gICAgfVxuICAgIHMgPSBzaW5nbGVDaGlsZDtcbiAgfVxuICBzID0gbm9ybWFsaXplVk5vZGUocyk7XG4gIGlmIChibG9jayAmJiAhcy5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICBzLmR5bmFtaWNDaGlsZHJlbiA9IGJsb2NrLmZpbHRlcigoYykgPT4gYyAhPT0gcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZShmbiwgc3VzcGVuc2UpIHtcbiAgaWYgKHN1c3BlbnNlICYmIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICBpZiAoaXNBcnJheShmbikpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCguLi5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaChmbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGJyYW5jaCkge1xuICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggPSBicmFuY2g7XG4gIGNvbnN0IHsgdm5vZGUsIHBhcmVudENvbXBvbmVudCB9ID0gc3VzcGVuc2U7XG4gIGxldCBlbCA9IGJyYW5jaC5lbDtcbiAgd2hpbGUgKCFlbCAmJiBicmFuY2guY29tcG9uZW50KSB7XG4gICAgYnJhbmNoID0gYnJhbmNoLmNvbXBvbmVudC5zdWJUcmVlO1xuICAgIGVsID0gYnJhbmNoLmVsO1xuICB9XG4gIHZub2RlLmVsID0gZWw7XG4gIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgcGFyZW50Q29tcG9uZW50LnZub2RlLmVsID0gZWw7XG4gICAgdXBkYXRlSE9DSG9zdEVsKHBhcmVudENvbXBvbmVudCwgZWwpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpIHtcbiAgY29uc3Qgc3VzcGVuc2libGUgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5zdXNwZW5zaWJsZTtcbiAgcmV0dXJuIHN1c3BlbnNpYmxlICE9IG51bGwgJiYgc3VzcGVuc2libGUgIT09IGZhbHNlO1xufVxuXG5jb25zdCBGcmFnbWVudCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwidi1mZ3RcIik7XG5jb25zdCBUZXh0ID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcInYtY210XCIpO1xuY29uc3QgU3RhdGljID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJ2LXN0Y1wiKTtcbmNvbnN0IGJsb2NrU3RhY2sgPSBbXTtcbmxldCBjdXJyZW50QmxvY2sgPSBudWxsO1xuZnVuY3Rpb24gb3BlbkJsb2NrKGRpc2FibGVUcmFja2luZyA9IGZhbHNlKSB7XG4gIGJsb2NrU3RhY2sucHVzaChjdXJyZW50QmxvY2sgPSBkaXNhYmxlVHJhY2tpbmcgPyBudWxsIDogW10pO1xufVxuZnVuY3Rpb24gY2xvc2VCbG9jaygpIHtcbiAgYmxvY2tTdGFjay5wb3AoKTtcbiAgY3VycmVudEJsb2NrID0gYmxvY2tTdGFja1tibG9ja1N0YWNrLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5sZXQgaXNCbG9ja1RyZWVFbmFibGVkID0gMTtcbmZ1bmN0aW9uIHNldEJsb2NrVHJhY2tpbmcodmFsdWUsIGluVk9uY2UgPSBmYWxzZSkge1xuICBpc0Jsb2NrVHJlZUVuYWJsZWQgKz0gdmFsdWU7XG4gIGlmICh2YWx1ZSA8IDAgJiYgY3VycmVudEJsb2NrICYmIGluVk9uY2UpIHtcbiAgICBjdXJyZW50QmxvY2suaGFzT25jZSA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBpc1ZOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLl9fdl9pc1ZOb2RlID09PSB0cnVlIDogZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG4yLnNoYXBlRmxhZyAmIDYgJiYgbjEuY29tcG9uZW50KSB7XG4gICAgY29uc3QgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG4yLnR5cGUpO1xuICAgIGlmIChkaXJ0eUluc3RhbmNlcyAmJiBkaXJ0eUluc3RhbmNlcy5oYXMobjEuY29tcG9uZW50KSkge1xuICAgICAgbjEuc2hhcGVGbGFnICY9IC0yNTc7XG4gICAgICBuMi5zaGFwZUZsYWcgJj0gLTUxMztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG4xLnR5cGUgPT09IG4yLnR5cGUgJiYgbjEua2V5ID09PSBuMi5rZXk7XG59XG5sZXQgdm5vZGVBcmdzVHJhbnNmb3JtZXI7XG5mdW5jdGlvbiB0cmFuc2Zvcm1WTm9kZUFyZ3ModHJhbnNmb3JtZXIpIHtcbiAgdm5vZGVBcmdzVHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gPSAoLi4uYXJncykgPT4ge1xuICByZXR1cm4gX2NyZWF0ZVZOb2RlKFxuICAgIC4uLnZub2RlQXJnc1RyYW5zZm9ybWVyID8gdm5vZGVBcmdzVHJhbnNmb3JtZXIoYXJncywgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSA6IGFyZ3NcbiAgKTtcbn07XG5jb25zdCBub3JtYWxpemVLZXkgPSAoeyBrZXkgfSkgPT4ga2V5ICE9IG51bGwgPyBrZXkgOiBudWxsO1xuY29uc3Qgbm9ybWFsaXplUmVmID0gKHtcbiAgcmVmLFxuICByZWZfa2V5LFxuICByZWZfZm9yXG59KSA9PiB7XG4gIGlmICh0eXBlb2YgcmVmID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVmID0gXCJcIiArIHJlZjtcbiAgfVxuICByZXR1cm4gcmVmICE9IG51bGwgPyBpc1N0cmluZyhyZWYpIHx8IGlzUmVmKHJlZikgfHwgaXNGdW5jdGlvbihyZWYpID8geyBpOiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIHI6IHJlZiwgazogcmVmX2tleSwgZjogISFyZWZfZm9yIH0gOiByZWYgOiBudWxsO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgc2hhcGVGbGFnID0gdHlwZSA9PT0gRnJhZ21lbnQgPyAwIDogMSwgaXNCbG9ja05vZGUgPSBmYWxzZSwgbmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24gPSBmYWxzZSkge1xuICBjb25zdCB2bm9kZSA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGtleTogcHJvcHMgJiYgbm9ybWFsaXplS2V5KHByb3BzKSxcbiAgICByZWY6IHByb3BzICYmIG5vcm1hbGl6ZVJlZihwcm9wcyksXG4gICAgc2NvcGVJZDogY3VycmVudFNjb3BlSWQsXG4gICAgc2xvdFNjb3BlSWRzOiBudWxsLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICBzdXNwZW5zZTogbnVsbCxcbiAgICBzc0NvbnRlbnQ6IG51bGwsXG4gICAgc3NGYWxsYmFjazogbnVsbCxcbiAgICBkaXJzOiBudWxsLFxuICAgIHRyYW5zaXRpb246IG51bGwsXG4gICAgZWw6IG51bGwsXG4gICAgYW5jaG9yOiBudWxsLFxuICAgIHRhcmdldDogbnVsbCxcbiAgICB0YXJnZXRTdGFydDogbnVsbCxcbiAgICB0YXJnZXRBbmNob3I6IG51bGwsXG4gICAgc3RhdGljQ291bnQ6IDAsXG4gICAgc2hhcGVGbGFnLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiBudWxsLFxuICAgIGFwcENvbnRleHQ6IG51bGwsXG4gICAgY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2VcbiAgfTtcbiAgaWYgKG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uKSB7XG4gICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB0eXBlLm5vcm1hbGl6ZSh2bm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgdm5vZGUuc2hhcGVGbGFnIHw9IGlzU3RyaW5nKGNoaWxkcmVuKSA/IDggOiAxNjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5rZXkgIT09IHZub2RlLmtleSkge1xuICAgIHdhcm4kMShgVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOmAsIHZub2RlLnR5cGUpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHByb3BzICYmIHZub2RlLnNoYXBlRmxhZyAmIDEpIHtcbiAgICBjb25zdCBvdmVyd3JpdGluZ1Byb3AgPSBwcm9wcy5pbm5lckhUTUwgIT0gbnVsbCA/IFwiaW5uZXJIVE1MXCIgOiBwcm9wcy50ZXh0Q29udGVudCAhPSBudWxsID8gXCJ0ZXh0Q29udGVudFwiIDogbnVsbDtcbiAgICBpZiAob3ZlcndyaXRpbmdQcm9wICYmIGhhc0NvbnRlbnRDaGlsZHJlbih2bm9kZS5jaGlsZHJlbikpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBcXGAke292ZXJ3cml0aW5nUHJvcH1cXGAgcHJvcCBvbiA8JHt2bm9kZS50eXBlfT4gd2lsbCBvdmVycmlkZSBpdHMgY2hpbGRyZW4uIFJlbW92ZSBlaXRoZXIgdGhlIFxcYCR7b3ZlcndyaXRpbmdQcm9wfVxcYCBwcm9wIG9yIHRoZSBjaGlsZHJlbi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAvLyBhdm9pZCBhIGJsb2NrIG5vZGUgZnJvbSB0cmFja2luZyBpdHNlbGZcbiAgIWlzQmxvY2tOb2RlICYmIC8vIGhhcyBjdXJyZW50IHBhcmVudCBibG9ja1xuICBjdXJyZW50QmxvY2sgJiYgLy8gcHJlc2VuY2Ugb2YgYSBwYXRjaCBmbGFnIGluZGljYXRlcyB0aGlzIG5vZGUgbmVlZHMgcGF0Y2hpbmcgb24gdXBkYXRlcy5cbiAgLy8gY29tcG9uZW50IG5vZGVzIGFsc28gc2hvdWxkIGFsd2F5cyBiZSBwYXRjaGVkLCBiZWNhdXNlIGV2ZW4gaWYgdGhlXG4gIC8vIGNvbXBvbmVudCBkb2Vzbid0IG5lZWQgdG8gdXBkYXRlLCBpdCBuZWVkcyB0byBwZXJzaXN0IHRoZSBpbnN0YW5jZSBvbiB0b1xuICAvLyB0aGUgbmV4dCB2bm9kZSBzbyB0aGF0IGl0IGNhbiBiZSBwcm9wZXJseSB1bm1vdW50ZWQgbGF0ZXIuXG4gICh2bm9kZS5wYXRjaEZsYWcgPiAwIHx8IHNoYXBlRmxhZyAmIDYpICYmIC8vIHRoZSBFVkVOVFMgZmxhZyBpcyBvbmx5IGZvciBoeWRyYXRpb24gYW5kIGlmIGl0IGlzIHRoZSBvbmx5IGZsYWcsIHRoZVxuICAvLyB2bm9kZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZHluYW1pYyBkdWUgdG8gaGFuZGxlciBjYWNoaW5nLlxuICB2bm9kZS5wYXRjaEZsYWcgIT09IDMyKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGhhc0NvbnRlbnRDaGlsZHJlbihjaGlsZHJlbikge1xuICBpZiAoaXNTdHJpbmcoY2hpbGRyZW4pKSByZXR1cm4gY2hpbGRyZW4gIT09IFwiXCI7XG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gIHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gOiBfY3JlYXRlVk5vZGU7XG5mdW5jdGlvbiBfY3JlYXRlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIGlzQmxvY2tOb2RlID0gZmFsc2UpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGUgPT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdHlwZSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIHZub2RlIHR5cGUgd2hlbiBjcmVhdGluZyB2bm9kZTogJHt0eXBlfS5gKTtcbiAgICB9XG4gICAgdHlwZSA9IENvbW1lbnQ7XG4gIH1cbiAgaWYgKGlzVk5vZGUodHlwZSkpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgdHJ1ZVxuICAgICAgLyogbWVyZ2VSZWY6IHRydWUgKi9cbiAgICApO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplQ2hpbGRyZW4oY2xvbmVkLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmICFpc0Jsb2NrTm9kZSAmJiBjdXJyZW50QmxvY2spIHtcbiAgICAgIGlmIChjbG9uZWQuc2hhcGVGbGFnICYgNikge1xuICAgICAgICBjdXJyZW50QmxvY2tbY3VycmVudEJsb2NrLmluZGV4T2YodHlwZSldID0gY2xvbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEJsb2NrLnB1c2goY2xvbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xvbmVkLnBhdGNoRmxhZyA9IC0yO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgaWYgKGlzQ2xhc3NDb21wb25lbnQodHlwZSkpIHtcbiAgICB0eXBlID0gdHlwZS5fX3ZjY09wdHM7XG4gIH1cbiAgaWYgKHByb3BzKSB7XG4gICAgcHJvcHMgPSBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpO1xuICAgIGxldCB7IGNsYXNzOiBrbGFzcywgc3R5bGUgfSA9IHByb3BzO1xuICAgIGlmIChrbGFzcyAmJiAhaXNTdHJpbmcoa2xhc3MpKSB7XG4gICAgICBwcm9wcy5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKGtsYXNzKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHN0eWxlKSkge1xuICAgICAgaWYgKGlzUHJveHkoc3R5bGUpICYmICFpc0FycmF5KHN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IGV4dGVuZCh7fSwgc3R5bGUpO1xuICAgICAgfVxuICAgICAgcHJvcHMuc3R5bGUgPSBub3JtYWxpemVTdHlsZShzdHlsZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNoYXBlRmxhZyA9IGlzU3RyaW5nKHR5cGUpID8gMSA6IGlzU3VzcGVuc2UodHlwZSkgPyAxMjggOiBpc1RlbGVwb3J0KHR5cGUpID8gNjQgOiBpc09iamVjdCh0eXBlKSA/IDQgOiBpc0Z1bmN0aW9uKHR5cGUpID8gMiA6IDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNoYXBlRmxhZyAmIDQgJiYgaXNQcm94eSh0eXBlKSkge1xuICAgIHR5cGUgPSB0b1Jhdyh0eXBlKTtcbiAgICB3YXJuJDEoXG4gICAgICBgVnVlIHJlY2VpdmVkIGEgQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgYSByZWFjdGl2ZSBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGJ5IG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIFxcYG1hcmtSYXdcXGAgb3IgdXNpbmcgXFxgc2hhbGxvd1JlZlxcYCBpbnN0ZWFkIG9mIFxcYHJlZlxcYC5gLFxuICAgICAgYFxuQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgcmVhY3RpdmU6IGAsXG4gICAgICB0eXBlXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQmFzZVZOb2RlKFxuICAgIHR5cGUsXG4gICAgcHJvcHMsXG4gICAgY2hpbGRyZW4sXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBzaGFwZUZsYWcsXG4gICAgaXNCbG9ja05vZGUsXG4gICAgdHJ1ZVxuICApO1xufVxuZnVuY3Rpb24gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHJldHVybiBudWxsO1xuICByZXR1cm4gaXNQcm94eShwcm9wcykgfHwgaXNJbnRlcm5hbE9iamVjdChwcm9wcykgPyBleHRlbmQoe30sIHByb3BzKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gY2xvbmVWTm9kZSh2bm9kZSwgZXh0cmFQcm9wcywgbWVyZ2VSZWYgPSBmYWxzZSwgY2xvbmVUcmFuc2l0aW9uID0gZmFsc2UpIHtcbiAgY29uc3QgeyBwcm9wcywgcmVmLCBwYXRjaEZsYWcsIGNoaWxkcmVuLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgY29uc3QgbWVyZ2VkUHJvcHMgPSBleHRyYVByb3BzID8gbWVyZ2VQcm9wcyhwcm9wcyB8fCB7fSwgZXh0cmFQcm9wcykgOiBwcm9wcztcbiAgY29uc3QgY2xvbmVkID0ge1xuICAgIF9fdl9pc1ZOb2RlOiB0cnVlLFxuICAgIF9fdl9za2lwOiB0cnVlLFxuICAgIHR5cGU6IHZub2RlLnR5cGUsXG4gICAgcHJvcHM6IG1lcmdlZFByb3BzLFxuICAgIGtleTogbWVyZ2VkUHJvcHMgJiYgbm9ybWFsaXplS2V5KG1lcmdlZFByb3BzKSxcbiAgICByZWY6IGV4dHJhUHJvcHMgJiYgZXh0cmFQcm9wcy5yZWYgPyAoXG4gICAgICAvLyAjMjA3OCBpbiB0aGUgY2FzZSBvZiA8Y29tcG9uZW50IDppcz1cInZub2RlXCIgcmVmPVwiZXh0cmFcIi8+XG4gICAgICAvLyBpZiB0aGUgdm5vZGUgaXRzZWxmIGFscmVhZHkgaGFzIGEgcmVmLCBjbG9uZVZOb2RlIHdpbGwgbmVlZCB0byBtZXJnZVxuICAgICAgLy8gdGhlIHJlZnMgc28gdGhlIHNpbmdsZSB2bm9kZSBjYW4gYmUgc2V0IG9uIG11bHRpcGxlIHJlZnNcbiAgICAgIG1lcmdlUmVmICYmIHJlZiA/IGlzQXJyYXkocmVmKSA/IHJlZi5jb25jYXQobm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpKSA6IFtyZWYsIG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKV0gOiBub3JtYWxpemVSZWYoZXh0cmFQcm9wcylcbiAgICApIDogcmVmLFxuICAgIHNjb3BlSWQ6IHZub2RlLnNjb3BlSWQsXG4gICAgc2xvdFNjb3BlSWRzOiB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgY2hpbGRyZW46ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcGF0Y2hGbGFnID09PSAtMSAmJiBpc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuLm1hcChkZWVwQ2xvbmVWTm9kZSkgOiBjaGlsZHJlbixcbiAgICB0YXJnZXQ6IHZub2RlLnRhcmdldCxcbiAgICB0YXJnZXRTdGFydDogdm5vZGUudGFyZ2V0U3RhcnQsXG4gICAgdGFyZ2V0QW5jaG9yOiB2bm9kZS50YXJnZXRBbmNob3IsXG4gICAgc3RhdGljQ291bnQ6IHZub2RlLnN0YXRpY0NvdW50LFxuICAgIHNoYXBlRmxhZzogdm5vZGUuc2hhcGVGbGFnLFxuICAgIC8vIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgd2l0aCBleHRyYSBwcm9wcywgd2UgY2FuIG5vIGxvbmdlciBhc3N1bWUgaXRzXG4gICAgLy8gZXhpc3RpbmcgcGF0Y2ggZmxhZyB0byBiZSByZWxpYWJsZSBhbmQgbmVlZCB0byBhZGQgdGhlIEZVTExfUFJPUFMgZmxhZy5cbiAgICAvLyBub3RlOiBwcmVzZXJ2ZSBmbGFnIGZvciBmcmFnbWVudHMgc2luY2UgdGhleSB1c2UgdGhlIGZsYWcgZm9yIGNoaWxkcmVuXG4gICAgLy8gZmFzdCBwYXRocyBvbmx5LlxuICAgIHBhdGNoRmxhZzogZXh0cmFQcm9wcyAmJiB2bm9kZS50eXBlICE9PSBGcmFnbWVudCA/IHBhdGNoRmxhZyA9PT0gLTEgPyAxNiA6IHBhdGNoRmxhZyB8IDE2IDogcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wczogdm5vZGUuZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogdm5vZGUuZHluYW1pY0NoaWxkcmVuLFxuICAgIGFwcENvbnRleHQ6IHZub2RlLmFwcENvbnRleHQsXG4gICAgZGlyczogdm5vZGUuZGlycyxcbiAgICB0cmFuc2l0aW9uLFxuICAgIC8vIFRoZXNlIHNob3VsZCB0ZWNobmljYWxseSBvbmx5IGJlIG5vbi1udWxsIG9uIG1vdW50ZWQgVk5vZGVzLiBIb3dldmVyLFxuICAgIC8vIHRoZXkgKnNob3VsZCogYmUgY29waWVkIGZvciBrZXB0LWFsaXZlIHZub2Rlcy4gU28gd2UganVzdCBhbHdheXMgY29weVxuICAgIC8vIHRoZW0gc2luY2UgdGhlbSBiZWluZyBub24tbnVsbCBkdXJpbmcgYSBtb3VudCBkb2Vzbid0IGFmZmVjdCB0aGUgbG9naWMgYXNcbiAgICAvLyB0aGV5IHdpbGwgc2ltcGx5IGJlIG92ZXJ3cml0dGVuLlxuICAgIGNvbXBvbmVudDogdm5vZGUuY29tcG9uZW50LFxuICAgIHN1c3BlbnNlOiB2bm9kZS5zdXNwZW5zZSxcbiAgICBzc0NvbnRlbnQ6IHZub2RlLnNzQ29udGVudCAmJiBjbG9uZVZOb2RlKHZub2RlLnNzQ29udGVudCksXG4gICAgc3NGYWxsYmFjazogdm5vZGUuc3NGYWxsYmFjayAmJiBjbG9uZVZOb2RlKHZub2RlLnNzRmFsbGJhY2spLFxuICAgIHBsYWNlaG9sZGVyOiB2bm9kZS5wbGFjZWhvbGRlcixcbiAgICBlbDogdm5vZGUuZWwsXG4gICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgY3R4OiB2bm9kZS5jdHgsXG4gICAgY2U6IHZub2RlLmNlLFxuICAgIGNhY2hlSW5kZXg6IHZub2RlLmNhY2hlSW5kZXhcbiAgfTtcbiAgaWYgKHRyYW5zaXRpb24gJiYgY2xvbmVUcmFuc2l0aW9uKSB7XG4gICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgY2xvbmVkLFxuICAgICAgdHJhbnNpdGlvbi5jbG9uZShjbG9uZWQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gZGVlcENsb25lVk5vZGUodm5vZGUpIHtcbiAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gIGlmIChpc0FycmF5KHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGNsb25lZC5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuLm1hcChkZWVwQ2xvbmVWTm9kZSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSh0ZXh0ID0gXCIgXCIsIGZsYWcgPSAwKSB7XG4gIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCB0ZXh0LCBmbGFnKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1ZOb2RlKGNvbnRlbnQsIG51bWJlck9mTm9kZXMpIHtcbiAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShTdGF0aWMsIG51bGwsIGNvbnRlbnQpO1xuICB2bm9kZS5zdGF0aWNDb3VudCA9IG51bWJlck9mTm9kZXM7XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnRWTm9kZSh0ZXh0ID0gXCJcIiwgYXNCbG9jayA9IGZhbHNlKSB7XG4gIHJldHVybiBhc0Jsb2NrID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhDb21tZW50LCBudWxsLCB0ZXh0KSkgOiBjcmVhdGVWTm9kZShDb21tZW50LCBudWxsLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZOb2RlKGNoaWxkKSB7XG4gIGlmIChjaGlsZCA9PSBudWxsIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShjaGlsZCkpIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoXG4gICAgICBGcmFnbWVudCxcbiAgICAgIG51bGwsXG4gICAgICAvLyAjMzY2NiwgYXZvaWQgcmVmZXJlbmNlIHBvbGx1dGlvbiB3aGVuIHJldXNpbmcgdm5vZGVcbiAgICAgIGNoaWxkLnNsaWNlKClcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O1xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhaXNJbnRlcm5hbE9iamVjdChjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4uX2N0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdEZsYWcgPT09IDMgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2Uuc2xvdHMuXyA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAyO1xuICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyB8PSAxMDI0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2hpbGRyZW4pKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNjQpKSB7XG4gICAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgeyBkZWZhdWx0OiBjaGlsZHJlbiB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2hpbGRyZW4gPSB7IGRlZmF1bHQ6IGNoaWxkcmVuLCBfY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfTtcbiAgICB0eXBlID0gMzI7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZSA9IDE2O1xuICAgICAgY2hpbGRyZW4gPSBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSA4O1xuICAgIH1cbiAgfVxuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB2bm9kZS5zaGFwZUZsYWcgfD0gdHlwZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoLi4uYXJncykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9NZXJnZSA9IGFyZ3NbaV07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9NZXJnZSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGlmIChyZXQuY2xhc3MgIT09IHRvTWVyZ2UuY2xhc3MpIHtcbiAgICAgICAgICByZXQuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhbcmV0LmNsYXNzLCB0b01lcmdlLmNsYXNzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgcmV0LnN0eWxlID0gbm9ybWFsaXplU3R5bGUoW3JldC5zdHlsZSwgdG9NZXJnZS5zdHlsZV0pO1xuICAgICAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXRba2V5XTtcbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSB0b01lcmdlW2tleV07XG4gICAgICAgIGlmIChpbmNvbWluZyAmJiBleGlzdGluZyAhPT0gaW5jb21pbmcgJiYgIShpc0FycmF5KGV4aXN0aW5nKSAmJiBleGlzdGluZy5pbmNsdWRlcyhpbmNvbWluZykpKSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaW5jb21pbmcpIDogaW5jb21pbmc7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5jb21pbmcgPT0gbnVsbCAmJiBleGlzdGluZyA9PSBudWxsICYmIC8vIG1lcmdlUHJvcHMoeyAnb25VcGRhdGU6bW9kZWxWYWx1ZSc6IHVuZGVmaW5lZCB9KSBzaG91bGQgbm90IHJldGFpblxuICAgICAgICAvLyB0aGUgbW9kZWwgbGlzdGVuZXIuXG4gICAgICAgICFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgICAgIHJldFtrZXldID0gaW5jb21pbmc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBcIlwiKSB7XG4gICAgICAgIHJldFtrZXldID0gdG9NZXJnZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gaW52b2tlVk5vZGVIb29rKGhvb2ssIGluc3RhbmNlLCB2bm9kZSwgcHJldlZOb2RlID0gbnVsbCkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgNywgW1xuICAgIHZub2RlLFxuICAgIHByZXZWTm9kZVxuICBdKTtcbn1cblxuY29uc3QgZW1wdHlBcHBDb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xubGV0IHVpZCA9IDA7XG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSh2bm9kZSwgcGFyZW50LCBzdXNwZW5zZSkge1xuICBjb25zdCB0eXBlID0gdm5vZGUudHlwZTtcbiAgY29uc3QgYXBwQ29udGV4dCA9IChwYXJlbnQgPyBwYXJlbnQuYXBwQ29udGV4dCA6IHZub2RlLmFwcENvbnRleHQpIHx8IGVtcHR5QXBwQ29udGV4dDtcbiAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgdWlkOiB1aWQrKyxcbiAgICB2bm9kZSxcbiAgICB0eXBlLFxuICAgIHBhcmVudCxcbiAgICBhcHBDb250ZXh0LFxuICAgIHJvb3Q6IG51bGwsXG4gICAgLy8gdG8gYmUgaW1tZWRpYXRlbHkgc2V0XG4gICAgbmV4dDogbnVsbCxcbiAgICBzdWJUcmVlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBlZmZlY3Q6IG51bGwsXG4gICAgdXBkYXRlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBqb2I6IG51bGwsXG4gICAgc2NvcGU6IG5ldyBFZmZlY3RTY29wZShcbiAgICAgIHRydWVcbiAgICAgIC8qIGRldGFjaGVkICovXG4gICAgKSxcbiAgICByZW5kZXI6IG51bGwsXG4gICAgcHJveHk6IG51bGwsXG4gICAgZXhwb3NlZDogbnVsbCxcbiAgICBleHBvc2VQcm94eTogbnVsbCxcbiAgICB3aXRoUHJveHk6IG51bGwsXG4gICAgcHJvdmlkZXM6IHBhcmVudCA/IHBhcmVudC5wcm92aWRlcyA6IE9iamVjdC5jcmVhdGUoYXBwQ29udGV4dC5wcm92aWRlcyksXG4gICAgaWRzOiBwYXJlbnQgPyBwYXJlbnQuaWRzIDogW1wiXCIsIDAsIDBdLFxuICAgIGFjY2Vzc0NhY2hlOiBudWxsLFxuICAgIHJlbmRlckNhY2hlOiBbXSxcbiAgICAvLyBsb2NhbCByZXNvbHZlZCBhc3NldHNcbiAgICBjb21wb25lbnRzOiBudWxsLFxuICAgIGRpcmVjdGl2ZXM6IG51bGwsXG4gICAgLy8gcmVzb2x2ZWQgcHJvcHMgYW5kIGVtaXRzIG9wdGlvbnNcbiAgICBwcm9wc09wdGlvbnM6IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICBlbWl0c09wdGlvbnM6IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICAvLyBlbWl0XG4gICAgZW1pdDogbnVsbCxcbiAgICAvLyB0byBiZSBzZXQgaW1tZWRpYXRlbHlcbiAgICBlbWl0dGVkOiBudWxsLFxuICAgIC8vIHByb3BzIGRlZmF1bHQgdmFsdWVcbiAgICBwcm9wc0RlZmF1bHRzOiBFTVBUWV9PQkosXG4gICAgLy8gaW5oZXJpdEF0dHJzXG4gICAgaW5oZXJpdEF0dHJzOiB0eXBlLmluaGVyaXRBdHRycyxcbiAgICAvLyBzdGF0ZVxuICAgIGN0eDogRU1QVFlfT0JKLFxuICAgIGRhdGE6IEVNUFRZX09CSixcbiAgICBwcm9wczogRU1QVFlfT0JKLFxuICAgIGF0dHJzOiBFTVBUWV9PQkosXG4gICAgc2xvdHM6IEVNUFRZX09CSixcbiAgICByZWZzOiBFTVBUWV9PQkosXG4gICAgc2V0dXBTdGF0ZTogRU1QVFlfT0JKLFxuICAgIHNldHVwQ29udGV4dDogbnVsbCxcbiAgICAvLyBzdXNwZW5zZSByZWxhdGVkXG4gICAgc3VzcGVuc2UsXG4gICAgc3VzcGVuc2VJZDogc3VzcGVuc2UgPyBzdXNwZW5zZS5wZW5kaW5nSWQgOiAwLFxuICAgIGFzeW5jRGVwOiBudWxsLFxuICAgIGFzeW5jUmVzb2x2ZWQ6IGZhbHNlLFxuICAgIC8vIGxpZmVjeWNsZSBob29rc1xuICAgIC8vIG5vdCB1c2luZyBlbnVtcyBoZXJlIGJlY2F1c2UgaXQgcmVzdWx0cyBpbiBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgaXNEZWFjdGl2YXRlZDogZmFsc2UsXG4gICAgYmM6IG51bGwsXG4gICAgYzogbnVsbCxcbiAgICBibTogbnVsbCxcbiAgICBtOiBudWxsLFxuICAgIGJ1OiBudWxsLFxuICAgIHU6IG51bGwsXG4gICAgdW06IG51bGwsXG4gICAgYnVtOiBudWxsLFxuICAgIGRhOiBudWxsLFxuICAgIGE6IG51bGwsXG4gICAgcnRnOiBudWxsLFxuICAgIHJ0YzogbnVsbCxcbiAgICBlYzogbnVsbCxcbiAgICBzcDogbnVsbFxuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmN0eCA9IGNyZWF0ZURldlJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmN0eCA9IHsgXzogaW5zdGFuY2UgfTtcbiAgfVxuICBpbnN0YW5jZS5yb290ID0gcGFyZW50ID8gcGFyZW50LnJvb3QgOiBpbnN0YW5jZTtcbiAgaW5zdGFuY2UuZW1pdCA9IGVtaXQuYmluZChudWxsLCBpbnN0YW5jZSk7XG4gIGlmICh2bm9kZS5jZSkge1xuICAgIHZub2RlLmNlKGluc3RhbmNlKTtcbiAgfVxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5sZXQgY3VycmVudEluc3RhbmNlID0gbnVsbDtcbmNvbnN0IGdldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG5sZXQgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2U7XG5sZXQgc2V0SW5TU1JTZXR1cFN0YXRlO1xue1xuICBjb25zdCBnID0gZ2V0R2xvYmFsVGhpcygpO1xuICBjb25zdCByZWdpc3Rlckdsb2JhbFNldHRlciA9IChrZXksIHNldHRlcikgPT4ge1xuICAgIGxldCBzZXR0ZXJzO1xuICAgIGlmICghKHNldHRlcnMgPSBnW2tleV0pKSBzZXR0ZXJzID0gZ1trZXldID0gW107XG4gICAgc2V0dGVycy5wdXNoKHNldHRlcik7XG4gICAgcmV0dXJuICh2KSA9PiB7XG4gICAgICBpZiAoc2V0dGVycy5sZW5ndGggPiAxKSBzZXR0ZXJzLmZvckVhY2goKHNldCkgPT4gc2V0KHYpKTtcbiAgICAgIGVsc2Ugc2V0dGVyc1swXSh2KTtcbiAgICB9O1xuICB9O1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZSA9IHJlZ2lzdGVyR2xvYmFsU2V0dGVyKFxuICAgIGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLFxuICAgICh2KSA9PiBjdXJyZW50SW5zdGFuY2UgPSB2XG4gICk7XG4gIHNldEluU1NSU2V0dXBTdGF0ZSA9IHJlZ2lzdGVyR2xvYmFsU2V0dGVyKFxuICAgIGBfX1ZVRV9TU1JfU0VUVEVSU19fYCxcbiAgICAodikgPT4gaXNJblNTUkNvbXBvbmVudFNldHVwID0gdlxuICApO1xufVxuY29uc3Qgc2V0Q3VycmVudEluc3RhbmNlID0gKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHByZXYgPSBjdXJyZW50SW5zdGFuY2U7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgaW5zdGFuY2Uuc2NvcGUub24oKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShwcmV2KTtcbiAgfTtcbn07XG5jb25zdCB1bnNldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IHtcbiAgY3VycmVudEluc3RhbmNlICYmIGN1cnJlbnRJbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UobnVsbCk7XG59O1xuY29uc3QgaXNCdWlsdEluVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXCJzbG90LGNvbXBvbmVudFwiKTtcbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCB7IGlzTmF0aXZlVGFnIH0pIHtcbiAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBpc05hdGl2ZVRhZyhuYW1lKSkge1xuICAgIHdhcm4kMShcbiAgICAgIFwiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogXCIgKyBuYW1lXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgNDtcbn1cbmxldCBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUiA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSkge1xuICBpc1NTUiAmJiBzZXRJblNTUlNldHVwU3RhdGUoaXNTU1IpO1xuICBjb25zdCB7IHByb3BzLCBjaGlsZHJlbiB9ID0gaW5zdGFuY2Uudm5vZGU7XG4gIGNvbnN0IGlzU3RhdGVmdWwgPSBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKTtcbiAgaW5pdFByb3BzKGluc3RhbmNlLCBwcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IpO1xuICBpbml0U2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuLCBvcHRpbWl6ZWQgfHwgaXNTU1IpO1xuICBjb25zdCBzZXR1cFJlc3VsdCA9IGlzU3RhdGVmdWwgPyBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikgOiB2b2lkIDA7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShmYWxzZSk7XG4gIHJldHVybiBzZXR1cFJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNldHVwU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKENvbXBvbmVudC5uYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoQ29tcG9uZW50Lm5hbWUsIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWVzW2ldLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuZGlyZWN0aXZlcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuZGlyZWN0aXZlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcGlsZXJPcHRpb25zICYmIGlzUnVudGltZU9ubHkoKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgXCJjb21waWxlck9wdGlvbnNcIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpbnN0YW5jZS5hY2Nlc3NDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpbnN0YW5jZS5wcm94eSA9IG5ldyBQcm94eShpbnN0YW5jZS5jdHgsIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9XG4gIGNvbnN0IHsgc2V0dXAgfSA9IENvbXBvbmVudDtcbiAgaWYgKHNldHVwKSB7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIGNvbnN0IHNldHVwQ29udGV4dCA9IGluc3RhbmNlLnNldHVwQ29udGV4dCA9IHNldHVwLmxlbmd0aCA+IDEgPyBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIDogbnVsbDtcbiAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBzZXR1cCxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMCxcbiAgICAgIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpbnN0YW5jZS5wcm9wcykgOiBpbnN0YW5jZS5wcm9wcyxcbiAgICAgICAgc2V0dXBDb250ZXh0XG4gICAgICBdXG4gICAgKTtcbiAgICBjb25zdCBpc0FzeW5jU2V0dXAgPSBpc1Byb21pc2Uoc2V0dXBSZXN1bHQpO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICByZXNldCgpO1xuICAgIGlmICgoaXNBc3luY1NldHVwIHx8IGluc3RhbmNlLnNwKSAmJiAhaXNBc3luY1dyYXBwZXIoaW5zdGFuY2UpKSB7XG4gICAgICBtYXJrQXN5bmNCb3VuZGFyeShpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChpc0FzeW5jU2V0dXApIHtcbiAgICAgIHNldHVwUmVzdWx0LnRoZW4odW5zZXRDdXJyZW50SW5zdGFuY2UsIHVuc2V0Q3VycmVudEluc3RhbmNlKTtcbiAgICAgIGlmIChpc1NTUikge1xuICAgICAgICByZXR1cm4gc2V0dXBSZXN1bHQudGhlbigocmVzb2x2ZWRSZXN1bHQpID0+IHtcbiAgICAgICAgICBzZXRJblNTUlNldHVwU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCByZXNvbHZlZFJlc3VsdCwgaXNTU1IpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRJblNTUlNldHVwU3RhdGUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBpbnN0YW5jZSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UuYXN5bmNEZXAgPSBzZXR1cFJlc3VsdDtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWluc3RhbmNlLnN1c3BlbnNlKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGZvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIENvbXBvbmVudCk7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCA8JHtuYW1lfT46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vIDxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHNldHVwKCkgc2hvdWxkIG5vdCByZXR1cm4gVk5vZGVzIGRpcmVjdGx5IC0gcmV0dXJuIGEgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5kZXZ0b29sc1Jhd1NldHVwU3RhdGUgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gICAgaW5zdGFuY2Uuc2V0dXBTdGF0ZSA9IHByb3h5UmVmcyhzZXR1cFJlc3VsdCk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwUmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICB3YXJuJDEoXG4gICAgICBgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBzZXR1cFJlc3VsdH1gXG4gICAgKTtcbiAgfVxuICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xufVxubGV0IGNvbXBpbGU7XG5sZXQgaW5zdGFsbFdpdGhQcm94eTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gIGNvbXBpbGUgPSBfY29tcGlsZTtcbiAgaW5zdGFsbFdpdGhQcm94eSA9IChpKSA9PiB7XG4gICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgfVxuICB9O1xufVxuY29uc3QgaXNSdW50aW1lT25seSA9ICgpID0+ICFjb21waWxlO1xuZnVuY3Rpb24gZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSLCBza2lwT3B0aW9ucykge1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoIWluc3RhbmNlLnJlbmRlcikge1xuICAgIGlmICghaXNTU1IgJiYgY29tcGlsZSAmJiAhQ29tcG9uZW50LnJlbmRlcikge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBDb21wb25lbnQudGVtcGxhdGUgfHwgX19WVUVfT1BUSU9OU19BUElfXyAmJiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkudGVtcGxhdGU7XG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpc0N1c3RvbUVsZW1lbnQsIGNvbXBpbGVyT3B0aW9ucyB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWc7XG4gICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZmluYWxDb21waWxlck9wdGlvbnMgPSBleHRlbmQoXG4gICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBvbmVudENvbXBpbGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQucmVuZGVyID0gY29tcGlsZSh0ZW1wbGF0ZSwgZmluYWxDb21waWxlck9wdGlvbnMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyID0gQ29tcG9uZW50LnJlbmRlciB8fCBOT09QO1xuICAgIGlmIChpbnN0YWxsV2l0aFByb3h5KSB7XG4gICAgICBpbnN0YWxsV2l0aFByb3h5KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgdHJ1ZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFDb21wb25lbnQucmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCAmJiAhaXNTU1IpIHtcbiAgICBpZiAoIWNvbXBpbGUgJiYgQ29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybiQxKGBDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb246IGAsIENvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5jb25zdCBhdHRyc1Byb3h5SGFuZGxlcnMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwgXCJcIik7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICB9LFxuICBzZXQoKSB7XG4gICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eSgpIHtcbiAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0gOiB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwgXCJcIik7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSkge1xuICByZXR1cm4gbmV3IFByb3h5KGluc3RhbmNlLnNsb3RzLCB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwgXCIkc2xvdHNcIik7XG4gICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCBleHBvc2UgPSAoZXhwb3NlZCkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICB3YXJuJDEoYGV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cG9zZWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJyZWZcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGV4cG9zZSgpIHNob3VsZCBiZSBwYXNzZWQgYSBwbGFpbiBvYmplY3QsIHJlY2VpdmVkICR7ZXhwb3NlZFR5cGV9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLmV4cG9zZWQgPSBleHBvc2VkIHx8IHt9O1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGxldCBhdHRyc1Byb3h5O1xuICAgIGxldCBzbG90c1Byb3h5O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJzUHJveHkgfHwgKGF0dHJzUHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2UuYXR0cnMsIGF0dHJzUHJveHlIYW5kbGVycykpO1xuICAgICAgfSxcbiAgICAgIGdldCBzbG90cygpIHtcbiAgICAgICAgcmV0dXJuIHNsb3RzUHJveHkgfHwgKHNsb3RzUHJveHkgPSBnZXRTbG90c1Byb3h5KGluc3RhbmNlKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IGVtaXQoKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+IGluc3RhbmNlLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyczogbmV3IFByb3h5KGluc3RhbmNlLmF0dHJzLCBhdHRyc1Byb3h5SGFuZGxlcnMpLFxuICAgICAgc2xvdHM6IGluc3RhbmNlLnNsb3RzLFxuICAgICAgZW1pdDogaW5zdGFuY2UuZW1pdCxcbiAgICAgIGV4cG9zZVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmV4cG9zZVByb3h5IHx8IChpbnN0YW5jZS5leHBvc2VQcm94eSA9IG5ldyBQcm94eShwcm94eVJlZnMobWFya1JhdyhpbnN0YW5jZS5leHBvc2VkKSksIHtcbiAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgaW4gcHVibGljUHJvcGVydGllc01hcCkge1xuICAgICAgICAgIHJldHVybiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHRhcmdldCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGFyZ2V0IHx8IGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5zdGFuY2UucHJveHk7XG4gIH1cbn1cbmNvbnN0IGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKVxcdy9nO1xuY29uc3QgY2xhc3NpZnkgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShjbGFzc2lmeVJFLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIFwiXCIpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQsIGluY2x1ZGVJbmZlcnJlZCA9IHRydWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oQ29tcG9uZW50KSA/IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSA6IENvbXBvbmVudC5uYW1lIHx8IGluY2x1ZGVJbmZlcnJlZCAmJiBDb21wb25lbnQuX19uYW1lO1xufVxuZnVuY3Rpb24gZm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgQ29tcG9uZW50LCBpc1Jvb3QgPSBmYWxzZSkge1xuICBsZXQgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KTtcbiAgaWYgKCFuYW1lICYmIENvbXBvbmVudC5fX2ZpbGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IENvbXBvbmVudC5fX2ZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICB9XG4gIH1cbiAgaWYgKCFuYW1lICYmIGluc3RhbmNlKSB7XG4gICAgY29uc3QgaW5mZXJGcm9tUmVnaXN0cnkgPSAocmVnaXN0cnkpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgIGlmIChyZWdpc3RyeVtrZXldID09PSBDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBuYW1lID0gaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuY29tcG9uZW50cykgfHwgaW5zdGFuY2UucGFyZW50ICYmIGluZmVyRnJvbVJlZ2lzdHJ5KFxuICAgICAgaW5zdGFuY2UucGFyZW50LnR5cGUuY29tcG9uZW50c1xuICAgICkgfHwgaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuYXBwQ29udGV4dC5jb21wb25lbnRzKTtcbiAgfVxuICByZXR1cm4gbmFtZSA/IGNsYXNzaWZ5KG5hbWUpIDogaXNSb290ID8gYEFwcGAgOiBgQW5vbnltb3VzYDtcbn1cbmZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpICYmIFwiX192Y2NPcHRzXCIgaW4gdmFsdWU7XG59XG5cbmNvbnN0IGNvbXB1dGVkID0gKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zKSA9PiB7XG4gIGNvbnN0IGMgPSBjb21wdXRlZCQxKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc0luU1NSQ29tcG9uZW50U2V0dXApO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoaSAmJiBpLmFwcENvbnRleHQuY29uZmlnLndhcm5SZWN1cnNpdmVDb21wdXRlZCkge1xuICAgICAgYy5fd2FyblJlY3Vyc2l2ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjO1xufTtcblxuZnVuY3Rpb24gaCh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKSB7XG4gIHRyeSB7XG4gICAgc2V0QmxvY2tUcmFja2luZygtMSk7XG4gICAgY29uc3QgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGwgPT09IDIpIHtcbiAgICAgIGlmIChpc09iamVjdChwcm9wc09yQ2hpbGRyZW4pICYmICFpc0FycmF5KHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgaWYgKGlzVk5vZGUocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBbcHJvcHNPckNoaWxkcmVuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGwgPiAzKSB7XG4gICAgICAgIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobCA9PT0gMyAmJiBpc1ZOb2RlKGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbiA9IFtjaGlsZHJlbl07XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbik7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEJsb2NrVHJhY2tpbmcoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEN1c3RvbUZvcm1hdHRlcigpIHtcbiAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdnVlU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMzYmE3NzZcIiB9O1xuICBjb25zdCBudW1iZXJTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzE2NzdmZlwiIH07XG4gIGNvbnN0IHN0cmluZ1N0eWxlID0geyBzdHlsZTogXCJjb2xvcjojZjUyMjJkXCIgfTtcbiAgY29uc3Qga2V5d29yZFN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojZWIyZjk2XCIgfTtcbiAgY29uc3QgZm9ybWF0dGVyID0ge1xuICAgIF9fdnVlX2N1c3RvbV9mb3JtYXR0ZXI6IHRydWUsXG4gICAgaGVhZGVyKG9iaikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXCJkaXZcIiwgdnVlU3R5bGUsIGBWdWVJbnN0YW5jZWBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihvYmopKSB7XG4gICAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmoudmFsdWU7XG4gICAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGdlblJlZkZsYWcob2JqKV0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUodmFsdWUpLFxuICAgICAgICAgIGA+YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhY3RpdmVcIiA6IFwiUmVhY3RpdmVcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBgPiR7aXNSZWFkb25seShvYmopID8gYCAocmVhZG9ubHkpYCA6IGBgfWBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkb25seShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWRvbmx5XCIgOiBcIlJlYWRvbmx5XCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgXCI+XCJcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgaGFzQm9keShvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqLl9faXNWdWU7XG4gICAgfSxcbiAgICBib2R5KG9iaikge1xuICAgICAgaWYgKG9iaiAmJiBvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgLi4uZm9ybWF0SW5zdGFuY2Uob2JqLiQpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJsb2NrcyA9IFtdO1xuICAgIGlmIChpbnN0YW5jZS50eXBlLnByb3BzICYmIGluc3RhbmNlLnByb3BzKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwicHJvcHNcIiwgdG9SYXcoaW5zdGFuY2UucHJvcHMpKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5zZXR1cFN0YXRlICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJzZXR1cFwiLCBpbnN0YW5jZS5zZXR1cFN0YXRlKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5kYXRhICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJkYXRhXCIsIHRvUmF3KGluc3RhbmNlLmRhdGEpKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiY29tcHV0ZWRcIik7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiY29tcHV0ZWRcIiwgY29tcHV0ZWQpKTtcbiAgICB9XG4gICAgY29uc3QgaW5qZWN0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJpbmplY3RcIik7XG4gICAgaWYgKGluamVjdGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiaW5qZWN0ZWRcIiwgaW5qZWN0ZWQpKTtcbiAgICB9XG4gICAgYmxvY2tzLnB1c2goW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHt9LFxuICAgICAgW1xuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBrZXl3b3JkU3R5bGUuc3R5bGUgKyBcIjtvcGFjaXR5OjAuNjZcIlxuICAgICAgICB9LFxuICAgICAgICBcIiQgKGludGVybmFsKTogXCJcbiAgICAgIF0sXG4gICAgICBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGluc3RhbmNlIH1dXG4gICAgXSk7XG4gICAgcmV0dXJuIGJsb2NrcztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUJsb2NrKHR5cGUsIHRhcmdldCkge1xuICAgIHRhcmdldCA9IGV4dGVuZCh7fSwgdGFyZ2V0KTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCB7fV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdHlsZTogXCJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbVwiIH0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJjb2xvcjojNDc2NTgyXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcInBhZGRpbmctbGVmdDoxLjI1ZW1cIlxuICAgICAgICB9LFxuICAgICAgICAuLi5PYmplY3Qua2V5cyh0YXJnZXQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCBrZXkgKyBcIjogXCJdLFxuICAgICAgICAgICAgZm9ybWF0VmFsdWUodGFyZ2V0W2tleV0sIGZhbHNlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgXTtcbiAgfVxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2LCBhc1JhdyA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIG51bWJlclN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgSlNPTi5zdHJpbmdpZnkodildO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodikpIHtcbiAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGFzUmF3ID8gdG9SYXcodikgOiB2IH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgU3RyaW5nKHYpXTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0cmFjdEtleXMoaW5zdGFuY2UsIHR5cGUpIHtcbiAgICBjb25zdCBDb21wID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAoaXNGdW5jdGlvbihDb21wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRyYWN0ZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5jdHgpIHtcbiAgICAgIGlmIChpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpKSB7XG4gICAgICAgIGV4dHJhY3RlZFtrZXldID0gaW5zdGFuY2UuY3R4W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRyYWN0ZWQ7XG4gIH1cbiAgZnVuY3Rpb24gaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSB7XG4gICAgY29uc3Qgb3B0cyA9IENvbXBbdHlwZV07XG4gICAgaWYgKGlzQXJyYXkob3B0cykgJiYgb3B0cy5pbmNsdWRlcyhrZXkpIHx8IGlzT2JqZWN0KG9wdHMpICYmIGtleSBpbiBvcHRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAuZXh0ZW5kcyAmJiBpc0tleU9mVHlwZShDb21wLmV4dGVuZHMsIGtleSwgdHlwZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5taXhpbnMgJiYgQ29tcC5taXhpbnMuc29tZSgobSkgPT4gaXNLZXlPZlR5cGUobSwga2V5LCB0eXBlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5SZWZGbGFnKHYpIHtcbiAgICBpZiAoaXNTaGFsbG93KHYpKSB7XG4gICAgICByZXR1cm4gYFNoYWxsb3dSZWZgO1xuICAgIH1cbiAgICBpZiAodi5lZmZlY3QpIHtcbiAgICAgIHJldHVybiBgQ29tcHV0ZWRSZWZgO1xuICAgIH1cbiAgICByZXR1cm4gYFJlZmA7XG4gIH1cbiAgaWYgKHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMpIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzID0gW2Zvcm1hdHRlcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2l0aE1lbW8obWVtbywgcmVuZGVyLCBjYWNoZSwgaW5kZXgpIHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVbaW5kZXhdO1xuICBpZiAoY2FjaGVkICYmIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmV0ID0gcmVuZGVyKCk7XG4gIHJldC5tZW1vID0gbWVtby5zbGljZSgpO1xuICByZXQuY2FjaGVJbmRleCA9IGluZGV4O1xuICByZXR1cm4gY2FjaGVbaW5kZXhdID0gcmV0O1xufVxuZnVuY3Rpb24gaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pIHtcbiAgY29uc3QgcHJldiA9IGNhY2hlZC5tZW1vO1xuICBpZiAocHJldi5sZW5ndGggIT0gbWVtby5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgbWVtb1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2goY2FjaGVkKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdmVyc2lvbiA9IFwiMy41LjQzXCI7XG5jb25zdCB3YXJuID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHdhcm4kMSA6IE5PT1A7XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzID0gRXJyb3JUeXBlU3RyaW5ncyQxIDtcbmNvbnN0IGRldnRvb2xzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gZGV2dG9vbHMkMSA6IHZvaWQgMDtcbmNvbnN0IHNldERldnRvb2xzSG9vayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHJ1ZSA/IHNldERldnRvb2xzSG9vayQxIDogTk9PUDtcbmNvbnN0IF9zc3JVdGlscyA9IHtcbiAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UsXG4gIHNldHVwQ29tcG9uZW50LFxuICByZW5kZXJDb21wb25lbnRSb290LFxuICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsXG4gIGlzVk5vZGU6IGlzVk5vZGUsXG4gIG5vcm1hbGl6ZVZOb2RlLFxuICBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSxcbiAgZW5zdXJlVmFsaWRWTm9kZSxcbiAgcHVzaFdhcm5pbmdDb250ZXh0LFxuICBwb3BXYXJuaW5nQ29udGV4dFxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuY29uc3QgRGVwcmVjYXRpb25UeXBlcyA9IG51bGw7XG5cbmV4cG9ydCB7IEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgQ29tbWVudCwgRGVwcmVjYXRpb25UeXBlcywgRXJyb3JDb2RlcywgRXJyb3JUeXBlU3RyaW5ncywgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lTW9kZWwsIGRlZmluZU9wdGlvbnMsIGRlZmluZVByb3BzLCBkZWZpbmVTbG90cywgZGV2dG9vbHMsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBndWFyZFJlYWN0aXZlUHJvcHMsIGgsIGhhbmRsZUVycm9yLCBoYXNJbmplY3Rpb25Db250ZXh0LCBoeWRyYXRlT25JZGxlLCBoeWRyYXRlT25JbnRlcmFjdGlvbiwgaHlkcmF0ZU9uTWVkaWFRdWVyeSwgaHlkcmF0ZU9uVmlzaWJsZSwgaW5pdEN1c3RvbUZvcm1hdHRlciwgaW5qZWN0LCBpc01lbW9TYW1lLCBpc1J1bnRpbWVPbmx5LCBpc1ZOb2RlLCBtZXJnZURlZmF1bHRzLCBtZXJnZU1vZGVscywgbWVyZ2VQcm9wcywgbmV4dFRpY2ssIG9uQWN0aXZhdGVkLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uQmVmb3JlVXBkYXRlLCBvbkRlYWN0aXZhdGVkLCBvbkVycm9yQ2FwdHVyZWQsIG9uTW91bnRlZCwgb25SZW5kZXJUcmFja2VkLCBvblJlbmRlclRyaWdnZXJlZCwgb25TZXJ2ZXJQcmVmZXRjaCwgb25Vbm1vdW50ZWQsIG9uVXBkYXRlZCwgb3BlbkJsb2NrLCBwb3BTY29wZUlkLCBwcm92aWRlLCBwdXNoU2NvcGVJZCwgcXVldWVQb3N0Rmx1c2hDYiwgcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIsIHJlbmRlckxpc3QsIHJlbmRlclNsb3QsIHJlc29sdmVDb21wb25lbnQsIHJlc29sdmVEaXJlY3RpdmUsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCByZXNvbHZlRmlsdGVyLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBzZXRCbG9ja1RyYWNraW5nLCBzZXREZXZ0b29sc0hvb2ssIHNldFRyYW5zaXRpb25Ib29rcywgc3NyQ29udGV4dEtleSwgc3NyVXRpbHMsIHRvSGFuZGxlcnMsIHRyYW5zZm9ybVZOb2RlQXJncywgdXNlQXR0cnMsIHVzZUlkLCB1c2VNb2RlbCwgdXNlU1NSQ29udGV4dCwgdXNlU2xvdHMsIHVzZVRlbXBsYXRlUmVmLCB1c2VUcmFuc2l0aW9uU3RhdGUsIHZlcnNpb24sIHdhcm4sIHdhdGNoLCB3YXRjaEVmZmVjdCwgd2F0Y2hQb3N0RWZmZWN0LCB3YXRjaFN5bmNFZmZlY3QsIHdpdGhBc3luY0NvbnRleHQsIHdpdGhDdHgsIHdpdGhEZWZhdWx0cywgd2l0aERpcmVjdGl2ZXMsIHdpdGhNZW1vLCB3aXRoU2NvcGVJZCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNS40M1xuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgd2FybiwgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIGgsIEJhc2VUcmFuc2l0aW9uLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgb25CZWZvcmVVcGRhdGUsIHF1ZXVlUG9zdEZsdXNoQ2IsIG9uTW91bnRlZCwgd2F0Y2gsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIG5leHRUaWNrLCB1bnJlZiwgY3JlYXRlVk5vZGUsIGRlZmluZUNvbXBvbmVudCwgdXNlVHJhbnNpdGlvblN0YXRlLCBvblVwZGF0ZWQsIHRvUmF3LCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIHNldFRyYW5zaXRpb25Ib29rcywgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcywgVGV4dCwgY3JlYXRlUmVuZGVyZXIsIGlzUnVudGltZU9ubHksIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpc09iamVjdCwgdG9OdW1iZXIsIGlzQXJyYXksIE5PT1AsIG5vcm1hbGl6ZUNzc1ZhclZhbHVlLCBpc1N0cmluZywgaHlwaGVuYXRlLCBjYXBpdGFsaXplLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzU3ltYm9sLCBpc1NwZWNpYWxCb29sZWFuQXR0ciwgaXNGdW5jdGlvbiwgaXNPbiwgaXNNb2RlbExpc3RlbmVyLCBjYW1lbGl6ZSBhcyBjYW1lbGl6ZSQxLCBoYXNPd24sIGlzUGxhaW5PYmplY3QsIEVNUFRZX09CSiwgbG9vc2VJbmRleE9mLCBpc1NldCwgbG9vc2VFcXVhbCwgbG9vc2VUb051bWJlciwgaW52b2tlQXJyYXlGbnMsIGlzSFRNTFRhZywgaXNTVkdUYWcsIGlzTWF0aE1MVGFnIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5sZXQgcG9saWN5ID0gdm9pZCAwO1xuY29uc3QgdHQgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy50cnVzdGVkVHlwZXM7XG5pZiAodHQpIHtcbiAgdHJ5IHtcbiAgICBwb2xpY3kgPSAvKiBAX19QVVJFX18gKi8gdHQuY3JlYXRlUG9saWN5KFwidnVlXCIsIHtcbiAgICAgIGNyZWF0ZUhUTUw6ICh2YWwpID0+IHZhbFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBFcnJvciBjcmVhdGluZyB0cnVzdGVkIHR5cGVzIHBvbGljeTogJHtlfWApO1xuICB9XG59XG5jb25zdCB1bnNhZmVUb1RydXN0ZWRIVE1MID0gcG9saWN5ID8gKHZhbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwodmFsKSA6ICh2YWwpID0+IHZhbDtcbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGlzID8gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCB7IGlzIH0pIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgbmFtZXNwYWNlLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSB1bnNhZmVUb1RydXN0ZWRIVE1MKFxuICAgICAgICBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50XG4gICAgICApO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfdnRjXCIpO1xuY29uc3QgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbmFtZTogU3RyaW5nLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNzczoge1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgZGVmYXVsdDogdHJ1ZVxuICB9LFxuICBkdXJhdGlvbjogW1N0cmluZywgTnVtYmVyLCBPYmplY3RdLFxuICBlbnRlckZyb21DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyVG9DbGFzczogU3RyaW5nLFxuICBhcHBlYXJGcm9tQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBsZWF2ZUZyb21DbGFzczogU3RyaW5nLFxuICBsZWF2ZUFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nXG59O1xuY29uc3QgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGRlY29yYXRlJDEgPSAodCkgPT4ge1xuICB0LmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG4gIHQucHJvcHMgPSBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzO1xuICByZXR1cm4gdDtcbn07XG5jb25zdCBUcmFuc2l0aW9uID0gLyogQF9fUFVSRV9fICovIGRlY29yYXRlJDEoXG4gIChwcm9wcywgeyBzbG90cyB9KSA9PiBoKEJhc2VUcmFuc2l0aW9uLCByZXNvbHZlVHJhbnNpdGlvblByb3BzKHByb3BzKSwgc2xvdHMpXG4pO1xuY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncyA9IFtdKSA9PiB7XG4gIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgaG9vay5mb3JFYWNoKChoMikgPT4gaDIoLi4uYXJncykpO1xuICB9IGVsc2UgaWYgKGhvb2spIHtcbiAgICBob29rKC4uLmFyZ3MpO1xuICB9XG59O1xuY29uc3QgaGFzRXhwbGljaXRDYWxsYmFjayA9IChob29rKSA9PiB7XG4gIHJldHVybiBob29rID8gaXNBcnJheShob29rKSA/IGhvb2suc29tZSgoaDIpID0+IGgyLmxlbmd0aCA+IDEpIDogaG9vay5sZW5ndGggPiAxIDogZmFsc2U7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcykge1xuICBjb25zdCBiYXNlUHJvcHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIShrZXkgaW4gRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycykpIHtcbiAgICAgIGJhc2VQcm9wc1trZXldID0gcmF3UHJvcHNba2V5XTtcbiAgICB9XG4gIH1cbiAgaWYgKHJhd1Byb3BzLmNzcyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYmFzZVByb3BzO1xuICB9XG4gIGNvbnN0IHtcbiAgICBuYW1lID0gXCJ2XCIsXG4gICAgdHlwZSxcbiAgICBkdXJhdGlvbixcbiAgICBlbnRlckZyb21DbGFzcyA9IGAke25hbWV9LWVudGVyLWZyb21gLFxuICAgIGVudGVyQWN0aXZlQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1hY3RpdmVgLFxuICAgIGVudGVyVG9DbGFzcyA9IGAke25hbWV9LWVudGVyLXRvYCxcbiAgICBhcHBlYXJGcm9tQ2xhc3MgPSBlbnRlckZyb21DbGFzcyxcbiAgICBhcHBlYXJBY3RpdmVDbGFzcyA9IGVudGVyQWN0aXZlQ2xhc3MsXG4gICAgYXBwZWFyVG9DbGFzcyA9IGVudGVyVG9DbGFzcyxcbiAgICBsZWF2ZUZyb21DbGFzcyA9IGAke25hbWV9LWxlYXZlLWZyb21gLFxuICAgIGxlYXZlQWN0aXZlQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1hY3RpdmVgLFxuICAgIGxlYXZlVG9DbGFzcyA9IGAke25hbWV9LWxlYXZlLXRvYFxuICB9ID0gcmF3UHJvcHM7XG4gIGNvbnN0IGR1cmF0aW9ucyA9IG5vcm1hbGl6ZUR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgY29uc3QgZW50ZXJEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMF07XG4gIGNvbnN0IGxlYXZlRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzFdO1xuICBjb25zdCB7XG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uRW50ZXJDYW5jZWxsZWQsXG4gICAgb25MZWF2ZSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlQXBwZWFyID0gb25CZWZvcmVFbnRlcixcbiAgICBvbkFwcGVhciA9IG9uRW50ZXIsXG4gICAgb25BcHBlYXJDYW5jZWxsZWQgPSBvbkVudGVyQ2FuY2VsbGVkXG4gIH0gPSBiYXNlUHJvcHM7XG4gIGNvbnN0IGZpbmlzaEVudGVyID0gKGVsLCBpc0FwcGVhciwgZG9uZSwgaXNDYW5jZWxsZWQpID0+IHtcbiAgICBlbC5fZW50ZXJDYW5jZWxsZWQgPSBpc0NhbmNlbGxlZDtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgaWYgKCFlbC5fZW50ZXJDYW5jZWxsZWQpIHtcbiAgICAgICAgZm9yY2VSZWZsb3coZWwpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgZm9yY2VSZWZsb3coZWwpO1xuICAgICAgfVxuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKCFlbC5faXNMZWF2aW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhvbkxlYXZlKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgbGVhdmVEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZSwgW2VsLCByZXNvbHZlXSk7XG4gICAgfSxcbiAgICBvbkVudGVyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgZmFsc2UsIHZvaWQgMCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSwgdm9pZCAwLCB0cnVlKTtcbiAgICAgIGNhbGxIb29rKG9uQXBwZWFyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uTGVhdmVDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaExlYXZlKGVsKTtcbiAgICAgIGNhbGxIb29rKG9uTGVhdmVDYW5jZWxsZWQsIFtlbF0pO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVEdXJhdGlvbihkdXJhdGlvbikge1xuICBpZiAoZHVyYXRpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGR1cmF0aW9uKSkge1xuICAgIHJldHVybiBbTnVtYmVyT2YoZHVyYXRpb24uZW50ZXIpLCBOdW1iZXJPZihkdXJhdGlvbi5sZWF2ZSldO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG4gPSBOdW1iZXJPZihkdXJhdGlvbik7XG4gICAgcmV0dXJuIFtuLCBuXTtcbiAgfVxufVxuZnVuY3Rpb24gTnVtYmVyT2YodmFsKSB7XG4gIGNvbnN0IHJlcyA9IHRvTnVtYmVyKHZhbCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHJlcywgXCI8dHJhbnNpdGlvbj4gZXhwbGljaXQgZHVyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LmFkZChjKSk7XG4gIChlbFt2dGNLZXldIHx8IChlbFt2dGNLZXldID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkpLmFkZChjbHMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBjbHMpIHtcbiAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBlbC5jbGFzc0xpc3QucmVtb3ZlKGMpKTtcbiAgY29uc3QgX3Z0YyA9IGVsW3Z0Y0tleV07XG4gIGlmIChfdnRjKSB7XG4gICAgX3Z0Yy5kZWxldGUoY2xzKTtcbiAgICBpZiAoIV92dGMuc2l6ZSkge1xuICAgICAgZWxbdnRjS2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG5leHRGcmFtZShjYikge1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShjYik7XG4gIH0pO1xufVxubGV0IGVuZElkID0gMDtcbmZ1bmN0aW9uIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgZXhwZWN0ZWRUeXBlLCBleHBsaWNpdFRpbWVvdXQsIHJlc29sdmUpIHtcbiAgY29uc3QgaWQgPSBlbC5fZW5kSWQgPSArK2VuZElkO1xuICBjb25zdCByZXNvbHZlSWZOb3RTdGFsZSA9ICgpID0+IHtcbiAgICBpZiAoaWQgPT09IGVsLl9lbmRJZCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbiAgfTtcbiAgaWYgKGV4cGxpY2l0VGltZW91dCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZUlmTm90U3RhbGUsIGV4cGxpY2l0VGltZW91dCk7XG4gIH1cbiAgY29uc3QgeyB0eXBlLCB0aW1lb3V0LCBwcm9wQ291bnQgfSA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpO1xuICBpZiAoIXR5cGUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGVuZEV2ZW50ID0gdHlwZSArIFwiZW5kXCI7XG4gIGxldCBlbmRlZCA9IDA7XG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG4gICAgcmVzb2x2ZUlmTm90U3RhbGUoKTtcbiAgfTtcbiAgY29uc3Qgb25FbmQgPSAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZWwgJiYgKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgb25FbmQpO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIGNvbnN0IGdldFN0eWxlUHJvcGVydGllcyA9IChrZXkpID0+IChzdHlsZXNba2V5XSB8fCBcIlwiKS5zcGxpdChcIiwgXCIpO1xuICBjb25zdCB0cmFuc2l0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RGVsYXlgKTtcbiAgY29uc3QgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTtcbiAgY29uc3QgYW5pbWF0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EZWxheWApO1xuICBjb25zdCBhbmltYXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IGFuaW1hdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KGFuaW1hdGlvbkRlbGF5cywgYW5pbWF0aW9uRHVyYXRpb25zKTtcbiAgbGV0IHR5cGUgPSBudWxsO1xuICBsZXQgdGltZW91dCA9IDA7XG4gIGxldCBwcm9wQ291bnQgPSAwO1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwID8gdHJhbnNpdGlvblRpbWVvdXQgPiBhbmltYXRpb25UaW1lb3V0ID8gVFJBTlNJVElPTiA6IEFOSU1BVElPTiA6IG51bGw7XG4gICAgcHJvcENvdW50ID0gdHlwZSA/IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aCA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIGNvbnN0IGhhc1RyYW5zZm9ybSA9IHR5cGUgPT09IFRSQU5TSVRJT04gJiYgL1xcYig/OnRyYW5zZm9ybXxhbGwpKD86LHwkKS8udGVzdChcbiAgICBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1Qcm9wZXJ0eWApLnRvU3RyaW5nKClcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlLFxuICAgIHRpbWVvdXQsXG4gICAgcHJvcENvdW50LFxuICAgIGhhc1RyYW5zZm9ybVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0VGltZW91dChkZWxheXMsIGR1cmF0aW9ucykge1xuICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHtcbiAgICBkZWxheXMgPSBkZWxheXMuY29uY2F0KGRlbGF5cyk7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KC4uLmR1cmF0aW9ucy5tYXAoKGQsIGkpID0+IHRvTXMoZCkgKyB0b01zKGRlbGF5c1tpXSkpKTtcbn1cbmZ1bmN0aW9uIHRvTXMocykge1xuICBpZiAocyA9PT0gXCJhdXRvXCIpIHJldHVybiAwO1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkgKiAxZTM7XG59XG5mdW5jdGlvbiBmb3JjZVJlZmxvdyhlbCkge1xuICBjb25zdCB0YXJnZXREb2N1bWVudCA9IGVsID8gZWwub3duZXJEb2N1bWVudCA6IGRvY3VtZW50O1xuICByZXR1cm4gdGFyZ2V0RG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIHBhdGNoQ2xhc3MoZWwsIHZhbHVlLCBpc1NWRykge1xuICBjb25zdCB0cmFuc2l0aW9uQ2xhc3NlcyA9IGVsW3Z0Y0tleV07XG4gIGlmICh0cmFuc2l0aW9uQ2xhc3Nlcykge1xuICAgIHZhbHVlID0gKHZhbHVlID8gW3ZhbHVlLCAuLi50cmFuc2l0aW9uQ2xhc3Nlc10gOiBbLi4udHJhbnNpdGlvbkNsYXNzZXNdKS5qb2luKFwiIFwiKTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICB9IGVsc2UgaWYgKGlzU1ZHKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGVsLmNsYXNzTmFtZSA9IHZhbHVlO1xuICB9XG59XG5cbmNvbnN0IHZTaG93T3JpZ2luYWxEaXNwbGF5ID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcIl92b2RcIik7XG5jb25zdCB2U2hvd0hpZGRlbiA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfdnNoXCIpO1xuY29uc3QgdlNob3cgPSB7XG4gIC8vIHVzZWQgZm9yIHByb3AgbWlzbWF0Y2ggY2hlY2sgZHVyaW5nIGh5ZHJhdGlvblxuICBuYW1lOiBcInNob3dcIixcbiAgYmVmb3JlTW91bnQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBlbC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSByZXR1cm47XG4gICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgc2V0RGlzcGxheShlbCwgdHJ1ZSk7XG4gICAgICAgIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbi5sZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgIHNldERpc3BsYXkoZWwsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIGJlZm9yZVVubW91bnQoZWwsIHsgdmFsdWUgfSkge1xuICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldERpc3BsYXkoZWwsIHZhbHVlKSB7XG4gIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IGVsW3ZTaG93T3JpZ2luYWxEaXNwbGF5XSA6IFwibm9uZVwiO1xuICBlbFt2U2hvd0hpZGRlbl0gPSAhdmFsdWU7XG59XG5mdW5jdGlvbiBpbml0VlNob3dGb3JTU1IoKSB7XG4gIHZTaG93LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0gfTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IENTU19WQVJfVEVYVCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQ1NTX1ZBUl9URVhUXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc1ZhcnMgaXMgY2FsbGVkIHdpdGhvdXQgY3VycmVudCBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSBpbnN0YW5jZS51dCA9ICh2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KSkgPT4ge1xuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYClcbiAgICApLmZvckVhY2goKG5vZGUpID0+IHNldFZhcnNPbk5vZGUobm9kZSwgdmFycykpO1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmdldENzc1ZhcnMgPSAoKSA9PiBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICB9XG4gIGNvbnN0IHNldFZhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgdmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSk7XG4gICAgaWYgKGluc3RhbmNlLmNlKSB7XG4gICAgICBzZXRWYXJzT25Ob2RlKGluc3RhbmNlLmNlLCB2YXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgfVxuICAgIHVwZGF0ZVRlbGVwb3J0cyh2YXJzKTtcbiAgfTtcbiAgb25CZWZvcmVVcGRhdGUoKCkgPT4ge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2Ioc2V0VmFycyk7XG4gIH0pO1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoKHNldFZhcnMsIE5PT1AsIHsgZmx1c2g6IFwicG9zdFwiIH0pO1xuICAgIGNvbnN0IG9iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc2V0VmFycyk7XG4gICAgb2Iub2JzZXJ2ZShpbnN0YW5jZS5zdWJUcmVlLmVsLnBhcmVudE5vZGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIG9uVW5tb3VudGVkKCgpID0+IG9iLmRpc2Nvbm5lY3QoKSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0VmFyc09uVk5vZGUodm5vZGUsIHZhcnMpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2U7XG4gICAgdm5vZGUgPSBzdXNwZW5zZS5hY3RpdmVCcmFuY2g7XG4gICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgIXN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goKCkgPT4ge1xuICAgICAgICBzZXRWYXJzT25WTm9kZShzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIHZhcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHdoaWxlICh2bm9kZS5jb21wb25lbnQpIHtcbiAgICB2bm9kZSA9IHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHZub2RlLmVsKSB7XG4gICAgc2V0VmFyc09uTm9kZSh2bm9kZS5lbCwgdmFycyk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjKSA9PiBzZXRWYXJzT25WTm9kZShjLCB2YXJzKSk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gU3RhdGljKSB7XG4gICAgbGV0IHsgZWwsIGFuY2hvciB9ID0gdm5vZGU7XG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKTtcbiAgICAgIGlmIChlbCA9PT0gYW5jaG9yKSBicmVhaztcbiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKSB7XG4gIGlmIChlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gICAgbGV0IGNzc1RleHQgPSBcIlwiO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplQ3NzVmFyVmFsdWUodmFyc1trZXldKTtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLSR7a2V5fWAsIHZhbHVlKTtcbiAgICAgIGNzc1RleHQgKz0gYC0tJHtrZXl9OiAke3ZhbHVlfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5jb25zdCBkaXNwbGF5UkUgPSAvKD86Xnw7KVxccypkaXNwbGF5XFxzKjovO1xuZnVuY3Rpb24gcGF0Y2hTdHlsZShlbCwgcHJldiwgbmV4dCkge1xuICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICBjb25zdCBpc0Nzc1N0cmluZyA9IGlzU3RyaW5nKG5leHQpO1xuICBsZXQgaGFzQ29udHJvbGxlZERpc3BsYXkgPSBmYWxzZTtcbiAgaWYgKG5leHQgJiYgIWlzQ3NzU3RyaW5nKSB7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIGlmICghaXNTdHJpbmcocHJldikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHByZXZTdHlsZSBvZiBwcmV2LnNwbGl0KFwiO1wiKSkge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHByZXZTdHlsZS5zbGljZSgwLCBwcmV2U3R5bGUuaW5kZXhPZihcIjpcIikpLnRyaW0oKTtcbiAgICAgICAgICBpZiAobmV4dFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBpZiAoa2V5ID09PSBcImRpc3BsYXlcIikge1xuICAgICAgICBoYXNDb250cm9sbGVkRGlzcGxheSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IG5leHRba2V5XTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmICghc2hvdWxkUHJlc2VydmVUZXh0YXJlYVJlc2l6ZVN0eWxlKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICAhaXNTdHJpbmcocHJldikgJiYgcHJldiA/IHByZXZba2V5XSA6IHZvaWQgMCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApKSB7XG4gICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzQ3NzU3RyaW5nKSB7XG4gICAgICBpZiAocHJldiAhPT0gbmV4dCkge1xuICAgICAgICBjb25zdCBjc3NWYXJUZXh0ID0gc3R5bGVbQ1NTX1ZBUl9URVhUXTtcbiAgICAgICAgaWYgKGNzc1ZhclRleHQpIHtcbiAgICAgICAgICBuZXh0ICs9IFwiO1wiICsgY3NzVmFyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5jc3NUZXh0ID0gbmV4dDtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSBkaXNwbGF5UkUudGVzdChuZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXYpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIH1cbiAgfVxuICBpZiAodlNob3dPcmlnaW5hbERpc3BsYXkgaW4gZWwpIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBoYXNDb250cm9sbGVkRGlzcGxheSA/IHN0eWxlLmRpc3BsYXkgOiBcIlwiO1xuICAgIGlmIChlbFt2U2hvd0hpZGRlbl0pIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHNlbWljb2xvblJFID0gL1teXFxcXF07XFxzKiQvO1xuY29uc3QgaW1wb3J0YW50UkUgPSAvXFxzKiFpbXBvcnRhbnQkLztcbmZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2YWwpIHtcbiAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgIHZhbC5mb3JFYWNoKCh2KSA9PiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdikpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWwgPT0gbnVsbCkgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksIFwiaW1wb3J0YW50XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVUZXh0YXJlYVJlc2l6ZVN0eWxlKGVsLCBrZXksIHByZXYsIG5leHQpIHtcbiAgcmV0dXJuIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIiAmJiAoa2V5ID09PSBcIndpZHRoXCIgfHwga2V5ID09PSBcImhlaWdodFwiKSAmJiBpc1N0cmluZyhuZXh0KSAmJiBwcmV2ID09PSBuZXh0O1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSwgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGlzQm9vbGVhbiAmJiAhaW5jbHVkZUJvb2xlYW5BdHRyKHZhbHVlKSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcbiAgICAgICAga2V5LFxuICAgICAgICBpc0Jvb2xlYW4gPyBcIlwiIDogaXNTeW1ib2wodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHBhcmVudENvbXBvbmVudCwgYXR0ck5hbWUpIHtcbiAgaWYgKGtleSA9PT0gXCJpbm5lckhUTUxcIiB8fCBrZXkgPT09IFwidGV4dENvbnRlbnRcIikge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBlbFtrZXldID0ga2V5ID09PSBcImlubmVySFRNTFwiID8gdW5zYWZlVG9UcnVzdGVkSFRNTCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgfHwgXCJcIiA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IChcbiAgICAgIC8vICMxMTY0NzogdmFsdWUgc2hvdWxkIGJlIHNldCBhcyBlbXB0eSBzdHJpbmcgZm9yIG51bGwgYW5kIHVuZGVmaW5lZCxcbiAgICAgIC8vIGJ1dCA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCI+IHNob3VsZCBiZSBzZXQgYXMgJ29uJy5cbiAgICAgIGVsLnR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwib25cIiA6IFwiXCJcbiAgICApIDogU3RyaW5nKHZhbHVlKTtcbiAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlIHx8ICEoXCJfdmFsdWVcIiBpbiBlbCkpIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gICAgZWwuX3ZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbFtrZXldO1xuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGVsW2tleV0gPSB2YWx1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFuZWVkUmVtb3ZlKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHNldHRpbmcgcHJvcCBcIiR7a2V5fVwiIG9uIDwke3RhZy50b0xvd2VyQ2FzZSgpfT46IHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUgfHwga2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmNvbnN0IHZlaUtleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfdmVpXCIpO1xuZnVuY3Rpb24gcGF0Y2hFdmVudChlbCwgcmF3TmFtZSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIGluc3RhbmNlID0gbnVsbCkge1xuICBjb25zdCBpbnZva2VycyA9IGVsW3ZlaUtleV0gfHwgKGVsW3ZlaUtleV0gPSB7fSk7XG4gIGNvbnN0IGV4aXN0aW5nSW52b2tlciA9IGludm9rZXJzW3Jhd05hbWVdO1xuICBpZiAobmV4dFZhbHVlICYmIGV4aXN0aW5nSW52b2tlcikge1xuICAgIGV4aXN0aW5nSW52b2tlci52YWx1ZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzYW5pdGl6ZUV2ZW50VmFsdWUobmV4dFZhbHVlLCByYXdOYW1lKSA6IG5leHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbbmFtZSwgb3B0aW9uc10gPSBwYXJzZU5hbWUocmF3TmFtZSk7XG4gICAgaWYgKG5leHRWYWx1ZSkge1xuICAgICAgY29uc3QgaW52b2tlciA9IGludm9rZXJzW3Jhd05hbWVdID0gY3JlYXRlSW52b2tlcihcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNhbml0aXplRXZlbnRWYWx1ZShuZXh0VmFsdWUsIHJhd05hbWUpIDogbmV4dFZhbHVlLFxuICAgICAgICBpbnN0YW5jZVxuICAgICAgKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIG5hbWUsIGludm9rZXIsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBleGlzdGluZ0ludm9rZXIsIG9wdGlvbnMpO1xuICAgICAgaW52b2tlcnNbcmF3TmFtZV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5jb25zdCBvcHRpb25zTW9kaWZpZXJSRSA9IC8oT25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5jb25zdCBvcHRpb25zTW9kaWZpZXJFdmVudFJFID0gL15vbjo/KD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgbGV0IG07XG4gIHdoaWxlICgobSA9IG5hbWUubWF0Y2gob3B0aW9uc01vZGlmaWVyUkUpKSAmJiAhb3B0aW9uc01vZGlmaWVyRXZlbnRSRS50ZXN0KG5hbWUpKSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzFdLmxlbmd0aCk7XG4gICAgb3B0aW9uc1ttWzFdLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IGludm9rZXIudmFsdWU7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0b3AgPSBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgICBvcmlnaW5hbFN0b3AuY2FsbChlKTtcbiAgICAgICAgZS5fc3RvcHBlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgY29uc3QgaGFuZGxlcnMgPSB2YWx1ZS5zbGljZSgpO1xuICAgICAgY29uc3QgYXJncyA9IFtlXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGUuX3N0b3BwZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbaV07XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICA1LFxuICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgNSxcbiAgICAgICAgW2VdXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHNhbml0aXplRXZlbnRWYWx1ZSh2YWx1ZSwgcHJvcE5hbWUpIHtcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHdhcm4oXG4gICAgYFdyb25nIHR5cGUgcGFzc2VkIGFzIGV2ZW50IGhhbmRsZXIgdG8gJHtwcm9wTmFtZX0gLSBkaWQgeW91IGZvcmdldCBAIG9yIDogaW4gZnJvbnQgb2YgeW91ciBwcm9wP1xuRXhwZWN0ZWQgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCByZWNlaXZlZCB0eXBlICR7dHlwZW9mIHZhbHVlfS5gXG4gICk7XG4gIHJldHVybiBOT09QO1xufVxuXG5jb25zdCBpc05hdGl2ZU9uID0gKGtleSkgPT4ga2V5LmNoYXJDb2RlQXQoMCkgPT09IDExMSAmJiBrZXkuY2hhckNvZGVBdCgxKSA9PT0gMTEwICYmIC8vIGxvd2VyY2FzZSBsZXR0ZXJcbmtleS5jaGFyQ29kZUF0KDIpID4gOTYgJiYga2V5LmNoYXJDb2RlQXQoMikgPCAxMjM7XG5jb25zdCBwYXRjaFByb3AgPSAoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KSA9PiB7XG4gIGNvbnN0IGlzU1ZHID0gbmFtZXNwYWNlID09PSBcInN2Z1wiO1xuICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICBwYXRjaENsYXNzKGVsLCBuZXh0VmFsdWUsIGlzU1ZHKTtcbiAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgIHBhdGNoU3R5bGUoZWwsIHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICBwYXRjaEV2ZW50KGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXlbMF0gPT09IFwiLlwiID8gKGtleSA9IGtleS5zbGljZSgxKSwgdHJ1ZSkgOiBrZXlbMF0gPT09IFwiXlwiID8gKGtleSA9IGtleS5zbGljZSgxKSwgZmFsc2UpIDogc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpKSB7XG4gICAgcGF0Y2hET01Qcm9wKGVsLCBrZXksIG5leHRWYWx1ZSk7XG4gICAgaWYgKCFlbC50YWdOYW1lLmluY2x1ZGVzKFwiLVwiKSAmJiAoa2V5ID09PSBcInZhbHVlXCIgfHwga2V5ID09PSBcImNoZWNrZWRcIiB8fCBrZXkgPT09IFwic2VsZWN0ZWRcIikpIHtcbiAgICAgIHBhdGNoQXR0cihlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHLCBwYXJlbnRDb21wb25lbnQsIGtleSAhPT0gXCJ2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgLy8gIzExMDgxIGZvcmNlIHNldCBwcm9wcyBmb3IgcG9zc2libGUgYXN5bmMgY3VzdG9tIGVsZW1lbnRcbiAgICBlbC5faXNWdWVDRSAmJiAvLyAjMTI0MDggY2hlY2sgaWYgaXQncyBkZWNsYXJlZCBwcm9wIG9yIGl0J3MgYXN5bmMgY3VzdG9tIGVsZW1lbnRcbiAgICAoc2hvdWxkU2V0QXNQcm9wRm9yVnVlQ0UoZWwsIGtleSkgfHwgLy8gQHRzLWV4cGVjdC1lcnJvciBfZGVmIGlzIHByaXZhdGVcbiAgICBlbC5fZGVmLl9fYXN5bmNMb2FkZXIgJiYgKC9bQS1aXS8udGVzdChrZXkpIHx8ICFpc1N0cmluZyhuZXh0VmFsdWUpKSlcbiAgKSB7XG4gICAgcGF0Y2hET01Qcm9wKGVsLCBjYW1lbGl6ZSQxKGtleSksIG5leHRWYWx1ZSwgcGFyZW50Q29tcG9uZW50LCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgPT09IFwidHJ1ZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fdHJ1ZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImZhbHNlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH1cbn07XG5mdW5jdGlvbiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgdmFsdWUsIGlzU1ZHKSB7XG4gIGlmIChpc1NWRykge1xuICAgIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5IGluIGVsICYmIGlzTmF0aXZlT24oa2V5KSAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInNwZWxsY2hlY2tcIiB8fCBrZXkgPT09IFwiZHJhZ2dhYmxlXCIgfHwga2V5ID09PSBcInRyYW5zbGF0ZVwiIHx8IGtleSA9PT0gXCJhdXRvY29ycmVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwic2FuZGJveFwiICYmIGVsLnRhZ05hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJmb3JtXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJsaXN0XCIgJiYgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwidHlwZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcIndpZHRoXCIgfHwga2V5ID09PSBcImhlaWdodFwiKSB7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZTtcbiAgICBpZiAodGFnID09PSBcIklNR1wiIHx8IHRhZyA9PT0gXCJWSURFT1wiIHx8IHRhZyA9PT0gXCJDQU5WQVNcIiB8fCB0YWcgPT09IFwiU09VUkNFXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzTmF0aXZlT24oa2V5KSAmJiBpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGtleSBpbiBlbDtcbn1cbmZ1bmN0aW9uIHNob3VsZFNldEFzUHJvcEZvclZ1ZUNFKGVsLCBrZXkpIHtcbiAgY29uc3QgcHJvcHMgPSAoXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBfZGVmIGlzIHByaXZhdGVcbiAgICBlbC5fZGVmLnByb3BzXG4gICk7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2FtZWxLZXkgPSBjYW1lbGl6ZSQxKGtleSk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb3BzKSA/IHByb3BzLnNvbWUoKHByb3ApID0+IGNhbWVsaXplJDEocHJvcCkgPT09IGNhbWVsS2V5KSA6IE9iamVjdC5rZXlzKHByb3BzKS5zb21lKChwcm9wKSA9PiBjYW1lbGl6ZSQxKHByb3ApID09PSBjYW1lbEtleSk7XG59XG5cbmNvbnN0IFJFTU9WQUwgPSB7fTtcbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGV4dHJhT3B0aW9ucywgX2NyZWF0ZUFwcCkge1xuICBsZXQgQ29tcCA9IGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpO1xuICBpZiAoaXNQbGFpbk9iamVjdChDb21wKSkgQ29tcCA9IGV4dGVuZCh7fSwgQ29tcCwgZXh0cmFPcHRpb25zKTtcbiAgY2xhc3MgVnVlQ3VzdG9tRWxlbWVudCBleHRlbmRzIFZ1ZUVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKGluaXRpYWxQcm9wcykge1xuICAgICAgc3VwZXIoQ29tcCwgaW5pdGlhbFByb3BzLCBfY3JlYXRlQXBwKTtcbiAgICB9XG4gIH1cbiAgVnVlQ3VzdG9tRWxlbWVudC5kZWYgPSBDb21wO1xuICByZXR1cm4gVnVlQ3VzdG9tRWxlbWVudDtcbn1cbmNvbnN0IGRlZmluZVNTUkN1c3RvbUVsZW1lbnQgPSAoLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMsIGV4dHJhT3B0aW9ucykgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBjcmVhdGVTU1JBcHApO1xufSk7XG5jb25zdCBCYXNlQ2xhc3MgPSB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBIVE1MRWxlbWVudCA6IGNsYXNzIHtcbn07XG5jbGFzcyBWdWVFbGVtZW50IGV4dGVuZHMgQmFzZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoX2RlZiwgX3Byb3BzID0ge30sIF9jcmVhdGVBcHAgPSBjcmVhdGVBcHApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RlZiA9IF9kZWY7XG4gICAgdGhpcy5fcHJvcHMgPSBfcHJvcHM7XG4gICAgdGhpcy5fY3JlYXRlQXBwID0gX2NyZWF0ZUFwcDtcbiAgICB0aGlzLl9pc1Z1ZUNFID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYXBwID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9ub25jZSA9IHRoaXMuX2RlZi5ub25jZTtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BhdGNoaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcbiAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVDaGlsZHJlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMuX3N0eWxlQW5jaG9ycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIF9jcmVhdGVBcHAgIT09IGNyZWF0ZUFwcCkge1xuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuc2hhZG93Um9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfZGVmLnNoYWRvd1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KFxuICAgICAgICAgIGV4dGVuZCh7fSwgX2RlZi5zaGFkb3dSb290T3B0aW9ucywge1xuICAgICAgICAgICAgbW9kZTogXCJvcGVuXCJcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9yb290ID0gdGhpcy5zaGFkb3dSb290O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290ICYmICF0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgdGhpcy5fcGFyc2VTbG90cygpO1xuICAgIH1cbiAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGxldCBwYXJlbnQgPSB0aGlzO1xuICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgLy8gIzEyNDc5IHNob3VsZCBjaGVjayBhc3NpZ25lZFNsb3QgZmlyc3QgdG8gZ2V0IGNvcnJlY3QgcGFyZW50XG4gICAgKHBhcmVudC5hc3NpZ25lZFNsb3QgfHwgcGFyZW50LnBhcmVudE5vZGUgfHwgcGFyZW50Lmhvc3QpKSB7XG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVnVlRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5fbW91bnQodGhpcy5fZGVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nUmVzb2x2ZSkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gcGFyZW50Ll9wZW5kaW5nUmVzb2x2ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVEZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9yZXNvbHZlRGVmKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NldFBhcmVudChwYXJlbnQgPSB0aGlzLl9wYXJlbnQpIHtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgdGhpcy5faW5oZXJpdFBhcmVudENvbnRleHQocGFyZW50KTtcbiAgICB9XG4gIH1cbiAgX2luaGVyaXRQYXJlbnRDb250ZXh0KHBhcmVudCA9IHRoaXMuX3BhcmVudCkge1xuICAgIGlmIChwYXJlbnQgJiYgdGhpcy5fYXBwKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoXG4gICAgICAgIHRoaXMuX2FwcC5fY29udGV4dC5wcm92aWRlcyxcbiAgICAgICAgcGFyZW50Ll9pbnN0YW5jZS5wcm92aWRlc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX29iKSB7XG4gICAgICAgICAgdGhpcy5fb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHAgJiYgdGhpcy5fYXBwLnVubW91bnQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB0aGlzLl9pbnN0YW5jZS5jZSA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5fYXBwID0gdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fdGVsZXBvcnRUYXJnZXRzKSB7XG4gICAgICAgICAgdGhpcy5fdGVsZXBvcnRUYXJnZXRzLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5fdGVsZXBvcnRUYXJnZXRzID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKSB7XG4gICAgZm9yIChjb25zdCBtIG9mIG11dGF0aW9ucykge1xuICAgICAgdGhpcy5fc2V0QXR0cihtLmF0dHJpYnV0ZU5hbWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogcmVzb2x2ZSBpbm5lciBjb21wb25lbnQgZGVmaW5pdGlvbiAoaGFuZGxlIHBvc3NpYmxlIGFzeW5jIGNvbXBvbmVudClcbiAgICovXG4gIF9yZXNvbHZlRGVmKCkge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdSZXNvbHZlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fc2V0QXR0cih0aGlzLmF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX29iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5fcHJvY2Vzc011dGF0aW9ucy5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9vYi5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXNvbHZlID0gKGRlZiwgaXNBc3luYyA9IGZhbHNlKSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlZCA9IHRydWU7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZSA9IHZvaWQgMDtcbiAgICAgIGNvbnN0IHsgcHJvcHMsIHN0eWxlcyB9ID0gZGVmO1xuICAgICAgbGV0IG51bWJlclByb3BzO1xuICAgICAgaWYgKHByb3BzICYmICFpc0FycmF5KHByb3BzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgIGNvbnN0IG9wdCA9IHByb3BzW2tleV07XG4gICAgICAgICAgaWYgKG9wdCA9PT0gTnVtYmVyIHx8IG9wdCAmJiBvcHQudHlwZSA9PT0gTnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIHRoaXMuX3Byb3BzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB0b051bWJlcih0aGlzLl9wcm9wc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChudW1iZXJQcm9wcyB8fCAobnVtYmVyUHJvcHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSkpW2NhbWVsaXplJDEoa2V5KV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudW1iZXJQcm9wcztcbiAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyhkZWYpO1xuICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhzdHlsZXMpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN0eWxlcykge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiQ3VzdG9tIGVsZW1lbnQgc3R5bGUgaW5qZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiB1c2luZyBzaGFkb3dSb290OiBmYWxzZVwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9tb3VudChkZWYpO1xuICAgIH07XG4gICAgY29uc3QgYXN5bmNEZWYgPSB0aGlzLl9kZWYuX19hc3luY0xvYWRlcjtcbiAgICBpZiAoYXN5bmNEZWYpIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gYXN5bmNEZWYoKS50aGVuKChkZWYpID0+IHtcbiAgICAgICAgZGVmLmNvbmZpZ3VyZUFwcCA9IHRoaXMuX2RlZi5jb25maWd1cmVBcHA7XG4gICAgICAgIHJlc29sdmUodGhpcy5fZGVmID0gZGVmLCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdSZXNvbHZlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHRoaXMuX2RlZik7XG4gICAgfVxuICB9XG4gIF9tb3VudChkZWYpIHtcbiAgICBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSAmJiAhZGVmLm5hbWUpIHtcbiAgICAgIGRlZi5uYW1lID0gXCJWdWVFbGVtZW50XCI7XG4gICAgfVxuICAgIHRoaXMuX2FwcCA9IHRoaXMuX2NyZWF0ZUFwcChkZWYpO1xuICAgIHRoaXMuX2luaGVyaXRQYXJlbnRDb250ZXh0KCk7XG4gICAgaWYgKGRlZi5jb25maWd1cmVBcHApIHtcbiAgICAgIGRlZi5jb25maWd1cmVBcHAodGhpcy5fYXBwKTtcbiAgICB9XG4gICAgdGhpcy5fYXBwLl9jZVZOb2RlID0gdGhpcy5fY3JlYXRlVk5vZGUoKTtcbiAgICB0aGlzLl9hcHAubW91bnQodGhpcy5fcm9vdCk7XG4gICAgY29uc3QgZXhwb3NlZCA9IHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2luc3RhbmNlLmV4cG9zZWQ7XG4gICAgaWYgKCFleHBvc2VkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZXhwb3NlZCkge1xuICAgICAgaWYgKCFoYXNPd24odGhpcywga2V5KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgICAgLy8gdW53cmFwIHJlZiB0byBiZSBjb25zaXN0ZW50IHdpdGggcHVibGljIGluc3RhbmNlIGJlaGF2aW9yXG4gICAgICAgICAgZ2V0OiAoKSA9PiB1bnJlZihleHBvc2VkW2tleV0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oYEV4cG9zZWQgcHJvcGVydHkgXCIke2tleX1cIiBhbHJlYWR5IGV4aXN0cyBvbiBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICBjb25zdCB7IHByb3BzIH0gPSBkZWY7XG4gICAgY29uc3QgZGVjbGFyZWRQcm9wS2V5cyA9IGlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBPYmplY3Qua2V5cyhwcm9wcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcykpIHtcbiAgICAgIGlmIChrZXlbMF0gIT09IFwiX1wiICYmIGRlY2xhcmVkUHJvcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdGhpc1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZGVjbGFyZWRQcm9wS2V5cy5tYXAoY2FtZWxpemUkMSkpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQ3VzdG9tIGVsZW1lbnQgcHJvcCBcIiR7a2V5fVwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGFuZCB3aWxsIG92ZXJ3cml0ZSBpdC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJvcChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsKSB7XG4gICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHZhbCwgdHJ1ZSwgIXRoaXMuX3BhdGNoaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRBdHRyKGtleSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcImRhdGEtdi1cIikpIHJldHVybjtcbiAgICBjb25zdCBoYXMgPSB0aGlzLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgIGxldCB2YWx1ZSA9IGhhcyA/IHRoaXMuZ2V0QXR0cmlidXRlKGtleSkgOiBSRU1PVkFMO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmIChoYXMgJiYgdGhpcy5fbnVtYmVyUHJvcHMgJiYgdGhpcy5fbnVtYmVyUHJvcHNbY2FtZWxLZXldKSB7XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0UHJvcChjYW1lbEtleSwgdmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZ2V0UHJvcChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHNba2V5XTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfc2V0UHJvcChrZXksIHZhbCwgc2hvdWxkUmVmbGVjdCA9IHRydWUsIHNob3VsZFVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHZhbCAhPT0gdGhpcy5fcHJvcHNba2V5XSkge1xuICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgaWYgKHZhbCA9PT0gUkVNT1ZBTCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICAgIGlmIChrZXkgPT09IFwia2V5XCIgJiYgdGhpcy5fYXBwKSB7XG4gICAgICAgICAgdGhpcy5fYXBwLl9jZVZOb2RlLmtleSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiB0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZWZsZWN0KSB7XG4gICAgICAgIGNvbnN0IG9iID0gdGhpcy5fb2I7XG4gICAgICAgIGlmIChvYikge1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMob2IudGFrZVJlY29yZHMoKSk7XG4gICAgICAgICAgb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSksIHZhbCArIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWwpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgICAgb2IgJiYgb2Iub2JzZXJ2ZSh0aGlzLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF91cGRhdGUoKSB7XG4gICAgY29uc3Qgdm5vZGUgPSB0aGlzLl9jcmVhdGVWTm9kZSgpO1xuICAgIGlmICh0aGlzLl9hcHApIHZub2RlLmFwcENvbnRleHQgPSB0aGlzLl9hcHAuX2NvbnRleHQ7XG4gICAgcmVuZGVyKHZub2RlLCB0aGlzLl9yb290KTtcbiAgfVxuICBfY3JlYXRlVk5vZGUoKSB7XG4gICAgY29uc3QgYmFzZVByb3BzID0ge307XG4gICAgaWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgIGJhc2VQcm9wcy5vblZub2RlTW91bnRlZCA9IGJhc2VQcm9wcy5vblZub2RlVXBkYXRlZCA9IHRoaXMuX3JlbmRlclNsb3RzLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUodGhpcy5fZGVmLCBleHRlbmQoYmFzZVByb3BzLCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmNlID0gdGhpcztcbiAgICAgICAgaW5zdGFuY2UuaXNDRSA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgaW5zdGFuY2UuY2VSZWxvYWQgPSAobmV3U3R5bGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3R5bGVzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5mb3JFYWNoKChzKSA9PiB0aGlzLl9yb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zdHlsZUFuY2hvcnMuZGVsZXRlKHRoaXMuX2RlZik7XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChcbiAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgIGlzUGxhaW5PYmplY3QoYXJnc1swXSkgPyBleHRlbmQoeyBkZXRhaWw6IGFyZ3MgfSwgYXJnc1swXSkgOiB7IGRldGFpbDogYXJncyB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50KCk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcywgb3duZXIsIHBhcmVudENvbXApIHtcbiAgICBpZiAoIXN0eWxlcykgcmV0dXJuO1xuICAgIGlmIChvd25lcikge1xuICAgICAgaWYgKG93bmVyID09PSB0aGlzLl9kZWYgfHwgdGhpcy5fc3R5bGVDaGlsZHJlbi5oYXMob3duZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0eWxlQ2hpbGRyZW4uYWRkKG93bmVyKTtcbiAgICB9XG4gICAgY29uc3Qgbm9uY2UgPSB0aGlzLl9ub25jZTtcbiAgICBjb25zdCByb290ID0gdGhpcy5zaGFkb3dSb290O1xuICAgIGNvbnN0IGluc2VydGlvbkFuY2hvciA9IHBhcmVudENvbXAgPyB0aGlzLl9nZXRTdHlsZUFuY2hvcihwYXJlbnRDb21wKSB8fCB0aGlzLl9nZXRTdHlsZUFuY2hvcih0aGlzLl9kZWYpIDogdGhpcy5fZ2V0Um9vdFN0eWxlSW5zZXJ0aW9uQW5jaG9yKHJvb3QpO1xuICAgIGxldCBsYXN0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gc3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgaWYgKG5vbmNlKSBzLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgICAgIHMudGV4dENvbnRlbnQgPSBzdHlsZXNbaV07XG4gICAgICByb290Lmluc2VydEJlZm9yZShzLCBsYXN0IHx8IGluc2VydGlvbkFuY2hvcik7XG4gICAgICBsYXN0ID0gcztcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGlmICghcGFyZW50Q29tcCkgdGhpcy5fc3R5bGVBbmNob3JzLnNldCh0aGlzLl9kZWYsIHMpO1xuICAgICAgICBpZiAob3duZXIpIHRoaXMuX3N0eWxlQW5jaG9ycy5zZXQob3duZXIsIHMpO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgICAgaWYgKG93bmVyLl9faG1ySWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2hpbGRTdHlsZXMpIHRoaXMuX2NoaWxkU3R5bGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMuX2NoaWxkU3R5bGVzLmdldChvd25lci5fX2htcklkKTtcbiAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY2hpbGRTdHlsZXMuc2V0KG93bmVyLl9faG1ySWQsIGVudHJ5ID0gW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkucHVzaChzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHRoaXMuX3N0eWxlcyB8fCAodGhpcy5fc3R5bGVzID0gW10pKS5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9nZXRTdHlsZUFuY2hvcihjb21wKSB7XG4gICAgaWYgKCFjb21wKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5fc3R5bGVBbmNob3JzLmdldChjb21wKTtcbiAgICBpZiAoYW5jaG9yICYmIGFuY2hvci5wYXJlbnROb2RlID09PSB0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBhbmNob3I7XG4gICAgfVxuICAgIGlmIChhbmNob3IpIHtcbiAgICAgIHRoaXMuX3N0eWxlQW5jaG9ycy5kZWxldGUoY29tcCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIF9nZXRSb290U3R5bGVJbnNlcnRpb25BbmNob3Iocm9vdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcm9vdC5jaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxTdHlsZUVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogT25seSBjYWxsZWQgd2hlbiBzaGFkb3dSb290IGlzIGZhbHNlXG4gICAqL1xuICBfcGFyc2VTbG90cygpIHtcbiAgICBjb25zdCBzbG90cyA9IHRoaXMuX3Nsb3RzID0ge307XG4gICAgbGV0IG47XG4gICAgd2hpbGUgKG4gPSB0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGNvbnN0IHNsb3ROYW1lID0gbi5ub2RlVHlwZSA9PT0gMSAmJiBuLmdldEF0dHJpYnV0ZShcInNsb3RcIikgfHwgXCJkZWZhdWx0XCI7XG4gICAgICAoc2xvdHNbc2xvdE5hbWVdIHx8IChzbG90c1tzbG90TmFtZV0gPSBbXSkpLnB1c2gobik7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKG4pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogT25seSBjYWxsZWQgd2hlbiBzaGFkb3dSb290IGlzIGZhbHNlXG4gICAqL1xuICBfcmVuZGVyU2xvdHMoKSB7XG4gICAgY29uc3Qgb3V0bGV0cyA9IHRoaXMuX2dldFNsb3RzKCk7XG4gICAgY29uc3Qgc2NvcGVJZCA9IHRoaXMuX2luc3RhbmNlLnR5cGUuX19zY29wZUlkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbyA9IG91dGxldHNbaV07XG4gICAgICBjb25zdCBzbG90TmFtZSA9IG8uZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcImRlZmF1bHRcIjtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9zbG90c1tzbG90TmFtZV07XG4gICAgICBjb25zdCBwYXJlbnQgPSBvLnBhcmVudE5vZGU7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgY29udGVudCkge1xuICAgICAgICAgIGlmIChzY29wZUlkICYmIG4ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2NvcGVJZCArIFwiLXNcIjtcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobiwgMSk7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gICAgICAgICAgICBsZXQgY2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAoY2hpbGQgPSB3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG4sIG8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoby5maXJzdENoaWxkKSBwYXJlbnQuaW5zZXJ0QmVmb3JlKG8uZmlyc3RDaGlsZCwgbyk7XG4gICAgICB9XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRTbG90cygpIHtcbiAgICBjb25zdCByb290cyA9IFt0aGlzXTtcbiAgICBpZiAodGhpcy5fdGVsZXBvcnRUYXJnZXRzKSB7XG4gICAgICByb290cy5wdXNoKC4uLnRoaXMuX3RlbGVwb3J0VGFyZ2V0cyk7XG4gICAgfVxuICAgIGNvbnN0IHNsb3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKFwic2xvdFwiKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2xvdHMuYWRkKGZvdW5kW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2xvdHMpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pbmplY3RDaGlsZFN0eWxlKGNvbXAsIHBhcmVudENvbXApIHtcbiAgICB0aGlzLl9hcHBseVN0eWxlcyhjb21wLnN0eWxlcywgY29tcCwgcGFyZW50Q29tcCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2JlZ2luUGF0Y2goKSB7XG4gICAgdGhpcy5fcGF0Y2hpbmcgPSB0cnVlO1xuICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2VuZFBhdGNoKCkge1xuICAgIHRoaXMuX3BhdGNoaW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2RpcnR5ICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2hhc1NoYWRvd1Jvb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFkb3dSb290ICE9PSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfcmVtb3ZlQ2hpbGRTdHlsZShjb21wKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHRoaXMuX3N0eWxlQ2hpbGRyZW4uZGVsZXRlKGNvbXApO1xuICAgICAgdGhpcy5fc3R5bGVBbmNob3JzLmRlbGV0ZShjb21wKTtcbiAgICAgIGlmICh0aGlzLl9jaGlsZFN0eWxlcyAmJiBjb21wLl9faG1ySWQpIHtcbiAgICAgICAgY29uc3Qgb2xkU3R5bGVzID0gdGhpcy5fY2hpbGRTdHlsZXMuZ2V0KGNvbXAuX19obXJJZCk7XG4gICAgICAgIGlmIChvbGRTdHlsZXMpIHtcbiAgICAgICAgICBvbGRTdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5fcm9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgb2xkU3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZUhvc3QoY2FsbGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGNvbnN0IGVsID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY2U7XG4gIGlmIChlbCkge1xuICAgIHJldHVybiBlbDtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYCR7Y2FsbGVyIHx8IFwidXNlSG9zdFwifSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGAke2NhbGxlciB8fCBcInVzZUhvc3RcIn0gY2FuIG9ubHkgYmUgdXNlZCBpbiBjb21wb25lbnRzIGRlZmluZWQgdmlhIGRlZmluZUN1c3RvbUVsZW1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTaGFkb3dSb290KCkge1xuICBjb25zdCBlbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB1c2VIb3N0KFwidXNlU2hhZG93Um9vdFwiKSA6IHVzZUhvc3QoKTtcbiAgcmV0dXJuIGVsICYmIGVsLnNoYWRvd1Jvb3Q7XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfbW92ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmNvbnN0IGRlY29yYXRlID0gKHQpID0+IHtcbiAgZGVsZXRlIHQucHJvcHMubW9kZTtcbiAgcmV0dXJuIHQ7XG59O1xuY29uc3QgVHJhbnNpdGlvbkdyb3VwSW1wbCA9IC8qIEBfX1BVUkVfXyAqLyBkZWNvcmF0ZSh7XG4gIG5hbWU6IFwiVHJhbnNpdGlvbkdyb3VwXCIsXG4gIHByb3BzOiAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHt9LCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCB7XG4gICAgdGFnOiBTdHJpbmcsXG4gICAgbW92ZUNsYXNzOiBTdHJpbmdcbiAgfSksXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gdXNlVHJhbnNpdGlvblN0YXRlKCk7XG4gICAgbGV0IHByZXZDaGlsZHJlbjtcbiAgICBsZXQgY2hpbGRyZW47XG4gICAgb25VcGRhdGVkKCgpID0+IHtcbiAgICAgIGlmICghcHJldkNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlQ2xhc3MgPSBwcm9wcy5tb3ZlQ2xhc3MgfHwgYCR7cHJvcHMubmFtZSB8fCBcInZcIn0tbW92ZWA7XG4gICAgICBpZiAoIWhhc0NTU1RyYW5zZm9ybShcbiAgICAgICAgcHJldkNoaWxkcmVuWzBdLmVsLFxuICAgICAgICBpbnN0YW5jZS52bm9kZS5lbCxcbiAgICAgICAgbW92ZUNsYXNzXG4gICAgICApKSB7XG4gICAgICAgIHByZXZDaGlsZHJlbiA9IFtdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KGluc3RhbmNlLnZub2RlLmVsKTtcbiAgICAgIG1vdmVkQ2hpbGRyZW4uZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGMuZWw7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2IgPSBlbFttb3ZlQ2JLZXldID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlIHx8IGUucHJvcGVydHlOYW1lLmVuZHNXaXRoKFwidHJhbnNmb3JtXCIpKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBjYik7XG4gICAgICAgICAgICBlbFttb3ZlQ2JLZXldID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgIH0pO1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKGNoaWxkLmVsICYmIGNoaWxkLmVsIGluc3RhbmNlb2YgRWxlbWVudCAmJiAvLyBIaWRkZW4gdi1zaG93IG5vZGVzIGhhdmUgbm8gcHJldmlvdXMgbGF5b3V0IGJveCB0byBhbmltYXRlIGZyb20uXG4gICAgICAgICAgIWNoaWxkLmVsW3ZTaG93SGlkZGVuXSkge1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uUHJvcHMsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChjaGlsZCwgZ2V0UG9zaXRpb24oY2hpbGQuZWwpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCA/IGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCkpIDogW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhjaGlsZCwgY3NzVHJhbnNpdGlvblByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoaWxkLnR5cGUgIT09IFRleHQpIHtcbiAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfTtcbiAgfVxufSk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICBjb25zdCBlbCA9IGMuZWw7XG4gIGlmIChlbFttb3ZlQ2JLZXldKSB7XG4gICAgZWxbbW92ZUNiS2V5XSgpO1xuICB9XG4gIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgIGVsW2VudGVyQ2JLZXldKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgbmV3UG9zaXRpb25NYXAuc2V0KGMsIGdldFBvc2l0aW9uKGMuZWwpKTtcbn1cbmZ1bmN0aW9uIGFwcGx5VHJhbnNsYXRpb24oYykge1xuICBjb25zdCBvbGRQb3MgPSBwb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IG5ld1BvcyA9IG5ld1Bvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgZHggPSBvbGRQb3MubGVmdCAtIG5ld1Bvcy5sZWZ0O1xuICBjb25zdCBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wO1xuICBpZiAoZHggfHwgZHkpIHtcbiAgICBjb25zdCBlbCA9IGMuZWw7XG4gICAgY29uc3QgcyA9IGVsLnN0eWxlO1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgc2NhbGVYID0gMTtcbiAgICBsZXQgc2NhbGVZID0gMTtcbiAgICBpZiAoZWwub2Zmc2V0V2lkdGgpIHNjYWxlWCA9IHJlY3Qud2lkdGggLyBlbC5vZmZzZXRXaWR0aDtcbiAgICBpZiAoZWwub2Zmc2V0SGVpZ2h0KSBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsLm9mZnNldEhlaWdodDtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzY2FsZVgpIHx8IHNjYWxlWCA9PT0gMCkgc2NhbGVYID0gMTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzY2FsZVkpIHx8IHNjYWxlWSA9PT0gMCkgc2NhbGVZID0gMTtcbiAgICBpZiAoTWF0aC5hYnMoc2NhbGVYIC0gMSkgPCAwLjAxKSBzY2FsZVggPSAxO1xuICAgIGlmIChNYXRoLmFicyhzY2FsZVkgLSAxKSA8IDAuMDEpIHNjYWxlWSA9IDE7XG4gICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeCAvIHNjYWxlWH1weCwke2R5IC8gc2NhbGVZfXB4KWA7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSBcIjBzXCI7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGVsKSB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgdG9wOiByZWN0LnRvcFxuICB9O1xufVxuZnVuY3Rpb24gaGFzQ1NTVHJhbnNmb3JtKGVsLCByb290LCBtb3ZlQ2xhc3MpIHtcbiAgY29uc3QgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTtcbiAgY29uc3QgX3Z0YyA9IGVsW3Z0Y0tleV07XG4gIGlmIChfdnRjKSB7XG4gICAgX3Z0Yy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICAgIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gICAgfSk7XG4gIH1cbiAgbW92ZUNsYXNzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgY2xvbmUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICBjb25zdCBjb250YWluZXIgPSByb290Lm5vZGVUeXBlID09PSAxID8gcm9vdCA6IHJvb3QucGFyZW50Tm9kZTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgY29uc3QgeyBoYXNUcmFuc2Zvcm0gfSA9IGdldFRyYW5zaXRpb25JbmZvKGNsb25lKTtcbiAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgcmV0dXJuIGhhc1RyYW5zZm9ybTtcbn1cblxuY29uc3QgZ2V0TW9kZWxBc3NpZ25lciA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCBmbiA9IHZub2RlLnByb3BzW1wib25VcGRhdGU6bW9kZWxWYWx1ZVwiXSB8fCBmYWxzZTtcbiAgcmV0dXJuIGlzQXJyYXkoZm4pID8gKHZhbHVlKSA9PiBpbnZva2VBcnJheUZucyhmbiwgdmFsdWUpIDogZm47XG59O1xuZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0KGUpIHtcbiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25FbmQoZSkge1xuICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgaWYgKHRhcmdldC5jb21wb3NpbmcpIHtcbiAgICB0YXJnZXQuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICB9XG59XG5jb25zdCBhc3NpZ25LZXkgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKFwiX2Fzc2lnblwiKTtcbmNvbnN0IGluaXRpYWxWYWx1ZUtleSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJfaW5pdGlhbFZhbHVlXCIpO1xuZnVuY3Rpb24gY2FzdFZhbHVlKHZhbHVlLCB0cmltLCBudW1iZXIpIHtcbiAgaWYgKHRyaW0pIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICBpZiAobnVtYmVyKSB2YWx1ZSA9IGxvb3NlVG9OdW1iZXIodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICBjcmVhdGVkKGVsLCB7IG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoZWwudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgZWxbaW5pdGlhbFZhbHVlS2V5XSA9IGVsLmRlZmF1bHRWYWx1ZS5yZXBsYWNlKC9bXFxyXFxuXS9nLCBcIlwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgIGVsW2luaXRpYWxWYWx1ZUtleV0gPSBlbC5kZWZhdWx0VmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGNvbnN0IGNhc3RUb051bWJlciA9IG51bWJlciB8fCB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSBcIm51bWJlclwiO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyBcImNoYW5nZVwiIDogXCJpbnB1dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZykgcmV0dXJuO1xuICAgICAgZWxbYXNzaWduS2V5XShjYXN0VmFsdWUoZWwudmFsdWUsIHRyaW0sIGNhc3RUb051bWJlcikpO1xuICAgIH0pO1xuICAgIGlmICh0cmltIHx8IGNhc3RUb051bWJlcikge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBlbC52YWx1ZSA9IGNhc3RWYWx1ZShlbC52YWx1ZSwgdHJpbSwgY2FzdFRvTnVtYmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWxhenkpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgIH1cbiAgfSxcbiAgLy8gc2V0IHZhbHVlIG9uIG1vdW50ZWQgc28gaXQncyBhZnRlciBtaW4vbWF4IGZvciB0eXBlPVwicmFuZ2VcIlxuICBtb3VudGVkKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgdHJpbSwgbnVtYmVyIH0gfSkge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBlbFtpbml0aWFsVmFsdWVLZXldO1xuICAgIGRlbGV0ZSBlbFtpbml0aWFsVmFsdWVLZXldO1xuICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHZvaWQgMCAmJiAoZWwudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZWwudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSAmJiBlbC52YWx1ZSAhPT0gaW5pdGlhbFZhbHVlKSB7XG4gICAgICBlbFthc3NpZ25LZXldKGNhc3RWYWx1ZShlbC52YWx1ZSwgdHJpbSwgbnVtYmVyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlLCBtb2RpZmllcnM6IHsgbGF6eSwgdHJpbSwgbnVtYmVyIH0gfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKGVsLmNvbXBvc2luZykgcmV0dXJuO1xuICAgIGNvbnN0IGVsVmFsdWUgPSAobnVtYmVyIHx8IGVsLnR5cGUgPT09IFwibnVtYmVyXCIpICYmICEvXjBcXGQvLnRlc3QoZWwudmFsdWUpID8gbG9vc2VUb051bWJlcihlbC52YWx1ZSkgOiBlbC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKGVsVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWwuZ2V0Um9vdE5vZGUoKTtcbiAgICBpZiAoKHJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgcm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSAmJiByb290Tm9kZS5hY3RpdmVFbGVtZW50ID09PSBlbCAmJiBlbC50eXBlICE9PSBcInJhbmdlXCIpIHtcbiAgICAgIGlmIChsYXp5ICYmIHZhbHVlID09PSBvbGRWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHJpbSAmJiBlbC52YWx1ZS50cmltKCkgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxufTtcbmNvbnN0IHZNb2RlbENoZWNrYm94ID0ge1xuICAvLyAjNDA5NiBhcnJheSBjaGVja2JveGVzIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgXywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IGVsLl9tb2RlbFZhbHVlO1xuICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gZ2V0VmFsdWUoZWwpO1xuICAgICAgY29uc3QgY2hlY2tlZCA9IGVsLmNoZWNrZWQ7XG4gICAgICBjb25zdCBhc3NpZ24gPSBlbFthc3NpZ25LZXldO1xuICAgICAgaWYgKGlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsb29zZUluZGV4T2YobW9kZWxWYWx1ZSwgZWxlbWVudFZhbHVlKTtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpbmRleCAhPT0gLTE7XG4gICAgICAgIGlmIChjaGVja2VkICYmICFmb3VuZCkge1xuICAgICAgICAgIGFzc2lnbihtb2RlbFZhbHVlLmNvbmNhdChlbGVtZW50VmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICghY2hlY2tlZCAmJiBmb3VuZCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gWy4uLm1vZGVsVmFsdWVdO1xuICAgICAgICAgIGZpbHRlcmVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgYXNzaWduKGZpbHRlcmVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1NldChtb2RlbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBuZXcgU2V0KG1vZGVsVmFsdWUpO1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNsb25lZC5hZGQoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbG9uZWQuZGVsZXRlKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduKGNsb25lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NpZ24oZ2V0Q2hlY2tib3hWYWx1ZShlbCwgY2hlY2tlZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAvLyBzZXQgaW5pdGlhbCBjaGVja2VkIG9uIG1vdW50IHRvIHdhaXQgZm9yIHRydWUtdmFsdWUvZmFsc2UtdmFsdWVcbiAgbW91bnRlZDogc2V0Q2hlY2tlZCxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBzZXRDaGVja2VkKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gIH1cbn07XG5mdW5jdGlvbiBzZXRDaGVja2VkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB2bm9kZSkge1xuICBlbC5fbW9kZWxWYWx1ZSA9IHZhbHVlO1xuICBsZXQgY2hlY2tlZDtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgY2hlY2tlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTE7XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgY2hlY2tlZCA9IHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSBvbGRWYWx1ZSkgcmV0dXJuO1xuICAgIGNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCBnZXRDaGVja2JveFZhbHVlKGVsLCB0cnVlKSk7XG4gIH1cbiAgaWYgKGVsLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcbiAgICBlbC5jaGVja2VkID0gY2hlY2tlZDtcbiAgfVxufVxuY29uc3Qgdk1vZGVsUmFkaW8gPSB7XG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBlbFthc3NpZ25LZXldKGdldFZhbHVlKGVsKSk7XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gIC8vIDxzZWxlY3QgbXVsdGlwbGU+IHZhbHVlIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZCkubWFwKFxuICAgICAgICAobykgPT4gbnVtYmVyID8gbG9vc2VUb051bWJlcihnZXRWYWx1ZShvKSkgOiBnZXRWYWx1ZShvKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG11bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gICAgICBjb25zdCBhc3NpZ25lZFZhbHVlID0gbXVsdGlwbGUgPyBpc1NldChlbC5fbW9kZWxWYWx1ZSkgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKSA6IHNlbGVjdGVkVmFsIDogc2VsZWN0ZWRWYWxbMF07XG4gICAgICBjb25zdCBwZW5kaW5nID0gZWwuX3BlbmRpbmdWYWx1ZSA9IFtcbiAgICAgICAgbXVsdGlwbGUsXG4gICAgICAgIG11bHRpcGxlID8gaXNBcnJheShhc3NpZ25lZFZhbHVlKSA/IHNlbGVjdGVkVmFsLnNsaWNlKCkgOiBzZWxlY3RlZFZhbCA6IGFzc2lnbmVkVmFsdWVcbiAgICAgIF07XG4gICAgICB0cnkge1xuICAgICAgICBlbFthc3NpZ25LZXldKGFzc2lnbmVkVmFsdWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGlmIChlbC5fcGVuZGluZ1ZhbHVlID09PSBwZW5kaW5nKSB7XG4gICAgICAgICAgICBlbC5fcGVuZGluZ1ZhbHVlID0gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gIC8vIDxvcHRpb24+cy5cbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBlbC5fcGVuZGluZ1ZhbHVlO1xuICAgIGVsLl9wZW5kaW5nVmFsdWUgPSB2b2lkIDA7XG4gICAgaWYgKCFwZW5kaW5nIHx8IHBlbmRpbmdbMF0gIT09IGVsLm11bHRpcGxlIHx8ICFpc1NhbWVTZWxlY3RWYWx1ZSh2YWx1ZSwgcGVuZGluZ1sxXSwgcGVuZGluZ1swXSkpIHtcbiAgICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gaXNTYW1lU2VsZWN0VmFsdWUodmFsdWUsIGFzc2lnbmVkVmFsdWUsIG11bHRpcGxlKSB7XG4gIGlmICghbXVsdGlwbGUpIHJldHVybiBsb29zZUVxdWFsKHZhbHVlLCBhc3NpZ25lZFZhbHVlKTtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gbG9vc2VFcXVhbCh2YWx1ZSwgYXNzaWduZWRWYWx1ZSk7XG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUuc2l6ZSAhPT0gYXNzaWduZWRWYWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXNzaWduZWRWYWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZS5oYXMoaXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKSB7XG4gIGNvbnN0IGlzTXVsdGlwbGUgPSBlbC5tdWx0aXBsZTtcbiAgY29uc3QgaXNBcnJheVZhbHVlID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc011bHRpcGxlICYmICFpc0FycmF5VmFsdWUgJiYgIWlzU2V0KHZhbHVlKSkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgIGA8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw+IGV4cGVjdHMgYW4gQXJyYXkgb3IgU2V0IHZhbHVlIGZvciBpdHMgYmluZGluZywgYnV0IGdvdCAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpfS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBlbC5vcHRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07XG4gICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnZXRWYWx1ZShvcHRpb24pO1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvblR5cGUgPSB0eXBlb2Ygb3B0aW9uVmFsdWU7XG4gICAgICAgIGlmIChvcHRpb25UeXBlID09PSBcInN0cmluZ1wiIHx8IG9wdGlvblR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZS5zb21lKCh2KSA9PiBTdHJpbmcodikgPT09IFN0cmluZyhvcHRpb25WYWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgb3B0aW9uVmFsdWUpID4gLTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlLmhhcyhvcHRpb25WYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsb29zZUVxdWFsKGdldFZhbHVlKG9wdGlvbiksIHZhbHVlKSkge1xuICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzTXVsdGlwbGUgJiYgZWwuc2VsZWN0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICBlbC5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFZhbHVlKGVsKSB7XG4gIHJldHVybiBcIl92YWx1ZVwiIGluIGVsID8gZWwuX3ZhbHVlIDogZWwudmFsdWU7XG59XG5mdW5jdGlvbiBnZXRDaGVja2JveFZhbHVlKGVsLCBjaGVja2VkKSB7XG4gIGNvbnN0IGtleSA9IGNoZWNrZWQgPyBcIl90cnVlVmFsdWVcIiA6IFwiX2ZhbHNlVmFsdWVcIjtcbiAgcmV0dXJuIGtleSBpbiBlbCA/IGVsW2tleV0gOiBjaGVja2VkO1xufVxuY29uc3Qgdk1vZGVsRHluYW1pYyA9IHtcbiAgY3JlYXRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgbnVsbCwgXCJjcmVhdGVkXCIpO1xuICB9LFxuICBtb3VudGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcIm1vdW50ZWRcIik7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIFwiYmVmb3JlVXBkYXRlXCIpO1xuICB9LFxuICB1cGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJ1cGRhdGVkXCIpO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNNb2RlbCh0YWdOYW1lLCB0eXBlKSB7XG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIGNhc2UgXCJTRUxFQ1RcIjpcbiAgICAgIHJldHVybiB2TW9kZWxTZWxlY3Q7XG4gICAgY2FzZSBcIlRFWFRBUkVBXCI6XG4gICAgICByZXR1cm4gdk1vZGVsVGV4dDtcbiAgICBkZWZhdWx0OlxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgIHJldHVybiB2TW9kZWxDaGVja2JveDtcbiAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFJhZGlvO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBob29rKSB7XG4gIGNvbnN0IG1vZGVsVG9Vc2UgPSByZXNvbHZlRHluYW1pY01vZGVsKFxuICAgIGVsLnRhZ05hbWUsXG4gICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICApO1xuICBjb25zdCBmbiA9IG1vZGVsVG9Vc2VbaG9va107XG4gIGZuICYmIGZuKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKTtcbn1cbmZ1bmN0aW9uIGluaXRWTW9kZWxGb3JTU1IoKSB7XG4gIHZNb2RlbFRleHQuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiAoeyB2YWx1ZSB9KTtcbiAgdk1vZGVsUmFkaW8uZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5wcm9wcyAmJiBsb29zZUVxdWFsKHZub2RlLnByb3BzLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICB9XG4gIH07XG4gIHZNb2RlbENoZWNrYm94LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSwgdm5vZGUpID0+IHtcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2bm9kZS5wcm9wcyAmJiBsb29zZUluZGV4T2YodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICB9XG4gIH07XG4gIHZNb2RlbER5bmFtaWMuZ2V0U1NSUHJvcHMgPSAoYmluZGluZywgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZub2RlLnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgICAvLyByZXNvbHZlRHluYW1pY01vZGVsIGV4cGVjdHMgYW4gdXBwZXJjYXNlIHRhZyBuYW1lLCBidXQgdm5vZGUudHlwZSBpcyBsb3dlcmNhc2VcbiAgICAgIHZub2RlLnR5cGUudG9VcHBlckNhc2UoKSxcbiAgICAgIHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGVcbiAgICApO1xuICAgIGlmIChtb2RlbFRvVXNlLmdldFNTUlByb3BzKSB7XG4gICAgICByZXR1cm4gbW9kZWxUb1VzZS5nZXRTU1JQcm9wcyhiaW5kaW5nLCB2bm9kZSk7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBzeXN0ZW1Nb2RpZmllcnMgPSBbXCJjdHJsXCIsIFwic2hpZnRcIiwgXCJhbHRcIiwgXCJtZXRhXCJdO1xuY29uc3QgbW9kaWZpZXJHdWFyZHMgPSB7XG4gIHN0b3A6IChlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpLFxuICBwcmV2ZW50OiAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpLFxuICBzZWxmOiAoZSkgPT4gZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCxcbiAgY3RybDogKGUpID0+ICFlLmN0cmxLZXksXG4gIHNoaWZ0OiAoZSkgPT4gIWUuc2hpZnRLZXksXG4gIGFsdDogKGUpID0+ICFlLmFsdEtleSxcbiAgbWV0YTogKGUpID0+ICFlLm1ldGFLZXksXG4gIGxlZnQ6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDAsXG4gIG1pZGRsZTogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMSxcbiAgcmlnaHQ6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDIsXG4gIGV4YWN0OiAoZSwgbW9kaWZpZXJzKSA9PiBzeXN0ZW1Nb2RpZmllcnMuc29tZSgobSkgPT4gZVtgJHttfUtleWBdICYmICFtb2RpZmllcnMuaW5jbHVkZXMobSkpXG59O1xuY29uc3Qgd2l0aE1vZGlmaWVycyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gIGlmICghZm4pIHJldHVybiBmbjtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9ICgoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZ3VhcmQgPSBtb2RpZmllckd1YXJkc1ttb2RpZmllcnNbaV1dO1xuICAgICAgaWYgKGd1YXJkICYmIGd1YXJkKGV2ZW50LCBtb2RpZmllcnMpKSByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBmbihldmVudCwgLi4uYXJncyk7XG4gIH0pKTtcbn07XG5jb25zdCBrZXlOYW1lcyA9IHtcbiAgZXNjOiBcImVzY2FwZVwiLFxuICBzcGFjZTogXCIgXCIsXG4gIHVwOiBcImFycm93LXVwXCIsXG4gIGxlZnQ6IFwiYXJyb3ctbGVmdFwiLFxuICByaWdodDogXCJhcnJvdy1yaWdodFwiLFxuICBkb3duOiBcImFycm93LWRvd25cIixcbiAgZGVsZXRlOiBcImJhY2tzcGFjZVwiXG59O1xuY29uc3Qgd2l0aEtleXMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGZuLl93aXRoS2V5cyB8fCAoZm4uX3dpdGhLZXlzID0ge30pO1xuICBjb25zdCBjYWNoZUtleSA9IG1vZGlmaWVycy5qb2luKFwiLlwiKTtcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSB8fCAoY2FjaGVbY2FjaGVLZXldID0gKChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKFxuICAgICAgKGspID0+IGsgPT09IGV2ZW50S2V5IHx8IGtleU5hbWVzW2tdID09PSBldmVudEtleVxuICAgICkpIHtcbiAgICAgIHJldHVybiBmbihldmVudCk7XG4gICAgfVxuICB9KSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKCguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZVJlbmRlcmVyKCkucmVuZGVyKC4uLmFyZ3MpO1xufSk7XG5jb25zdCBoeWRyYXRlID0gKCguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn0pO1xuY29uc3QgY3JlYXRlQXBwID0gKCguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGVuc3VyZVJlbmRlcmVyKCkuY3JlYXRlQXBwKC4uLmFyZ3MpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCk7XG4gICAgaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKTtcbiAgfVxuICBjb25zdCB7IG1vdW50IH0gPSBhcHA7XG4gIGFwcC5tb3VudCA9IChjb250YWluZXJPclNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lck9yU2VsZWN0b3IpO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgY29tcG9uZW50ID0gYXBwLl9jb21wb25lbnQ7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5yZW5kZXIgJiYgIWNvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgcHJveHkgPSBtb3VudChjb250YWluZXIsIGZhbHNlLCByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpKTtcbiAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcInYtY2xvYWtcIik7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS12LWFwcFwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xuICByZXR1cm4gYXBwO1xufSk7XG5jb25zdCBjcmVhdGVTU1JBcHAgPSAoKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufSk7XG5mdW5jdGlvbiByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJzdmdcIjtcbiAgfVxuICBpZiAodHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBjb250YWluZXIgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwibWF0aG1sXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc05hdGl2ZVRhZ1wiLCB7XG4gICAgdmFsdWU6ICh0YWcpID0+IGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHVGFnKHRhZykgfHwgaXNNYXRoTUxUYWcodGFnKSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG59XG5mdW5jdGlvbiBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApIHtcbiAgaWYgKGlzUnVudGltZU9ubHkoKSkge1xuICAgIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGFwcC5jb25maWcuaXNDdXN0b21FbGVtZW50O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzQ3VzdG9tRWxlbWVudFwiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpc0N1c3RvbUVsZW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBUaGUgXFxgaXNDdXN0b21FbGVtZW50XFxgIGNvbmZpZyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFxcYGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnRcXGAgaW5zdGVhZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gYXBwLmNvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgY29uc3QgbXNnID0gYFRoZSBcXGBjb21waWxlck9wdGlvbnNcXGAgY29uZmlnIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlLmpzIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIgKGFrYSBcImZ1bGwgYnVpbGRcIikuIFNpbmNlIHlvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCwgXFxgY29tcGlsZXJPcHRpb25zXFxgIG11c3QgYmUgcGFzc2VkIHRvIFxcYEB2dWUvY29tcGlsZXItZG9tXFxgIGluIHRoZSBidWlsZCBzZXR1cCBpbnN0ZWFkLlxuLSBGb3IgdnVlLWxvYWRlcjogcGFzcyBpdCB2aWEgdnVlLWxvYWRlcidzIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBsb2FkZXIgb3B0aW9uLlxuLSBGb3IgdnVlLWNsaTogc2VlIGh0dHBzOi8vY2xpLnZ1ZWpzLm9yZy9ndWlkZS93ZWJwYWNrLmh0bWwjbW9kaWZ5aW5nLW9wdGlvbnMtb2YtYS1sb2FkZXJcbi0gRm9yIHZpdGU6IHBhc3MgaXQgdmlhIEB2aXRlanMvcGx1Z2luLXZ1ZSBvcHRpb25zLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlLXBsdWdpbi12dWUvdHJlZS9tYWluL3BhY2thZ2VzL3BsdWdpbi12dWUjZXhhbXBsZS1mb3ItcGFzc2luZy1vcHRpb25zLXRvLXZ1ZWNvbXBpbGVyLXNmY2A7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiY29tcGlsZXJPcHRpb25zXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICByZXR1cm4gY29tcGlsZXJPcHRpb25zO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChpc1N0cmluZyhjb250YWluZXIpKSB7XG4gICAgY29uc3QgcmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFyZXMpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gbW91bnQgYXBwOiBtb3VudCB0YXJnZXQgc2VsZWN0b3IgXCIke2NvbnRhaW5lcn1cIiByZXR1cm5lZCBudWxsLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyLm1vZGUgPT09IFwiY2xvc2VkXCIpIHtcbiAgICB3YXJuKFxuICAgICAgYG1vdW50aW5nIG9uIGEgU2hhZG93Um9vdCB3aXRoIFxcYHttb2RlOiBcImNsb3NlZFwifVxcYCBtYXkgbGVhZCB0byB1bnByZWRpY3RhYmxlIGJ1Z3NgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29udGFpbmVyO1xufVxubGV0IHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gZmFsc2U7XG5jb25zdCBpbml0RGlyZWN0aXZlc0ZvclNTUiA9ICgpID0+IHtcbiAgaWYgKCFzc3JEaXJlY3RpdmVJbml0aWFsaXplZCkge1xuICAgIHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpbml0Vk1vZGVsRm9yU1NSKCk7XG4gICAgaW5pdFZTaG93Rm9yU1NSKCk7XG4gIH1cbn0gO1xuXG5leHBvcnQgeyBUcmFuc2l0aW9uLCBUcmFuc2l0aW9uR3JvdXAsIFZ1ZUVsZW1lbnQsIGNyZWF0ZUFwcCwgY3JlYXRlU1NSQXBwLCBkZWZpbmVDdXN0b21FbGVtZW50LCBkZWZpbmVTU1JDdXN0b21FbGVtZW50LCBoeWRyYXRlLCBpbml0RGlyZWN0aXZlc0ZvclNTUiwgbm9kZU9wcywgcGF0Y2hQcm9wLCByZW5kZXIsIHVzZUNzc01vZHVsZSwgdXNlQ3NzVmFycywgdXNlSG9zdCwgdXNlU2hhZG93Um9vdCwgdk1vZGVsQ2hlY2tib3gsIHZNb2RlbER5bmFtaWMsIHZNb2RlbFJhZGlvLCB2TW9kZWxTZWxlY3QsIHZNb2RlbFRleHQsIHZTaG93LCB3aXRoS2V5cywgd2l0aE1vZGlmaWVycyB9O1xuIiwiLyoqXG4qIHZ1ZSB2My41LjQzXG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBpbml0Q3VzdG9tRm9ybWF0dGVyLCB3YXJuIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcblxuZnVuY3Rpb24gaW5pdERldigpIHtcbiAge1xuICAgIGluaXRDdXN0b21Gb3JtYXR0ZXIoKTtcbiAgfVxufVxuXG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBpbml0RGV2KCk7XG59XG5jb25zdCBjb21waWxlID0gKCkgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgUnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgeyBjb21waWxlIH07XG4iLCJpbXBvcnQgeyBtYXJrUmF3LCB1c2VTbG90cywgQ29tbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZOb2RlQ29udGVudCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUgJiYgYXNBcnJheSh2bm9kZSkuc29tZSh2bm9kZSA9PiB2bm9kZS50eXBlICE9PSBDb21tZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2xvdENvbnRlbnQoc2xvdCwgcHJvcHMgPSB7fSkge1xuICBzbG90ID0gaXNTdHJpbmcoc2xvdCkgPyB1c2VTbG90cygpW3Nsb3RdIDogc2xvdFxuICByZXR1cm4gaGFzVk5vZGVDb250ZW50KHNsb3Q/Lihwcm9wcykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXcodmFsdWUpIHtcbiAgcmV0dXJuIG1hcmtSYXcoeyB2YWx1ZSB9KVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgOnR5cGU9XCJ0eXBlXCJcbiAgOnRpdGxlPVwidGl0bGVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpjbGFzcz1cIltjbGFzc2VzLCB7ICdkaXRvLWJ1dHRvbi0tYWZmaXhlZCc6IGhhc0FmZml4ZXMgfV1cIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbilcbiAgLmRpdG8tYnV0dG9uX19wcmVmaXgoXG4gICAgdi1pZj1cImhhc0FmZml4ZXNcIlxuICApXG4gICAgc2xvdChuYW1lPVwicHJlZml4XCIpXG4gIC5kaXRvLWJ1dHRvbl9fdGV4dChcbiAgICB2LWlmPVwidGV4dCB8fCBoYXNBZmZpeGVzXCJcbiAgKSB7eyB0ZXh0IHx8ICcnIH19XG4gICAgc2xvdFxuICAuZGl0by1idXR0b25fX3N1ZmZpeChcbiAgICB2LWlmPVwiaGFzQWZmaXhlc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBoYXNTbG90Q29udGVudCB9IGZyb20gJy4uL3V0aWxzL3Z1ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdidXR0b24nIH0sXG4gICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBoYXNBZmZpeGVzKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgaGFzU2xvdENvbnRlbnQodGhpcy4kc2xvdHMucHJlZml4KSB8fFxuICAgICAgICBoYXNTbG90Q29udGVudCh0aGlzLiRzbG90cy5zdWZmaXgpXG4gICAgICApXG4gICAgfSxcblxuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kYXR0cnMuY2xhc3NcbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuYnV0dG9uLmRpdG8tYnV0dG9uKFxuICA6dHlwZT1cInR5cGVcIlxuICA6dGl0bGU9XCJ0aXRsZVwiXG4gIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgOmNsYXNzPVwiW2NsYXNzZXMsIHsgJ2RpdG8tYnV0dG9uLS1hZmZpeGVkJzogaGFzQWZmaXhlcyB9XVwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuICAuZGl0by1idXR0b25fX3ByZWZpeChcbiAgICB2LWlmPVwiaGFzQWZmaXhlc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgLmRpdG8tYnV0dG9uX190ZXh0KFxuICAgIHYtaWY9XCJ0ZXh0IHx8IGhhc0FmZml4ZXNcIlxuICApIHt7IHRleHQgfHwgJycgfX1cbiAgICBzbG90XG4gIC5kaXRvLWJ1dHRvbl9fc3VmZml4KFxuICAgIHYtaWY9XCJoYXNBZmZpeGVzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInN1ZmZpeFwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGhhc1Nsb3RDb250ZW50IH0gZnJvbSAnLi4vdXRpbHMvdnVlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2J1dHRvbicgfSxcbiAgICB0ZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGhhc0FmZml4ZXMoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBoYXNTbG90Q29udGVudCh0aGlzLiRzbG90cy5wcmVmaXgpIHx8XG4gICAgICAgIGhhc1Nsb3RDb250ZW50KHRoaXMuJHNsb3RzLnN1ZmZpeClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRhdHRycy5jbGFzc1xuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZURhdGUoZGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHllYXI6IGRhdGU/LmdldEZ1bGxZZWFyKCkgPz8gMCxcbiAgICBtb250aDogZGF0ZT8uZ2V0TW9udGgoKSA/PyAwLFxuICAgIGRheTogZGF0ZT8uZ2V0RGF0ZSgpID8/IDAsXG4gICAgaG91cjogZGF0ZT8uZ2V0SG91cnMoKSA/PyAwLFxuICAgIG1pbnV0ZTogZGF0ZT8uZ2V0TWludXRlcygpID8/IDAsXG4gICAgc2Vjb25kOiBkYXRlPy5nZXRTZWNvbmRzKCkgPz8gMCxcbiAgICBtaWxsaXNlY29uZDogZGF0ZT8uZ2V0TWlsbGlzZWNvbmRzKCkgPz8gMFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbHRlckRhdGUoZGF0ZSwgb3ZlcnJpZGVzID0ge30pIHtcbiAgcmV0dXJuIG5ldyBEYXRlKC4uLk9iamVjdC52YWx1ZXMoeyAuLi5kZXNjcmliZURhdGUoZGF0ZSksIC4uLm92ZXJyaWRlcyB9KSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShzdHJpbmcsIHtcbiAgbG9jYWxlID0gJ2VuLVVTJyxcbiAgZGF0ZSA9IHRydWUsXG4gIHRpbWUgPSB0cnVlXG59ID0ge30pIHtcbiAgY29uc3QgdGltZURlZmF1bHQgPSB0aW1lID8gbnVsbCA6IDBcbiAgLy8gRXh0cmFjdCB0aGUgMTItaG91ciBjbG9jayBwZXJpb2QsIGUuZy4gaW4gZW4tVVMgXCIxMTozMDowMCBBTVwiLlxuICBjb25zdCBwZXJpb2QgPSBzdHJpbmc/Lm1hdGNoKC9cXHMqXFxiKFthcF0pXFwuP21cXC4/JC9pKVxuICBpZiAocGVyaW9kKSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDAsIHBlcmlvZC5pbmRleClcbiAgfVxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKFxuICAgICAgLy8gQW1lcmljYW4gZm9ybWF0OiBNTS9ERC9ZWVlZXG4gICAgICAobG9jYWxlID09PSAnZW4tVVMnICYmIHNlcDEgPT09ICcvJyAmJiBzZXAyID09PSAnLycpIHx8XG4gICAgICAvLyBNb250aCBuYW1lIGZpcnN0LCBlLmcuIGVuLVVTIFwiTWF5IDE0LCAyMDI2XCJcbiAgICAgIChpc05hTigrZGF5KSAmJiAhaXNOYU4oK21vbnRoKSlcbiAgICApIHtcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgaWYgKHBlcmlvZCAmJiBob3VyICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbSA9IHBlcmlvZFsxXS50b0xvd2VyQ2FzZSgpID09PSAncCdcbiAgICAgIGhvdXIgPSAoK2hvdXIgJSAxMikgKyAocG0gPyAxMiA6IDApXG4gICAgICBob3VyID0gU3RyaW5nKGhvdXIpLnBhZFN0YXJ0KDIsICcwJylcbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoXG4gICAgICAgICt5ZWFyLFxuICAgICAgICArbW9udGgsXG4gICAgICAgICtkYXksXG4gICAgICAgICtob3VyLFxuICAgICAgICArbWludXRlLFxuICAgICAgICArc2Vjb25kLFxuICAgICAgICArbWlsbGlzZWNvbmRcbiAgICAgIClcbiAgICAgIC8vIFJlamVjdCBpbnZhbGlkIGRhdGVzLCBpbmNsdWRpbmcgb3V0LW9mLXJhbmdlIHBhcnRzIHRoYXQgYERhdGVgIHdvdWxkXG4gICAgICAvLyByb2xsIG92ZXIsIGUuZy4gZGF5IDQ1LlxuICAgICAgcmV0dXJuIHJlc3VsdC5nZXRNb250aCgpID09PSArbW9udGggJiYgcmVzdWx0LmdldERhdGUoKSA9PT0gK2RheVxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVQYXJ0QXRQb3NpdGlvbihzdHJpbmcsIHBvc2l0aW9uLCB7XG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGRhdGUgPSB0cnVlLFxuICB0aW1lID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlLCB0aW1lIH0pXG5cbiAgY29uc3QgZ2V0UG9zaXRpb24gPSAocG9zaXRpb24sIGxlbmd0aCA9IHBhcnRzLmxlbmd0aCkgPT4ge1xuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IGluZGV4ID0gMFxuICAgIHdoaWxlICgocG9zaXRpb24gPT09IG51bGwgfHwgcG9zIDw9IHBvc2l0aW9uKSAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcG9zICs9IHBhcnRzW2luZGV4KytdPy5sZW5ndGggPz8gMFxuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbjogcG9zLCBpbmRleCB9XG4gIH1cblxuICAvLyBUaW1lIHN0YXJ0cyBhdCBpbmRleCA2LCBkdWUgdG8gdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgZGF0ZS5cbiAgY29uc3Qgb2Zmc2V0ID0gIWRhdGUgPyBnZXRQb3NpdGlvbihudWxsLCA2KS5wb3NpdGlvbiA6IDBcbiAgcG9zaXRpb24gKz0gb2Zmc2V0XG5cbiAgbGV0IHsgaW5kZXggfSA9IGdldFBvc2l0aW9uKHBvc2l0aW9uKVxuXG4gIGNvbnN0IGlzVVMgPSBsb2NhbGUgPT09ICdlbi1VUydcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIGlzVVMgPyAnbW9udGgnIDogJ2RheScsXG4gICAgbnVsbCxcbiAgICBpc1VTID8gJ2RheScgOiAnbW9udGgnLFxuICAgIG51bGwsXG4gICAgJ3llYXInLFxuICAgIG51bGwsXG4gICAgJ2hvdXInLFxuICAgIG51bGwsXG4gICAgJ21pbnV0ZScsXG4gICAgbnVsbCxcbiAgICAnc2Vjb25kJyxcbiAgICBudWxsLFxuICAgICdtaWxsaXNlY29uZCdcbiAgXVxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmICh2YWx1ZXNbaW5kZXhdKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGdldFBvc2l0aW9uKG51bGwsIGluZGV4KS5wb3NpdGlvbiAtIG9mZnNldFxuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYXJ0c1tpbmRleF0ubGVuZ3RoXG4gICAgICByZXR1cm4geyBuYW1lOiB2YWx1ZXNbaW5kZXhdLCBzdGFydCwgZW5kIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlID0gdHJ1ZSwgdGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gc3RyaW5nPy5zcGxpdCgvKFtcXHMuLDovXSspLykgfHwgW11cbiAgaWYgKCFkYXRlKSB7XG4gICAgLy8gQWRkIGR1bW15IGRhdGUgcGFydHMgdG8gbWFrZSBzdXJlIHdlIGdldCBhIHRpbWUtb25seSBkYXRlLlxuICAgIHBhcnRzLnVuc2hpZnQoJzEnLCAnLicsICcxJywgJy4nLCAnMjAwMCcsICcgJylcbiAgfVxuICBpZiAoIXRpbWUgJiYgcGFydHMubGVuZ3RoID4gNSkge1xuICAgIHBhcnRzLmxlbmd0aCA9IDVcbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhJbmRleChtb250aCwgeyBsb2NhbGUgPSAnZW4tVVMnIH0gPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9ICttb250aFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSAtIDFcbiAgfVxuICBjb25zdCBtYXRjaCA9IG1vbnRoLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChtYXRjaC5sZW5ndGggPCAzKSByZXR1cm4gbnVsbFxuICBjb25zdCBzaG9ydEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICBjb25zdCBsb25nRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIGksIDEpXG4gICAgaWYgKFxuICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaCkgfHxcbiAgICAgIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaClcbiAgICApIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyKFxuICByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1sYWJlbD1cIkNob29zZSBkYXRlXCJcbilcbiAgLmRpdG8tY2FsZW5kYXItcG9wdXBcbiAgICAuZGl0by1jYWxlbmRhci1pbm5lclxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ2RheSdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHllYXJcIlxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIlxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2l0Y2ggdG8geWVhciBzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtbW9udGgoXG4gICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU3dpdGNoIHRvIG1vbnRoIHNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ21vbnRoJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IG1vbnRoOiB0cnVlIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBtb250aFwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgeWVhclwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItd2Vla2RheXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwid2Vla2RheSBpbiB3ZWVrZGF5TmFtZXNcIlxuICAgICAgICAgICAgKSB7eyB3ZWVrZGF5LnNob3J0IH19XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItZGF0ZXMocm9sZT1cImdyaWRcIilcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiZGF0ZSBpbiBkYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJkYXRlLnN0YXRlICYmIGBkaXRvLWNhbGVuZGFyLWl0ZW0tJHtkYXRlLnN0YXRlfWBcIlxuICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImRhdGVUb1N0cmluZyhkYXRlLmRhdGUpXCJcbiAgICAgICAgICAgICAgOmFyaWEtc2VsZWN0ZWQ9XCJkYXRlLnN0YXRlID09PSAnYWN0aXZlJ1wiXG4gICAgICAgICAgICAgIDphcmlhLWRpc2FibGVkPVwiZGF0ZS5zdGF0ZSA9PT0gJ2Rpc2FibGVkJ1wiXG4gICAgICAgICAgICAgIEBjbGljaz1cImRhdGUuc3RhdGUgIT09ICdkaXNhYmxlZCcgJiYgc2VsZWN0RGF0ZShkYXRlLmRhdGUpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZS50ZXh0IH19XG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWZvb3RlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgOmFyaWEtbGFiZWw9XCJgU2VsZWN0IHRvZGF5ICgke2RhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKX0pYFwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSlcIlxuICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAnbW9udGgnXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJQcmV2aW91cyB5ZWFyXCJcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2l0Y2ggdG8geWVhciBzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgeWVhclwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzKFxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vbnRoXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cIm1vbnRoLmxvbmdcIlxuICAgICAgICAgICAgICA6YXJpYS1zZWxlY3RlZD1cImdldE1vbnRoQ2xhc3MoaW5kZXgpWydkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJ11cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RNb250aChpbmRleClcIlxuICAgICAgICAgICAgKSB7eyBtb250aC5zaG9ydCB9fVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAneWVhcidcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIGRlY2FkZVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBkZWNhZGVcIlxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXIteWVhcnMoXG4gICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiWWVhclwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cIlN0cmluZyh5ZWFyKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwiZ2V0WWVhckNsYXNzKHllYXIpWydkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJ11cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICkge3sgeWVhciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGRlc2NyaWJlRGF0ZSwgYWx0ZXJEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdzZWxlY3QnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgbW9kZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkYXknIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgd2Vla2RheU5hbWVzLCBtb250aE5hbWVzIH0gPSBnZXRMb2NhbGVOYW1lcyh0aGlzLmxvY2FsZSlcbiAgICByZXR1cm4ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lcyxcbiAgICAgIGRhdGVSYW5nZTogW10sXG4gICAgICB5ZWFyUmFuZ2U6IFtdLFxuICAgICAgY3VycmVudFZhbHVlOiAoXG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSB8fFxuICAgICAgICAvLyBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdXNlIGN1cnJlbnQgZGF0ZSBidXQgY2xlYXIgdGltZSBmaWVsZHM6XG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcywgdXBkYXRlID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gYWx0ZXJEYXRlKHRoaXMuY3VycmVudFZhbHVlLCBvdmVycmlkZXMpXG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0ZXBEZWNhZGUoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiAxMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2V0TW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH0sXG5cbiAgICBzdGVwTW9udGgoc3RlcCkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgeWVhciwgbW9udGggfSA9IHRoaXMuZ2V0WWVhck1vbnRoKFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwXG4gICAgICApXG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5OiBNYXRoLm1pbihcbiAgICAgICAgICB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXREYXRlKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc3RlcFllYXIoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdERhdGUoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlKGRlc2NyaWJlRGF0ZShkYXRlKSwgdHJ1ZSlcbiAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdCcpXG4gICAgfSxcblxuICAgIHNlbGVjdE1vbnRoKG1vbnRoKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAvLyBTZXQgZGF5IHRvIDEgdG8gYXZvaWQgc2VsZWN0aW5nIGEgZGF0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlXG4gICAgICAvLyBuZXcgbW9udGgsIGUuZy4gRmViIDMxIC0+IE1hciAzLlxuICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGgsIGRheTogMSB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBzZWxlY3RZZWFyKHllYXIpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgdGhpcy5zZXREYXRlKHsgeWVhciB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgIHllYXIrK1xuICAgICAgICBtb250aCA9IDBcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG4gICAgICAgIHllYXItLVxuICAgICAgICBtb250aCA9IDExXG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyLCBtb250aCB9XG4gICAgfSxcblxuICAgIGRhdGVUb1N0cmluZyhcbiAgICAgIGRhdGUsXG4gICAgICB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IHsgeWVhcjogdHJ1ZSwgbW9udGg6IHRydWUsIGRheTogdHJ1ZSB9XG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBzdGVwLCBlbnRlciwgbW9kZSA9IHRoaXMuY3VycmVudE1vZGUsIHVwZGF0ZSA9IGZhbHNlIH0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoc3RlcCkge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgZGF5OiBjdXJyZW50VmFsdWUuZ2V0RGF0ZSgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXI6IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZURhdGVSYW5nZSgpIHtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW11cbiAgICAgIHRoaXMueWVhclJhbmdlID0gW11cblxuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgY29uc3QgbW9udGggPSBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlLnB1c2goc3RhcnRZZWFyICsgaSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICBsZXQgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG4gICAgICAgIGZpcnN0RGF5V2VlayA9IDdcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggLSAxKVxuICAgICAgICBjb25zdCBwcmV2TW9udGhOdW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aChcbiAgICAgICAgICBwcmV2TW9udGgueWVhcixcbiAgICAgICAgICBwcmV2TW9udGgubW9udGhcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpcnN0RGF5V2VlazsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcHJldk1vbnRoTnVtRGF5cyAtIGZpcnN0RGF5V2VlayArIGkgKyAxXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZXZNb250aC55ZWFyLCBwcmV2TW9udGgubW9udGgsIGRheSlcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGRheSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1EYXlzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKVxuICAgICAgICBjb25zdCBpc0RheSA9IGRhdGUgPT4gKFxuICAgICAgICAgIGRhdGUgJiZcbiAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gaSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGhcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzRGF5KHRoaXMubW9kZWxWYWx1ZSlcbiAgICAgICAgICA/ICdhY3RpdmUnXG4gICAgICAgICAgOiBpc0RheShub3cpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuXG4uZGl0by1jYWxlbmRhci1ib2R5IHtcbiAgcGFkZGluZzogMCAwLjVlbTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDcpO1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBsaW5lLWhlaWdodDogY2FsYygkaW5wdXQtaGVpZ2h0IC0gMiAqICRib3JkZXItd2lkdGgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogJGJvcmRlci1zdHlsZTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgPiBzcGFuIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMCAwLjVlbTtcbiAgfVxuXG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LFxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNSU7XG4gIG1pbi13aWR0aDogMmVtO1xuICBtYXgtd2lkdGg6IDNlbTtcblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLknO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCqyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLonO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCuyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY2FsZW5kYXIoXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWxhYmVsPVwiQ2hvb3NlIGRhdGVcIlxuKVxuICAuZGl0by1jYWxlbmRhci1wb3B1cFxuICAgIC5kaXRvLWNhbGVuZGFyLWlubmVyXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImN1cnJlbnRNb2RlID09PSAnZGF5J1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgeWVhclwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBtb250aFwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN3aXRjaCB0byB5ZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1tb250aChcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2l0Y2ggdG8gbW9udGggc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgnbW9udGgnKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgbW9udGg6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCJcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCB5ZWFyXCJcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlcyhyb2xlPVwiZ3JpZFwiKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwiZGF0ZVRvU3RyaW5nKGRhdGUuZGF0ZSlcIlxuICAgICAgICAgICAgICA6YXJpYS1zZWxlY3RlZD1cImRhdGUuc3RhdGUgPT09ICdhY3RpdmUnXCJcbiAgICAgICAgICAgICAgOmFyaWEtZGlzYWJsZWQ9XCJkYXRlLnN0YXRlID09PSAnZGlzYWJsZWQnXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiZGF0ZS5zdGF0ZSAhPT0gJ2Rpc2FibGVkJyAmJiBzZWxlY3REYXRlKGRhdGUuZGF0ZSlcIlxuICAgICAgICAgICAgKSB7eyBkYXRlLnRleHQgfX1cbiAgICAgICAgLmRpdG8tY2FsZW5kYXItZm9vdGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1ub3coXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICA6YXJpYS1sYWJlbD1cImBTZWxlY3QgdG9kYXkgKCR7ZGF0ZVRvU3RyaW5nKG5ldyBEYXRlKCkpfSlgXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImRhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICdtb250aCdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHllYXJcIlxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN3aXRjaCB0byB5ZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCB5ZWFyXCJcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1tb250aHMoXG4gICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW9udGhcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiKG1vbnRoLCBpbmRleCkgaW4gbW9udGhOYW1lc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldE1vbnRoQ2xhc3MoaW5kZXgpXCJcbiAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwibW9udGgubG9uZ1wiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwiZ2V0TW9udGhDbGFzcyhpbmRleClbJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnXVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgZGVjYWRlXCJcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhbiB7eyBkZWNhZGVUb1N0cmluZyhjdXJyZW50VmFsdWUpIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IGRlY2FkZVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFycyhcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJZZWFyXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cInllYXIgaW4geWVhclJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0WWVhckNsYXNzKHllYXIpXCJcbiAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgIDphcmlhLWxhYmVsPVwiU3RyaW5nKHllYXIpXCJcbiAgICAgICAgICAgICAgOmFyaWEtc2VsZWN0ZWQ9XCJnZXRZZWFyQ2xhc3MoeWVhcilbJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnXVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVzY3JpYmVEYXRlLCBhbHRlckRhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RheScgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyB3ZWVrZGF5TmFtZXMsIG1vbnRoTmFtZXMgfSA9IGdldExvY2FsZU5hbWVzKHRoaXMubG9jYWxlKVxuICAgIHJldHVybiB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzLFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcbiAgICAgIHllYXJSYW5nZTogW10sXG4gICAgICBjdXJyZW50VmFsdWU6IChcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlIHx8XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB1c2UgY3VycmVudCBkYXRlIGJ1dCBjbGVhciB0aW1lIGZpZWxkczpcbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzLCB1cGRhdGUgPSBmYWxzZSkge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50VmFsdWUsIG92ZXJyaWRlcylcbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RlcERlY2FkZShzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIDEwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZXRNb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfSxcblxuICAgIHN0ZXBNb250aChzdGVwKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeyB5ZWFyLCBtb250aCB9ID0gdGhpcy5nZXRZZWFyTW9udGgoXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXBcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXk6IE1hdGgubWluKFxuICAgICAgICAgIHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpLFxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldERhdGUoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzdGVwWWVhcihzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0RGF0ZShkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoZGVzY3JpYmVEYXRlKGRhdGUpLCB0cnVlKVxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0JylcbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0sIHRydWUpXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0sIHRydWUpXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKFxuICAgICAgZGF0ZSxcbiAgICAgIHsgeWVhciwgbW9udGgsIGRheSB9ID0geyB5ZWFyOiB0cnVlLCBtb250aDogdHJ1ZSwgZGF5OiB0cnVlIH1cbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlID0gdGhpcy5jdXJyZW50TW9kZSwgdXBkYXRlID0gZmFsc2UgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBkYXk6IGN1cnJlbnRWYWx1ZS5nZXREYXRlKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bURheXM7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGkpXG4gICAgICAgIGNvbnN0IGlzRGF5ID0gZGF0ZSA9PiAoXG4gICAgICAgICAgZGF0ZSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID09PSBpICYmXG4gICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBtb250aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNEYXkodGhpcy5tb2RlbFZhbHVlKVxuICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICA6IGlzRGF5KG5vdylcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCRpbnB1dC1oZWlnaHQgLSAyICogJGJvcmRlci13aWR0aCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBib3JkZXItdG9wOiAkYm9yZGVyLXN0eWxlO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgZGlzcGxheTogZmxleDtcblxuICA+IHNwYW4ge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuICB9XG5cbiAgYSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYsXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA1JTtcbiAgbWluLXdpZHRoOiAyZW07XG4gIG1heC13aWR0aDogM2VtO1xuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuSc7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8KrJztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuic7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8K7JztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0cywgZXZlbnRzKSB7XG4gIHRhcmdldHMgPVxuICAgIHRhcmdldHMgaW5zdGFuY2VvZiBOb2RlTGlzdFxuICAgICAgPyBBcnJheS5mcm9tKHRhcmdldHMpXG4gICAgICA6IGFzQXJyYXkodGFyZ2V0cylcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUV2ZW50cyguLi5ldmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBldmVudC5yZW1vdmUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgMzc6ICdsZWZ0JyxcbiAgICAzODogJ3VwJyxcbiAgICAzOTogJ3JpZ2h0JyxcbiAgICA0MDogJ2Rvd24nLFxuICAgIDEzOiAnZW50ZXInXG4gIH1bZXZlbnQ/LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXQoY29tcG9uZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGlzU3RyaW5nKGNvbXBvbmVudC50YXJnZXQpXG4gICAgPyBjb21wb25lbnQuJHJlZnNbY29tcG9uZW50LnRhcmdldF1cbiAgICA6IGNvbXBvbmVudC50YXJnZXRcbiAgcmV0dXJuIHRhcmdldD8uJGVsID8/IHRhcmdldFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJgZGl0by0ke3RyYW5zaXRpb259YFwiKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWVsc2VcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMsIGNvbWJpbmVFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXInXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnNob3cnXSxcblxuICBwcm9wczoge1xuICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tJyB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjdXN0b21DbGFzczogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB6SW5kZXg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAga2VlcEluVmlldzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGlkZVdoZW5DbGlja091dHNpZGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGFsd2F5c1Nob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb3ZlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGhpZGVEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgZm9jdXNFdmVudHM6IG51bGwsXG4gICAgICBjbG9zZUV2ZW50czogbnVsbCxcbiAgICAgIHBvcHVwRXZlbnRzOiBudWxsLFxuICAgICAgYmx1clRpbWVyOiBudWxsLFxuICAgICAgbW91c2VMZWF2ZVRpbWVyOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpZ2dlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tdHJpZ2dlci1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdXBDbGFzcygpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgIFtgZGl0by1wb3B1cC0ke2h5cGhlbmF0ZSh0aGlzLnBsYWNlbWVudCl9YF06IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICAgIGNsYXNzZXNbdGhpcy5jdXN0b21DbGFzc10gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBwb3B1cFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID8gYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCA6ICcnXG4gICAgfSxcblxuICAgIHRyaWdnZXJUYXJnZXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3cgfHwgdGhpcy5hbHdheXNTaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLm9uU2hvd1BvcHVwKHRvKSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGlkZVdoZW5DbGlja091dHNpZGUgJiYgIXRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgLy8gVXNlICdtb3VzZXVwJyBpbnN0ZWFkIG9mICdjbGljaycsIHNpbmNlIGNsaWNrIGFwcGVhcnMgdG8gaGFwcGVuIGFmdGVyXG4gICAgICAvLyB0aGUgRE9NIGluc2lkZSBvZiBwb3B1cHMgY291bGQgY2hhbmdlIGluIGEgd2F5IHNvIHRoYXQgdGhlIGNoZWNrXG4gICAgICAvLyBgcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWAgd291bGQgZmFpbDpcbiAgICAgIHRoaXMuY2xvc2VFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCAmJlxuICAgICAgICAgICAgIXBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLnRyaWdnZXJUYXJnZXQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3dQb3B1cCA9IHRoaXMuc2hvd1xuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLmZvY3VzRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMuY2xvc2VFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaXNQb3B1cEZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLiRyZWZzLnBvcHVwPy5tYXRjaGVzKCc6Zm9jdXMtd2l0aGluJylcbiAgICB9LFxuXG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXJcbiAgICAgIC8vIEFjdHVhbGx5IHJlc2l6ZSB0aGUgcG9wdXAncyBmaXJzdCBjaGlsZCwgc28gdGhleSBjYW4gc2V0IHNpemUgbGltaXRzLlxuICAgICAgY29uc3QgZWwgPSB0aGlzLnRhcmdldCA9PT0gJ3BvcHVwJyA/IHRyaWdnZXIgOiBwb3B1cC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3VuZHMgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGxlZnQgKz0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyQm91bmRzLmxlZnRcbiAgICAgICAgdG9wICs9IHRyaWdnZXJUb3AgLSB0cmlnZ2VyQm91bmRzLnRvcFxuICAgICAgfVxuICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgXG4gICAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgXG4gICAgfSxcblxuICAgIGFkZEZvY3VzRXZlbnRzKHBhcmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgbGV0IGlucHV0XG5cbiAgICAgIHJldHVybiBjb21iaW5lRXZlbnRzKFxuICAgICAgICBhZGRFdmVudHModGFyZ2V0cywge1xuICAgICAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lcilcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIHRpbWVvdXQgdG8gYWxsb3cgY2xpY2tlZCBpbnB1dHMgdG8gZ3JhYiBmb2N1c1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUG9wdXBGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICBhZGRFdmVudHMocGFyZW50LCB7XG4gICAgICAgICAgbW91c2Vkb3duOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJy5kaXRvLWJ1dHRvbi1jbGVhcicpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdGhpcy4kcmVmcy50cmlnZ2VyXG4gICAgICAgICAgICAgIC8vIE1hcmsgdHJpZ2dlciBpbnB1dCBhcyByZWFkb25seSBzbyBpdCBjYW4ndCBsb29zZSBmb2N1cyB3aGlsZVxuICAgICAgICAgICAgICAvLyB1c2VyIGRvZXMgb3RoZXIgbW91c2UtYWN0aXZpdGllcyBpbiBwb3B1cC5cbiAgICAgICAgICAgICAgaW5wdXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICAgICAgICAgIGlmIChpbnB1dCAmJiAhaW5wdXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICd0cnVlJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgLy8gR2l2ZSBzb21lIHRpbWUgZm9yIG90aGVyIGV2ZW50cyB0byB1cGRhdGUgaW5wdXQgYmVmb3JlIGl0XG4gICAgICAgICAgICAgIC8vIGJlY29tZXMgZWRpdGFibGUgYW5kIHN0aWxsIGZvY3VzZWQgYWdhaW4uXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKVxuICAgICAgICAgICAgICAgIC8vIE9ubHkgYnJpbmcgdGhlIGZvY3VzIGJhY2sgZnJvbSB0aGUgcG9wdXAsIG5vdCBpZiB0aGUgZm9jdXNcbiAgICAgICAgICAgICAgICAvLyBtb3ZlZCBlbHNld2hlcmUgaW4gdGhlIG1lYW50aW1lLCBlLmcuIGJ5IGNsaWNraW5nIG91dHNpZGUuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpICYmXG4gICAgICAgICAgICAgICAgICB0aGlzLmlzUG9wdXBGb2N1c2VkKClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsXG4gICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBvblNob3dQb3B1cChzaG93KSB7XG4gICAgICBpZiAoc2hvdykge1xuICAgICAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy4kcmVmcy5wb3B1cClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9wdXBFdmVudHM/LnJlbW92ZSgpXG4gICAgICAgIHRoaXMucG9wdXBFdmVudHMgPSBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2xpY2soKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMnO1xuXG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpdG8tdHJpZ2dlci1kaXNhYmxlZCB7XG4gIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gICoge1xuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjpmb2N1cyB7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1wb3B1cCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkei1pbmRleC1wb3B1cDtcbn1cbjwvc3R5bGU+XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1pZj1cImFsd2F5c1Nob3dcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2NsaWNrJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2ZvY3VzJyB8fCB0cmlnZ2VyID09PSAnYWx3YXlzJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgVHJhbnNpdGlvbig6bmFtZT1cImBkaXRvLSR7dHJhbnNpdGlvbn1gXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cywgY29tYmluZUV2ZW50cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICBmb2N1c0V2ZW50czogbnVsbCxcbiAgICAgIGNsb3NlRXZlbnRzOiBudWxsLFxuICAgICAgcG9wdXBFdmVudHM6IG51bGwsXG4gICAgICBibHVyVGltZXI6IG51bGwsXG4gICAgICBtb3VzZUxlYXZlVGltZXI6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9LFxuXG4gICAgdHJpZ2dlclRhcmdldCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcylcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMub25TaG93UG9wdXAodG8pKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMudHJpZ2dlclRhcmdldD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLnBvcHVwRXZlbnRzPy5yZW1vdmUoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBpc1BvcHVwRm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuJHJlZnMucG9wdXA/Lm1hdGNoZXMoJzpmb2N1cy13aXRoaW4nKVxuICAgIH0sXG5cbiAgICB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICAgIGlmICh0aGlzLnNob3cgJiYgcG9wdXAub2Zmc2V0V2lkdGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlclxuICAgICAgLy8gQWN0dWFsbHkgcmVzaXplIHRoZSBwb3B1cCdzIGZpcnN0IGNoaWxkLCBzbyB0aGV5IGNhbiBzZXQgc2l6ZSBsaW1pdHMuXG4gICAgICBjb25zdCBlbCA9IHRoaXMudGFyZ2V0ID09PSAncG9wdXAnID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUud2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCkud2lkdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCB0cmlnZ2VyTGVmdCA9IGJvdW5kcy5sZWZ0ICsgd2luZG93LnNjcm9sbFhcbiAgICAgIGNvbnN0IHRyaWdnZXJUb3AgPSBib3VuZHMudG9wICsgd2luZG93LnNjcm9sbFlcbiAgICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IGJvdW5kcy53aWR0aFxuICAgICAgY29uc3QgdHJpZ2dlckhlaWdodCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cC5vZmZzZXRXaWR0aFxuICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cC5vZmZzZXRIZWlnaHRcblxuICAgICAgbGV0IFtwYXJ0MSwgcGFydDJdID0gdGhpcy5wb3B1cFBsYWNlbWVudC5zcGxpdCgnLScpIHx8IFtdXG4gICAgICBpZiAodGhpcy5rZWVwSW5WaWV3KSB7XG4gICAgICAgIGNvbnN0IHdpbldpZHRoID0gd2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgY29uc3Qgd2luSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQyID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgKyB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0ICsgdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGxlZnQgPSAwXG4gICAgICBsZXQgdG9wID0gMFxuICAgICAgc3dpdGNoIChwYXJ0MSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0ICs9IHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwYXJ0Mikge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoIC0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHQgLSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvdmVyKSB7XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHRvcCAtPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQgIT09IHRyaWdnZXIpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckJvdW5kcyA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgbGVmdCArPSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJCb3VuZHMubGVmdFxuICAgICAgICB0b3AgKz0gdHJpZ2dlclRvcCAtIHRyaWdnZXJCb3VuZHMudG9wXG4gICAgICB9XG4gICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcbiAgICAgIHBvcHVwLnN0eWxlLnRvcCA9IGAke3RvcH1weGBcbiAgICB9LFxuXG4gICAgYWRkRm9jdXNFdmVudHMocGFyZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBsZXQgaW5wdXRcblxuICAgICAgcmV0dXJuIGNvbWJpbmVFdmVudHMoXG4gICAgICAgIGFkZEV2ZW50cyh0YXJnZXRzLCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYmx1clRpbWVyKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgdGltZW91dCB0byBhbGxvdyBjbGlja2VkIGlucHV0cyB0byBncmFiIGZvY3VzXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNQb3B1cEZvY3VzZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuXG4gICAgICAgIGFkZEV2ZW50cyhwYXJlbnQsIHtcbiAgICAgICAgICBtb3VzZWRvd246IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnLmRpdG8tYnV0dG9uLWNsZWFyJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0aGlzLiRyZWZzLnRyaWdnZXJcbiAgICAgICAgICAgICAgLy8gTWFyayB0cmlnZ2VyIGlucHV0IGFzIHJlYWRvbmx5IHNvIGl0IGNhbid0IGxvb3NlIGZvY3VzIHdoaWxlXG4gICAgICAgICAgICAgIC8vIHVzZXIgZG9lcyBvdGhlciBtb3VzZS1hY3Rpdml0aWVzIGluIHBvcHVwLlxuICAgICAgICAgICAgICBpbnB1dCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgICAgICAgICAgaWYgKGlucHV0ICYmICFpbnB1dC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJ3RydWUnKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAvLyBHaXZlIHNvbWUgdGltZSBmb3Igb3RoZXIgZXZlbnRzIHRvIHVwZGF0ZSBpbnB1dCBiZWZvcmUgaXRcbiAgICAgICAgICAgICAgLy8gYmVjb21lcyBlZGl0YWJsZSBhbmQgc3RpbGwgZm9jdXNlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpXG4gICAgICAgICAgICAgICAgLy8gT25seSBicmluZyB0aGUgZm9jdXMgYmFjayBmcm9tIHRoZSBwb3B1cCwgbm90IGlmIHRoZSBmb2N1c1xuICAgICAgICAgICAgICAgIC8vIG1vdmVkIGVsc2V3aGVyZSBpbiB0aGUgbWVhbnRpbWUsIGUuZy4gYnkgY2xpY2tpbmcgb3V0c2lkZS5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykgJiZcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNQb3B1cEZvY3VzZWQoKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIG9uU2hvd1BvcHVwKHNob3cpIHtcbiAgICAgIGlmIChzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLiRyZWZzLnBvcHVwKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Ib3ZlcihlbnRlcikge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlTGVhdmVUaW1lcilcbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGlkZURlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLmhpZGVEZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1pbnB1dChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIEBtb3VzZWRvd249XCJvbk1vdXNlRG93blwiXG4pXG4gIHNsb3QobmFtZT1cInByZWZpeFwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG1vdXNlZG93bj1cIm9uTW91c2VEb3duXCJcbiAgKVxuICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYXV0b2ZvY3VzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZm9jdXNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgICdkaXRvLWlucHV0LS1mb2N1cyc6IHRoaXMuZm9jdXNlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dFxuICAgIH0sXG5cbiAgICBzaXplKCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHNpemUgYmFzZWQgb24gbWluICYgbWF4IHNldHRpbmdzLCBpZiB0aGV5J3JlIHByb3ZpZGVkLlxuICAgICAgY29uc3QgeyBzaXplLCBtaW4sIG1heCB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIGNvbnN0IGdldExlbmd0aCA9IHZhbHVlID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7dmFsdWV9YC5sZW5ndGggOiAwKVxuICAgICAgcmV0dXJuIHNpemUgfHwgZ2V0TGVuZ3RoKG1pbikgfHwgZ2V0TGVuZ3RoKG1heCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgIC8vIFdoZW4gZGlyZWN0bHkgY2xpY2tpbmcgdGhlIGlucHV0LCBkbyBub3QgcHJvcGFnYXRlIHRoZSBldmVudCBhbmRcbiAgICAgICAgLy8gYXZvaWQgYHByZXZlbnREZWZhdWx0KClgIGJlbG93LCB0byBrZWVwIHN1cHBvcnRpbmcgc2VsZWN0aW9uLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIHRoZSBpbnB1dCwgZS5nLiBvbiBhZmZpeGVzLCBicmluZyB0aGUgZm9jdXNcbiAgICAgICAgLy8gYmFjayB0byB0aGUgaW5wdXQuXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICBAZXh0ZW5kICVpbnB1dDtcblxuICBpbnB1dCB7XG4gICAgLy8gSW5oZXJpdCBhbGwgc3R5bGluZyBmcm9tIC5kaXRvLWlucHV0XG4gICAgYWxsOiBpbmhlcml0O1xuICAgIGZsZXg6IDE7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8taW5wdXQoXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICBAbW91c2Vkb3duPVwib25Nb3VzZURvd25cIlxuKVxuICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgaW5wdXQoXG4gICAgOmlkPVwiaWRcIlxuICAgIHJlZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICA6dHlwZT1cInR5cGVcIlxuICAgIDpuYW1lPVwibmFtZVwiXG4gICAgOnRpdGxlPVwidGl0bGVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIDphdXRvY29tcGxldGU9XCJhdXRvY29tcGxldGVcIlxuICAgIDphcmlhLWxhYmVsPVwidGl0bGVcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIEBtb3VzZWRvd249XCJvbk1vdXNlRG93blwiXG4gIClcbiAgc2xvdChuYW1lPVwic3VmZml4XCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGF1dG9mb2N1czogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGZvY3VzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy4kYXR0cnMuY2xhc3MsXG4gICAgICAgIHtcbiAgICAgICAgICAnZGl0by1pbnB1dC0tZm9jdXMnOiB0aGlzLmZvY3VzZWRcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXRcbiAgICB9LFxuXG4gICAgc2l6ZSgpIHtcbiAgICAgIC8vIERldGVybWluZSBzaXplIGJhc2VkIG9uIG1pbiAmIG1heCBzZXR0aW5ncywgaWYgdGhleSdyZSBwcm92aWRlZC5cbiAgICAgIGNvbnN0IHsgc2l6ZSwgbWluLCBtYXggfSA9IHRoaXMuJGF0dHJzXG4gICAgICBjb25zdCBnZXRMZW5ndGggPSB2YWx1ZSA9PiAodmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAubGVuZ3RoIDogMClcbiAgICAgIHJldHVybiBzaXplIHx8IGdldExlbmd0aChtaW4pIHx8IGdldExlbmd0aChtYXgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAvLyBXaGVuIGRpcmVjdGx5IGNsaWNraW5nIHRoZSBpbnB1dCwgZG8gbm90IHByb3BhZ2F0ZSB0aGUgZXZlbnQgYW5kXG4gICAgICAgIC8vIGF2b2lkIGBwcmV2ZW50RGVmYXVsdCgpYCBiZWxvdywgdG8ga2VlcCBzdXBwb3J0aW5nIHNlbGVjdGlvbi5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb3V0c2lkZSB0aGUgaW5wdXQsIGUuZy4gb24gYWZmaXhlcywgYnJpbmcgdGhlIGZvY3VzXG4gICAgICAgIC8vIGJhY2sgdG8gdGhlIGlucHV0LlxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBmbGV4OiAxO1xuICAgIG1pbi13aWR0aDogMDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKDpjbGFzcz1cImNsYXNzZXNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8taWNvbidcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgJHtwcmVmaXh9LS0ke3RoaXMubmFtZX1gXTogdHJ1ZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWRpc2FibGVkYF06IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0tI3skbmFtZX0ge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIEBleHRlbmQgJWljb24tI3skbmFtZX07XG5cbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8taWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG5cbiAgQGF0LXJvb3QgLmRpdG8taW5wdXQgJiB7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGNvbG9yOiAkY29sb3ItZ3JleTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG5cbiAgICAmLmRpdG8taWNvbi0tZGlzYWJsZWQge1xuICAgICAgY29sb3I6ICRjb2xvci1saWdodDtcbiAgICB9XG4gIH1cblxuICBAYXQtcm9vdCAuZGl0by1pbnB1dDpmb2N1cy13aXRoaW4gJiB7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaS5kaXRvLWljb24oOmNsYXNzPVwiY2xhc3Nlc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1pY29uJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7dGhpcy5uYW1lfWBdOiB0cnVlLFxuICAgICAgICBbYCR7cHJlZml4fS0tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLy8gYHlhcm4gYnVpbGQ6aWNvbnNgIGNvbnZlcnRzIHRoZSBpY29uIFNWRyBmaWxlcyB0byBzaWxlbnQgY2xhc3NlcyBpbnNpZGVcbi8vIGBzcmMvc3R5bGVzL21peGlucy9faWNvbnMuc2Nzc2AsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgb3RoZXIgc2Fzc1xuLy8gY29kZSB0aHJvdWdoIGBfaW1wb3J0c2AuXG4vLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG5vcm1hbCBDU1MgY2xhc3NlcywgY29udmVydCB0aGVtIGhlcmU6XG5AZWFjaCAkbmFtZSBpbiAkaWNvbnMge1xuICAuZGl0by1pY29uLS0jeyRuYW1lfSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcblxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcblxuICBAYXQtcm9vdCAuZGl0by1pbnB1dCAmIHtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgY29sb3I6ICRjb2xvci1ncmV5O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcblxuICAgICYuZGl0by1pY29uLS1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogJGNvbG9yLWxpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIEBhdC1yb290IC5kaXRvLWlucHV0OmZvY3VzLXdpdGhpbiAmIHtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQsIGVuZCB9KSB7XG4gIGlmIChpbnB1dD8uc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICBpbnB1dC5mb2N1cygpXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dCAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0XG4gICAgPyB7IHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQgfVxuICAgIDogbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIERpdG9DYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgICAgQHNlbGVjdD1cInNob3dQb3B1cCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b1RyaWdnZXIgZnJvbSAnLi9EaXRvVHJpZ2dlci52dWUnXG5pbXBvcnQgRGl0b0NhbGVuZGFyIGZyb20gJy4vRGl0b0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBEaXRvSW5wdXQgZnJvbSAnLi9EaXRvSW5wdXQudnVlJ1xuaW1wb3J0IERpdG9JY29uIGZyb20gJy4vRGl0b0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9DYWxlbmRhciwgRGl0b0lucHV0LCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZSxcbiAgICAgICAgdGltZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KT8uc3RhcnRcbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwICYmICF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY2FsZW5kYXIgfSA9IHRoaXMuJHJlZnNcbiAgICAgICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogbW9kZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHBvc2l0aW9uKSB8fCB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgIGNhbGVuZGFyLm5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUsIHVwZGF0ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4ZW07XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIERpdG9DYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgICAgQHNlbGVjdD1cInNob3dQb3B1cCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b1RyaWdnZXIgZnJvbSAnLi9EaXRvVHJpZ2dlci52dWUnXG5pbXBvcnQgRGl0b0NhbGVuZGFyIGZyb20gJy4vRGl0b0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBEaXRvSW5wdXQgZnJvbSAnLi9EaXRvSW5wdXQudnVlJ1xuaW1wb3J0IERpdG9JY29uIGZyb20gJy4vRGl0b0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9DYWxlbmRhciwgRGl0b0lucHV0LCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZSxcbiAgICAgICAgdGltZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KT8uc3RhcnRcbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwICYmICF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY2FsZW5kYXIgfSA9IHRoaXMuJHJlZnNcbiAgICAgICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogbW9kZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHBvc2l0aW9uKSB8fCB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgIGNhbGVuZGFyLm5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUsIHVwZGF0ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4ZW07XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjbG9ja1wiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwKFxuICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2hvb3NlIHRpbWVcIlxuICAgIClcbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItaG91cihcbiAgICAgICAgICByZWY9XCJob3VyXCJcbiAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkhvdXJcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDI0XCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZEhvdXIoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwiaG91ciA9PT0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogaG91ciA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJob3VyID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLW1pbnV0ZShcbiAgICAgICAgICByZWY9XCJtaW51dGVcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTWludXRlXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwibWludXRlID09PSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBtaW51dGUgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwibWludXRlID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLXNlY29uZChcbiAgICAgICAgICByZWY9XCJzZWNvbmRcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiU2Vjb25kXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwic2Vjb25kID09PSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b1RyaWdnZXIgZnJvbSAnLi9EaXRvVHJpZ2dlci52dWUnXG5pbXBvcnQgRGl0b0lucHV0IGZyb20gJy4vRGl0b0lucHV0LnZ1ZSdcbmltcG9ydCBEaXRvSWNvbiBmcm9tICcuL0RpdG9JY29uLnZ1ZSdcbmltcG9ydCB7IGFsdGVyRGF0ZSwgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9JbnB1dCwgRGl0b0ljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgIGRhdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWRIb3VyOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkTWludXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkU2Vjb25kOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBpZ25vcmVOZXh0Q2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnREYXRlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgfHxcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGUoKSBvYmplY3Qgd2l0aCB0aGUgdGltZSBzZXQgdG8gMCwgdG8gYmUgdXNlZCB3aGVuXG4gICAgICAgIC8vIGZpcnN0IHNldHRpbmcgYW55IG9mIHRoZSB0aW1lcywgZm9yIG1lYW5pbmdmdWwgZGF0ZXMgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gb2JqZWN0IGlzIHNoYXJlZCB3aXRoIGEgRGF0ZVBpY2tlciwgZS5nLiB0aHJvdWdoIERhdGVUaW1lUGlja2VyLlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZvY3VzZWQgJiZcbiAgICAgICAgIXRoaXMuaWdub3JlTmV4dENoYW5nZSAmJlxuICAgICAgICBzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmRcbiAgICAgICkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICB9XG4gICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSBmYWxzZVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnNjcm9sbEFsbChmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxlZnRQYWQodmFsdWUpIHtcbiAgICAgIHJldHVybiAoJzAnICsgdmFsdWUpLnNsaWNlKC0yKVxuICAgIH0sXG5cbiAgICBzZXRUaW1lKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50RGF0ZSwge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzY3JvbGxBbGwoc21vb3RoKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSAocmVmLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRyZWZzW3JlZl1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAoXG4gICAgICAgICAgICB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC9cbiAgICAgICAgICAgIC8vIEZpcnN0IGFuZCBsYXN0IG9uZSBhZGQgMyB0aW1lcyB0aGUgbWFyZ2luLlxuICAgICAgICAgICAgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCArIDYpXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgucm91bmQodmFsdWUgKiBsaW5lSGVpZ2h0KVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0LnNjcm9sbFRvcCAtIHRvcClcbiAgICAgICAgICB0YXJnZXQuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHNtb290aCAmJiBkaXN0YW5jZSA8IDEwMCA/ICdzbW9vdGgnIDogJ2F1dG8nXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmICghdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChzZWxlY3Rpb24uc3RhcnQpIHx8IHt9XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV0gKyBzdGVwXG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy4kcmVmc1tuYW1lXS5jaGlsZEVsZW1lbnRDb3VudFxuICAgICAgICAgICAgICB0aGlzW25hbWVdID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA8IDBcbiAgICAgICAgICAgICAgICAgID8gdmFsdWUgKyBjb3VudFxuICAgICAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlIC0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0XG4gICAgICAgIGxldCBwb3MgPSBzZWxlY3Rpb24uc3RhcnRcblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gY2hhciA9PiAhaXNOYU4oTnVtYmVyKGNoYXIpKVxuXG4gICAgICAgIGlmIChldmVudC5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzRGlnaXQoZXZlbnQua2V5KSAmJiBwb3MgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBuZXh0IGRpZ2l0IHNvIHRoZSBldmVudCBvdmVycmlkZXMgaXQgaW5zdGVhZCBvZiBpbnNlcnRpbmdcbiAgICAgICAgICAgIC8vIG5ldyBjaGFycy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJiAoXG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgKyAxXSkgfHxcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpLmxlbmd0aFxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgbGVuZ3RoKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9zID09PSAxIHx8XG4gICAgICAgICAgICBbJyAnLCAnOiddLmluY2x1ZGVzKHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwb3MgPT09IHZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MtLVxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICAoKHZhbHVlW3BvcyAtIDFdID8/ICcnKSArICcwMCcpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJlxuICAgICAgICAgICAgICAhaXNEaWdpdCgrdmFsdWVbcG9zICsgMV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiByZW1vdmluZyB0aGUgZmlyc3Qgb2YgdHdvIGRpZ2l0cywgcmVwbGFjZSB3aXRoIDBcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBwb3MpICsgJzAnICsgdmFsdWUuc2xpY2UocG9zKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDZlbTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIG1heC13aWR0aDogMTYwcHg7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cblxuJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0OiAyNHB4O1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAgLmRpdG8tdGltZS1waWNrZXItcGFuZWwge1xuICBmbG9hdDogbGVmdDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogY2FsYygxMDAlIC8gMyArIDFweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gIH1cblxuICB1bCB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDA7XG4gICAgLy8gSGlkZSBzY3JvbGxiYXI6XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgcGFkZGluZzogMCAxN3B4IDAgMDtcbiAgICBoZWlnaHQ6IDcgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG5cbiAgICAmID4gbGkge1xuICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgICB9XG5cbiAgICAgICYuc2VsZWN0ZWQsXG4gICAgICAmLnNlbGVjdGVkOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBEaXRvSW5wdXQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjbG9ja1wiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwKFxuICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2hvb3NlIHRpbWVcIlxuICAgIClcbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItaG91cihcbiAgICAgICAgICByZWY9XCJob3VyXCJcbiAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkhvdXJcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDI0XCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZEhvdXIoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwiaG91ciA9PT0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogaG91ciA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJob3VyID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLW1pbnV0ZShcbiAgICAgICAgICByZWY9XCJtaW51dGVcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiTWludXRlXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwibWludXRlID09PSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBtaW51dGUgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwibWludXRlID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLXNlY29uZChcbiAgICAgICAgICByZWY9XCJzZWNvbmRcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiU2Vjb25kXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICA6YXJpYS1sYWJlbD1cImxlZnRQYWQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDphcmlhLXNlbGVjdGVkPVwic2Vjb25kID09PSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b1RyaWdnZXIgZnJvbSAnLi9EaXRvVHJpZ2dlci52dWUnXG5pbXBvcnQgRGl0b0lucHV0IGZyb20gJy4vRGl0b0lucHV0LnZ1ZSdcbmltcG9ydCBEaXRvSWNvbiBmcm9tICcuL0RpdG9JY29uLnZ1ZSdcbmltcG9ydCB7IGFsdGVyRGF0ZSwgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgRGl0b1RyaWdnZXIsIERpdG9JbnB1dCwgRGl0b0ljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgIGRhdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWRIb3VyOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkTWludXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkU2Vjb25kOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBpZ25vcmVOZXh0Q2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnREYXRlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgfHxcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGUoKSBvYmplY3Qgd2l0aCB0aGUgdGltZSBzZXQgdG8gMCwgdG8gYmUgdXNlZCB3aGVuXG4gICAgICAgIC8vIGZpcnN0IHNldHRpbmcgYW55IG9mIHRoZSB0aW1lcywgZm9yIG1lYW5pbmdmdWwgZGF0ZXMgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gb2JqZWN0IGlzIHNoYXJlZCB3aXRoIGEgRGF0ZVBpY2tlciwgZS5nLiB0aHJvdWdoIERhdGVUaW1lUGlja2VyLlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZvY3VzZWQgJiZcbiAgICAgICAgIXRoaXMuaWdub3JlTmV4dENoYW5nZSAmJlxuICAgICAgICBzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmRcbiAgICAgICkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICB9XG4gICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSBmYWxzZVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnNjcm9sbEFsbChmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxlZnRQYWQodmFsdWUpIHtcbiAgICAgIHJldHVybiAoJzAnICsgdmFsdWUpLnNsaWNlKC0yKVxuICAgIH0sXG5cbiAgICBzZXRUaW1lKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50RGF0ZSwge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzY3JvbGxBbGwoc21vb3RoKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSAocmVmLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRyZWZzW3JlZl1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAoXG4gICAgICAgICAgICB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC9cbiAgICAgICAgICAgIC8vIEZpcnN0IGFuZCBsYXN0IG9uZSBhZGQgMyB0aW1lcyB0aGUgbWFyZ2luLlxuICAgICAgICAgICAgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCArIDYpXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgucm91bmQodmFsdWUgKiBsaW5lSGVpZ2h0KVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0LnNjcm9sbFRvcCAtIHRvcClcbiAgICAgICAgICB0YXJnZXQuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHNtb290aCAmJiBkaXN0YW5jZSA8IDEwMCA/ICdzbW9vdGgnIDogJ2F1dG8nXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmICghdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChzZWxlY3Rpb24uc3RhcnQpIHx8IHt9XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV0gKyBzdGVwXG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy4kcmVmc1tuYW1lXS5jaGlsZEVsZW1lbnRDb3VudFxuICAgICAgICAgICAgICB0aGlzW25hbWVdID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA8IDBcbiAgICAgICAgICAgICAgICAgID8gdmFsdWUgKyBjb3VudFxuICAgICAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlIC0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0XG4gICAgICAgIGxldCBwb3MgPSBzZWxlY3Rpb24uc3RhcnRcblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gY2hhciA9PiAhaXNOYU4oTnVtYmVyKGNoYXIpKVxuXG4gICAgICAgIGlmIChldmVudC5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzRGlnaXQoZXZlbnQua2V5KSAmJiBwb3MgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBuZXh0IGRpZ2l0IHNvIHRoZSBldmVudCBvdmVycmlkZXMgaXQgaW5zdGVhZCBvZiBpbnNlcnRpbmdcbiAgICAgICAgICAgIC8vIG5ldyBjaGFycy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJiAoXG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgKyAxXSkgfHxcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpLmxlbmd0aFxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgbGVuZ3RoKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9zID09PSAxIHx8XG4gICAgICAgICAgICBbJyAnLCAnOiddLmluY2x1ZGVzKHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwb3MgPT09IHZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MtLVxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICAoKHZhbHVlW3BvcyAtIDFdID8/ICcnKSArICcwMCcpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJlxuICAgICAgICAgICAgICAhaXNEaWdpdCgrdmFsdWVbcG9zICsgMV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiByZW1vdmluZyB0aGUgZmlyc3Qgb2YgdHdvIGRpZ2l0cywgcmVwbGFjZSB3aXRoIDBcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBwb3MpICsgJzAnICsgdmFsdWUuc2xpY2UocG9zKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDZlbTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIG1heC13aWR0aDogMTYwcHg7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cblxuJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0OiAyNHB4O1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAgLmRpdG8tdGltZS1waWNrZXItcGFuZWwge1xuICBmbG9hdDogbGVmdDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogY2FsYygxMDAlIC8gMyArIDFweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gIH1cblxuICB1bCB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDA7XG4gICAgLy8gSGlkZSBzY3JvbGxiYXI6XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgcGFkZGluZzogMCAxN3B4IDAgMDtcbiAgICBoZWlnaHQ6IDcgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG5cbiAgICAmID4gbGkge1xuICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgICB9XG5cbiAgICAgICYuc2VsZWN0ZWQsXG4gICAgICAmLnNlbGVjdGVkOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIocmVmPVwicGlja2VyXCIpXG4gIC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lubmVyKFxuICAgIDpjbGFzcz1cInsgJ2RpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5uZXItLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgKVxuICAgIERpdG9JbnB1dC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgICBEaXRvRGF0ZVBpY2tlcihcbiAgICAgIHJlZj1cImRhdGVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93RGF0ZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIERpdG9UaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMsIGFzc2lnbkRlZXBseSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0lucHV0IGZyb20gJy4vRGl0b0lucHV0LnZ1ZSdcbmltcG9ydCBEaXRvRGF0ZVBpY2tlciBmcm9tICcuL0RpdG9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBEaXRvVGltZVBpY2tlciBmcm9tICcuL0RpdG9UaW1lUGlja2VyLnZ1ZSdcbmltcG9ydCBEaXRvSWNvbiBmcm9tICcuL0RpdG9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IERpdG9JbnB1dCwgRGl0b0RhdGVQaWNrZXIsIERpdG9UaW1lUGlja2VyLCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBkYXRlRm9jdXNlZDogZmFsc2UsXG4gICAgICB0aW1lRm9jdXNlZDogZmFsc2UsXG4gICAgICBjbG9zZWRNb2RlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0T3B0aW9uczogZm9ybWF0IH0gPSB0aGlzXG4gICAgICByZXR1cm4geyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXQgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZVxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0LmlucHV0XG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gYXNzaWduRGVlcGx5KFxuICAgICAgICB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgZm9ybWF0OiAodmFsdWUsIHR5cGUsIG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdsaXRlcmFsJyAmJiAvXFxiYXRcXGIvLnRlc3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnLCAnXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZvcm1hdD8uZGF0ZT8uZm9ybWF0Py4odmFsdWUsIHR5cGUsIG9wdGlvbnMpID8/IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmZvcm1hdFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0aW1lSW5kZXgoKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jdXJyZW50VGV4dFxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRleHQubWF0Y2goLyhbXFxTXStcXHMqKSQvKT8uWzFdXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIC0gdGltZS5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICBpZiAodG9nZ2xlICYmICh0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWUpKSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVBvcHVwcygpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmdldE1vZGUoZXZlbnQpXG4gICAgICB0aGlzLiRyZWZzW21vZGVdLm9uS2V5RG93bihldmVudClcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG1vZGVcbiAgICAgIH0gZWxzZSBpZiAobW9kZSAhPT0gdGhpcy5jbG9zZWRNb2RlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKG1vZGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldE1vZGUoZXZlbnQgPSBudWxsKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0IH0gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgIGNvbnN0IHsgaG9yOiBzdGVwIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgcmV0dXJuIHRoaXMudGltZUluZGV4ID09PSBudWxsIHx8IHN0YXJ0ICsgc3RlcCA8IHRoaXMudGltZUluZGV4XG4gICAgICAgID8gJ2RhdGUnXG4gICAgICAgIDogJ3RpbWUnXG4gICAgfSxcblxuICAgIHVwZGF0ZVBvcHVwcyhtb2RlID0gdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd0RhdGUgPSBtb2RlID09PSAnZGF0ZSdcbiAgICAgIHRoaXMuc2hvd1RpbWUgPSBtb2RlID09PSAndGltZSdcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXRpbWUtcGlja2VyIHtcbiAgJl9faW5uZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAmX19pbnB1dCB7XG4gICAgZmxleDogMTtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIG1pbi13aWR0aDogMTJlbTtcbiAgfVxuXG4gIC5kaXRvLWRhdGUtcGlja2VyLFxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIocmVmPVwicGlja2VyXCIpXG4gIC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lubmVyKFxuICAgIDpjbGFzcz1cInsgJ2RpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5uZXItLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgKVxuICAgIERpdG9JbnB1dC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBmb2N1c2VkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjcHJlZml4KVxuICAgICAgICBzbG90KG5hbWU9XCJwcmVmaXhcIilcbiAgICAgIHRlbXBsYXRlKCNzdWZmaXgpXG4gICAgICAgIERpdG9JY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJzdWZmaXhcIilcbiAgICBEaXRvRGF0ZVBpY2tlcihcbiAgICAgIHJlZj1cImRhdGVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93RGF0ZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIERpdG9UaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMsIGFzc2lnbkRlZXBseSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0lucHV0IGZyb20gJy4vRGl0b0lucHV0LnZ1ZSdcbmltcG9ydCBEaXRvRGF0ZVBpY2tlciBmcm9tICcuL0RpdG9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBEaXRvVGltZVBpY2tlciBmcm9tICcuL0RpdG9UaW1lUGlja2VyLnZ1ZSdcbmltcG9ydCBEaXRvSWNvbiBmcm9tICcuL0RpdG9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IERpdG9JbnB1dCwgRGl0b0RhdGVQaWNrZXIsIERpdG9UaW1lUGlja2VyLCBEaXRvSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBkYXRlRm9jdXNlZDogZmFsc2UsXG4gICAgICB0aW1lRm9jdXNlZDogZmFsc2UsXG4gICAgICBjbG9zZWRNb2RlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0T3B0aW9uczogZm9ybWF0IH0gPSB0aGlzXG4gICAgICByZXR1cm4geyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXQgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZVxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0LmlucHV0XG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gYXNzaWduRGVlcGx5KFxuICAgICAgICB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgZm9ybWF0OiAodmFsdWUsIHR5cGUsIG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdsaXRlcmFsJyAmJiAvXFxiYXRcXGIvLnRlc3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnLCAnXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZvcm1hdD8uZGF0ZT8uZm9ybWF0Py4odmFsdWUsIHR5cGUsIG9wdGlvbnMpID8/IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmZvcm1hdFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0aW1lSW5kZXgoKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jdXJyZW50VGV4dFxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRleHQubWF0Y2goLyhbXFxTXStcXHMqKSQvKT8uWzFdXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIC0gdGltZS5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICBpZiAodG9nZ2xlICYmICh0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWUpKSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVBvcHVwcygpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmdldE1vZGUoZXZlbnQpXG4gICAgICB0aGlzLiRyZWZzW21vZGVdLm9uS2V5RG93bihldmVudClcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG1vZGVcbiAgICAgIH0gZWxzZSBpZiAobW9kZSAhPT0gdGhpcy5jbG9zZWRNb2RlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKG1vZGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldE1vZGUoZXZlbnQgPSBudWxsKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0IH0gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgIGNvbnN0IHsgaG9yOiBzdGVwIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgcmV0dXJuIHRoaXMudGltZUluZGV4ID09PSBudWxsIHx8IHN0YXJ0ICsgc3RlcCA8IHRoaXMudGltZUluZGV4XG4gICAgICAgID8gJ2RhdGUnXG4gICAgICAgIDogJ3RpbWUnXG4gICAgfSxcblxuICAgIHVwZGF0ZVBvcHVwcyhtb2RlID0gdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd0RhdGUgPSBtb2RlID09PSAnZGF0ZSdcbiAgICAgIHRoaXMuc2hvd1RpbWUgPSBtb2RlID09PSAndGltZSdcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXRpbWUtcGlja2VyIHtcbiAgJl9faW5uZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAmX19pbnB1dCB7XG4gICAgZmxleDogMTtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIG1pbi13aWR0aDogMTJlbTtcbiAgfVxuXG4gIC5kaXRvLWRhdGUtcGlja2VyLFxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvbm8tdGVtcGxhdGUtc2hhZG93IC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbm5hdi5kaXRvLXBhZ2luYXRpb24oYXJpYS1sYWJlbD1cIlBhZ2luYXRpb25cIilcbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbChcbiAgICB2LWlmPVwic2hvd1RvdGFsXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInRvdGFsID4gMFwiXG4gICAgKSB7eyBmaXJzdCB9fSDigJMge3sgbGFzdCB9fSAvIHt7IHRvdGFsIH19XG4gIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLS1yb3VuZChcbiAgICB2LWlmPVwibnVtUGFnZXMgPiAxXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwiYnV0dG9uIGluIGJ1dHRvbnNcIlxuICAgICAgOmNsYXNzPVwiZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pXCJcbiAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICA6YXJpYS1sYWJlbD1cImdldEJ1dHRvbkxhYmVsKGJ1dHRvbilcIlxuICAgICAgOmFyaWEtY3VycmVudD1cImJ1dHRvbi5hY3RpdmUgPyAncGFnZScgOiBudWxsXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tCdXR0b24oYnV0dG9uKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICkge3sgYnV0dG9uLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5wYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfSxcblxuICAgIG51bVBhZ2VzKCkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSlcbiAgICB9LFxuXG4gICAgYnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCBjdXJyZW50UGFnZSwgbnVtUGFnZXMgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kXG4gICAgICBpZiAobnVtUGFnZXMgPD0gc2hvd0xlbmd0aCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA8PSBzaG93UHJldiArIDEpIHtcbiAgICAgICAgZW5kID0gc2hvd0xlbmd0aFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA+PSBudW1QYWdlcyAtIHNob3dOZXh0KSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICAgIHN0YXJ0ID0gbnVtUGFnZXMgLSBzaG93TGVuZ3RoICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBjdXJyZW50UGFnZSAtIHNob3dQcmV2XG4gICAgICAgIGVuZCA9IGN1cnJlbnRQYWdlICsgc2hvd05leHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9ucyA9IFtdXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IDEsIHRleHQ6IDEgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA+IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5tYXgoMSwgY3VycmVudFBhZ2UgLSAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLXByZXYnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5taW4obnVtUGFnZXMsIGN1cnJlbnRQYWdlICsgMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1uZXh0J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8PSBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IG51bVBhZ2VzLCB0ZXh0OiBudW1QYWdlcyB9KVxuICAgICAgfVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcGFnZShwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxuICAgIH0sXG5cbiAgICBwYWdlU2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5udW1QYWdlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5udW1QYWdlc1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpwYWdlJywgdG8pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbikge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tYnV0dG9uJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7YnV0dG9uLnR5cGV9YF06IGJ1dHRvbi50eXBlLFxuICAgICAgICBbYCR7cHJlZml4fS0tYWN0aXZlYF06IGJ1dHRvbi5hY3RpdmVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0QnV0dG9uTGFiZWwoYnV0dG9uKSB7XG4gICAgICBpZiAoYnV0dG9uLnR5cGUgPT09ICdwcmV2JykgcmV0dXJuICdQcmV2aW91cyBwYWdlJ1xuICAgICAgaWYgKGJ1dHRvbi50eXBlID09PSAnbmV4dCcpIHJldHVybiAnTmV4dCBwYWdlJ1xuICAgICAgaWYgKGJ1dHRvbi50ZXh0KSByZXR1cm4gYFBhZ2UgJHtidXR0b24udGV4dH1gXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBvbkNsaWNrQnV0dG9uKGJ1dHRvbikge1xuICAgICAgaWYgKFxuICAgICAgICBidXR0b24uaW5kZXggJiZcbiAgICAgICAgIWJ1dHRvbi5kaXNhYmxlZCAmJlxuICAgICAgICBidXR0b24uaW5kZXggIT09IHRoaXMuY3VycmVudFBhZ2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gYnV0dG9uLmluZGV4XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGFsbCAwLjNzIGVhc2UsXG4gICAgICBjb2xvciAwcyxcbiAgICAgIGJhY2tncm91bmQgMHMsXG4gICAgICBib3JkZXIgMHM7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gICAgJi0tcHJldixcbiAgICAmLS1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi0tcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG5cbiAgICAmLS1lbGxpcHNpcy1wcmV2LFxuICAgICYtLWVsbGlwc2lzLW5leHQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtLWVsbGlwc2lzLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvbm8tdGVtcGxhdGUtc2hhZG93IC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbm5hdi5kaXRvLXBhZ2luYXRpb24oYXJpYS1sYWJlbD1cIlBhZ2luYXRpb25cIilcbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbChcbiAgICB2LWlmPVwic2hvd1RvdGFsXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInRvdGFsID4gMFwiXG4gICAgKSB7eyBmaXJzdCB9fSDigJMge3sgbGFzdCB9fSAvIHt7IHRvdGFsIH19XG4gIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLS1yb3VuZChcbiAgICB2LWlmPVwibnVtUGFnZXMgPiAxXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwiYnV0dG9uIGluIGJ1dHRvbnNcIlxuICAgICAgOmNsYXNzPVwiZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pXCJcbiAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICA6YXJpYS1sYWJlbD1cImdldEJ1dHRvbkxhYmVsKGJ1dHRvbilcIlxuICAgICAgOmFyaWEtY3VycmVudD1cImJ1dHRvbi5hY3RpdmUgPyAncGFnZScgOiBudWxsXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tCdXR0b24oYnV0dG9uKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICkge3sgYnV0dG9uLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5wYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfSxcblxuICAgIG51bVBhZ2VzKCkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSlcbiAgICB9LFxuXG4gICAgYnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCBjdXJyZW50UGFnZSwgbnVtUGFnZXMgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kXG4gICAgICBpZiAobnVtUGFnZXMgPD0gc2hvd0xlbmd0aCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA8PSBzaG93UHJldiArIDEpIHtcbiAgICAgICAgZW5kID0gc2hvd0xlbmd0aFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA+PSBudW1QYWdlcyAtIHNob3dOZXh0KSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICAgIHN0YXJ0ID0gbnVtUGFnZXMgLSBzaG93TGVuZ3RoICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBjdXJyZW50UGFnZSAtIHNob3dQcmV2XG4gICAgICAgIGVuZCA9IGN1cnJlbnRQYWdlICsgc2hvd05leHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9ucyA9IFtdXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IDEsIHRleHQ6IDEgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA+IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5tYXgoMSwgY3VycmVudFBhZ2UgLSAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLXByZXYnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5taW4obnVtUGFnZXMsIGN1cnJlbnRQYWdlICsgMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1uZXh0J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8PSBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IG51bVBhZ2VzLCB0ZXh0OiBudW1QYWdlcyB9KVxuICAgICAgfVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcGFnZShwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxuICAgIH0sXG5cbiAgICBwYWdlU2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5udW1QYWdlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5udW1QYWdlc1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpwYWdlJywgdG8pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbikge1xuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tYnV0dG9uJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLSR7YnV0dG9uLnR5cGV9YF06IGJ1dHRvbi50eXBlLFxuICAgICAgICBbYCR7cHJlZml4fS0tYWN0aXZlYF06IGJ1dHRvbi5hY3RpdmVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0QnV0dG9uTGFiZWwoYnV0dG9uKSB7XG4gICAgICBpZiAoYnV0dG9uLnR5cGUgPT09ICdwcmV2JykgcmV0dXJuICdQcmV2aW91cyBwYWdlJ1xuICAgICAgaWYgKGJ1dHRvbi50eXBlID09PSAnbmV4dCcpIHJldHVybiAnTmV4dCBwYWdlJ1xuICAgICAgaWYgKGJ1dHRvbi50ZXh0KSByZXR1cm4gYFBhZ2UgJHtidXR0b24udGV4dH1gXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBvbkNsaWNrQnV0dG9uKGJ1dHRvbikge1xuICAgICAgaWYgKFxuICAgICAgICBidXR0b24uaW5kZXggJiZcbiAgICAgICAgIWJ1dHRvbi5kaXNhYmxlZCAmJlxuICAgICAgICBidXR0b24uaW5kZXggIT09IHRoaXMuY3VycmVudFBhZ2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gYnV0dG9uLmluZGV4XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGFsbCAwLjNzIGVhc2UsXG4gICAgICBjb2xvciAwcyxcbiAgICAgIGJhY2tncm91bmQgMHMsXG4gICAgICBib3JkZXIgMHM7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gICAgJi0tcHJldixcbiAgICAmLS1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi0tcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG5cbiAgICAmLS1lbGxpcHNpcy1wcmV2LFxuICAgICYtLWVsbGlwc2lzLW5leHQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtLWVsbGlwc2lzLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXN3aXRjaChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pXG4gIC5kaXRvLXN3aXRjaF9fcGFuZVxuICAgIGlucHV0KFxuICAgICAgOmlkPVwiaWRcIlxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICA6YXJpYS1jaGVja2VkPVwiY2hlY2tlZFwiXG4gICAgICA6bmFtZT1cIm5hbWVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgICAuZGl0by1zd2l0Y2hfX2J1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2hfX2xhYmVsKFxuICAgICAgdi1pZj1cImxhYmVsc1wiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cImNoZWNrZWRcIlxuICAgICAgICBuYW1lPVwiY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy5jaGVja2VkIHx8ICdvbicgfX1cbiAgICAgIHNsb3QoXG4gICAgICAgIHYtZWxzZVxuICAgICAgICBuYW1lPVwidW5jaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLnVuY2hlY2tlZCB8fCAnb2ZmJyB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsczogeyB0eXBlOiBbT2JqZWN0LCBCb29sZWFuXSwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSAnZGl0by1zd2l0Y2gnXG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgIFtgJHtwcmVmaXh9LS1jaGVja2VkYF06IHRoaXMuY2hlY2tlZCxcbiAgICAgICAgICBbYCR7cHJlZml4fS0tZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKG1vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IG1vZGVsVmFsdWVcbiAgICB9LFxuXG4gICAgY2hlY2tlZChjaGVja2VkKSB7XG4gICAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY2hlY2tlZClcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY2hlY2tlZClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAkc2VsZjogJjtcblxuICAvLyBVc2Ugd2hvbGUgbXVsdGlwbGVzIG9mIGByZW1gIGZvciBzaXplcyBhbmQgYHB4YCBtYXJnaW5zL3BhZGRpbmcgYWxvbmdcbiAgLy8gd2l0aCBgY2FsYygpYCB0byBlbmQgdXAgd2l0aCBldmVuIHBpeGVsIHNpemVzLlxuICAtLXN3aXRjaC13aWR0aDogNGVtO1xuICAtLXN3aXRjaC1oZWlnaHQ6IDJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJl9fcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiB2YXIoLS13aWR0aCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICB9XG5cbiAgJl9fcGFuZSxcbiAgJl9fbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYm9yZGVyLWNvbG9yIDAuM3MsXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gIH1cblxuICAmX19idXR0b24ge1xuICAgIC0tc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiB2YXIoLS1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUpO1xuICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tc2l6ZSkgLyAyKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tc3dpdGNoLXNwZWVkKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIH1cblxuICAmX19idXR0b24sXG4gICZfX2xhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gICZfX2xhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgJi0tY2hlY2tlZCB7XG4gICAgaW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAjeyRzZWxmfV9fYnV0dG9uIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1vZmZzZXQpKTtcbiAgICB9XG5cbiAgICAjeyRzZWxmfV9fbGFiZWwge1xuICAgICAgbGVmdDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAmLS1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgICN7JHNlbGZ9X19idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoX19wYW5lXG4gICAgaW5wdXQoXG4gICAgICA6aWQ9XCJpZFwiXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIHYtbW9kZWw9XCJjaGVja2VkXCJcbiAgICAgIHJvbGU9XCJzd2l0Y2hcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIDphcmlhLWNoZWNrZWQ9XCJjaGVja2VkXCJcbiAgICAgIDpuYW1lPVwibmFtZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgKVxuICAgIC5kaXRvLXN3aXRjaF9fYnV0dG9uXG4gICAgc3Bhbi5kaXRvLXN3aXRjaF9fbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdkaXRvLXN3aXRjaCdcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuJGF0dHJzLmNsYXNzLFxuICAgICAgICB7XG4gICAgICAgICAgW2Ake3ByZWZpeH0tLWNoZWNrZWRgXTogdGhpcy5jaGVja2VkLFxuICAgICAgICAgIFtgJHtwcmVmaXh9LS1kaXNhYmxlZGBdOiB0aGlzLmRpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgc3R5bGVzKCkge1xuICAgICAgY29uc3QgeyBsYWJlbHM6IHsgY2hlY2tlZCwgdW5jaGVja2VkIH0gPSB7fSB9ID0gdGhpc1xuICAgICAgLy8gQ2FsY3VsYXRlIGAtLXN3aXRjaC13aWR0aGAgaW4gYHJlbWAsIGJhc2VkIG9uIGxhYmVsIGxlbmd0aC5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDAsIGNoZWNrZWQ/Lmxlbmd0aCwgdW5jaGVja2VkPy5sZW5ndGgpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnLS1zd2l0Y2gtd2lkdGgnOiBsZW5ndGggPyBgJHtsZW5ndGggKiAxLjV9cmVtYCA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUobW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jaGVja2VkID0gbW9kZWxWYWx1ZVxuICAgIH0sXG5cbiAgICBjaGVja2VkKGNoZWNrZWQpIHtcbiAgICAgIGlmIChjaGVja2VkICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjaGVja2VkKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBjaGVja2VkKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gICRzZWxmOiAmO1xuXG4gIC8vIFVzZSB3aG9sZSBtdWx0aXBsZXMgb2YgYHJlbWAgZm9yIHNpemVzIGFuZCBgcHhgIG1hcmdpbnMvcGFkZGluZyBhbG9uZ1xuICAvLyB3aXRoIGBjYWxjKClgIHRvIGVuZCB1cCB3aXRoIGV2ZW4gcGl4ZWwgc2l6ZXMuXG4gIC0tc3dpdGNoLXdpZHRoOiA0ZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMmVtO1xuICAtLXN3aXRjaC1tYXJnaW46IDJweDtcbiAgLS1zd2l0Y2gtcGFkZGluZzogM3B4O1xuICAtLXN3aXRjaC1zcGVlZDogMzAwbXM7XG4gIC0tbGFiZWwtbWFyZ2luOiAwLjVlbTtcbiAgLS13aWR0aDogY2FsYyh2YXIoLS1zd2l0Y2gtd2lkdGgpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1oZWlnaHQ6IGNhbGModmFyKC0tc3dpdGNoLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLW9mZnNldDogY2FsYyh2YXIoLS13aWR0aCkgLSB2YXIoLS1oZWlnaHQpKTtcblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiB2YXIoLS1zd2l0Y2gtaGVpZ2h0KTtcbiAgLy8gVG8gbWFrZSBpbmxpbmUgbGFiZWxzIGFwcGVhciBvbiBjb25zaXN0ZW50IGJhc2VsaW5lOlxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAmX19wYW5lIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IHZhcigtLXdpZHRoKTtcbiAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gIH1cblxuICAmX19wYW5lLFxuICAmX19sYWJlbCB7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB9XG5cbiAgaW5wdXQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0O1xuICAgIHRyYW5zaXRpb246XG4gICAgICBib3JkZXItY29sb3IgMC4zcyxcbiAgICAgIGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgfVxuXG4gICZfX2J1dHRvbiB7XG4gICAgLS1zaXplOiBjYWxjKHZhcigtLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLXBhZGRpbmcpKTtcblxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICBsZWZ0OiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgd2lkdGg6IHZhcigtLXNpemUpO1xuICAgIGhlaWdodDogdmFyKC0tc2l6ZSk7XG4gICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1zaXplKSAvIDIpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1zd2l0Y2gtc3BlZWQpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgfVxuXG4gICZfX2J1dHRvbixcbiAgJl9fbGFiZWwge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgJl9fbGFiZWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAmLS1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgICN7JHNlbGZ9X19idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgICN7JHNlbGZ9X19sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYtLWRpc2FibGVkIHtcbiAgICBAZXh0ZW5kICVidXR0b24tZGlzYWJsZWQ7XG4gIH1cblxuICAmOmZvY3VzLXdpdGhpbjpub3QoOmhvdmVyKSB7XG4gICAgI3skc2VsZn1fX2J1dHRvbiB7XG4gICAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgeyBoIGFzIGNyZWF0ZUVsZW1lbnQsIFRyYW5zaXRpb24gfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBUcmFuc2l0aW9uSGVpZ2h0KHsgZW5hYmxlZCB9LCB7IHNsb3RzIH0pIHtcbiAgcmV0dXJuIGVuYWJsZWRcbiAgICA/IGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwgcHJvcHMsIHNsb3RzKVxuICAgIDogc2xvdHMuZGVmYXVsdCgpXG59XG5cblRyYW5zaXRpb25IZWlnaHQucHJvcHMgPSB7XG4gIGVuYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25IZWlnaHRcblxuY29uc3Qgc2V0U3R5bGUgPSAoZWxlbWVudCwgc3R5bGUpID0+IE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpXG5cbmNvbnN0IG5leHRUaW1lb3V0ID0gY2FsbGJhY2sgPT4gc2V0VGltZW91dChjYWxsYmFjaywgMClcblxuLy8gRm9yY2UgcmVwYWludCB0byBtYWtlIHN1cmUgdGhlIGFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgY29ycmVjdGx5LlxuY29uc3QgZm9yY2VSZXBhaW50ID0gZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodFxuXG5jb25zdCBwcm9wcyA9IHtcbiAgbmFtZTogJ2RpdG8taGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IG51bGwgfSkpXG4gIH0sXG5cbiAgb25FbnRlcihlbGVtZW50KSB7XG4gICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIGdldHRpbmcgdHdvIGBvbkVudGVyKClgIGNhbGxzIHBlciB0cmFuc2l0aW9uLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBzZWNvbmQgb25lLiBUaGlzIG1pZ2h0IGJlIGxpbmtlZCB0byB0aGUgdXNlXG4gICAgLy8gb2YgYG5leHRUaW1lb3V0KClgLCB3aGljaCBpcyByZXF1aXJlZCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yXG4gICAgLy8gYGhlaWdodGAsIGJhc2VkIG9uIGAmLS1sYWJlbC12ZXJ0aWNhbGAgY2FsY3VsYXRpb25zLlxuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgICAgd2lkdGg6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgICB2aXNpYmlsaXR5OiBudWxsLFxuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH0pXG4gICAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pKVxuICAgIH0pXG4gIH0sXG5cbiAgb25MZWF2ZShlbGVtZW50KSB7XG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KVxuICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiAwIH0pKVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kZHVyYXRpb246IDAuMTVzO1xuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlLFxuLmRpdG8taGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWVudGVyICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IGRpdG8tc2xpZGUtbGVhdmUgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWZyb20sXG4uZGl0by1oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIl0sImlnbm9yZUxpc3QiOlswLDEsMiwzLDRdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsU0FBU3dKLEVBQVEsR0FBSztDQUNwQixJQUFNQyxJQUFzQix1QkFBTyxPQUFPLElBQUk7Q0FDOUMsS0FBSyxJQUFNQyxLQUFPQyxFQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUlELEtBQU87Q0FDN0MsUUFBUSxNQUFRRSxLQUFPSDtBQUN6QjtBQUVBLElBQU1JLElBQWEsUUFBQSxJQUFBLGFBQTJCLGVBQW9DLENBQUMsSUFBckIsT0FBTyxPQUFPLENBQUMsQ0FBQyxHQUN4RUMsSUFBYSxRQUFBLElBQUEsYUFBMkIsZUFBb0MsQ0FBQyxJQUFyQixPQUFPLE9BQU8sQ0FBQyxDQUFDLEdBQ3hFQyxVQUFhLENBQ25CLEdBRU1DLEtBQVEsTUFBUU4sRUFBSSxXQUFXLENBQUMsTUFBTSxPQUFPQSxFQUFJLFdBQVcsQ0FBQyxNQUFNLFFBQ3hFQSxF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