schema-shield 1.0.5 → 1.1.0

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.
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsIl9nZXRDYXVzZSIsInBvaW50ZXIiLCJpbnN0YW5jZVBvaW50ZXIiLCJnZXRDYXVzZSIsIl9nZXRUcmVlIiwidHJlZSIsImdldFRyZWUiLCJnZXRQYXRoIiwiRkFJTF9GQVNUX0RFRklORV9FUlJPUiIsImdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5Iiwia2V5IiwiZmFpbEZhc3QiLCJLZXl3b3JkRXJyb3IiLCJnZXROYW1lZEZ1bmN0aW9uIiwib3B0aW9ucyIsImlzQ29tcGlsZWRTY2hlbWEiLCJzdWJTY2hlbWEiLCJBcnJheSIsImlzQXJyYXkiLCJuYW1lIiwiZm4iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiVVVJRF9SRUdFWCIsIkRVUkFUSU9OX1JFR0VYIiwiVVJJX1JFR0VYIiwiRU1BSUxfUkVHRVgiLCJIT1NUTkFNRV9SRUdFWCIsIkRBVEVfUkVHRVgiLCJUSU1FX1JFR0VYIiwiVVJJX1JFRkVSRU5DRV9SRUdFWCIsIklSSV9SRUdFWCIsIklSSV9SRUZFUkVOQ0VfUkVHRVgiLCJJRE5fRU1BSUxfUkVHRVgiLCJJRE5fSE9TVE5BTUVfUkVHRVgiLCJEQVlTX0lOX01PTlRIIiwicGFyc2VUd29EaWdpdHMiLCJpbmRleCIsImZpcnN0IiwiY2hhckNvZGVBdCIsInNlY29uZCIsImlzVmFsaWRJcHY0UmFuZ2UiLCJzdGFydCIsImVuZCIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRTdGFydCIsImkiLCJzZWdtZW50TGVuZ3RoIiwiaiIsImRpZ2l0IiwiRm9ybWF0cyIsImxlbmd0aCIsInRDb2RlIiwieWVhciIsImEiLCJiIiwiYyIsImQiLCJwYXJzZUZvdXJEaWdpdHMiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJjdXJzb3IiLCJvZmZzZXRTaWduIiwib2Zmc2V0SG91ciIsIm9mZnNldE1pbnV0ZSIsImZyYWNTdGFydCIsImNvZGUiLCJ0ekNvZGUiLCJtYXhEYXlzIiwidXRjVG90YWxNaW51dGVzIiwib2Zmc2V0VG90YWxNaW51dGVzIiwidXJpIiwidGVzdCIsImVtYWlsIiwiaXB2NCIsImlzVmFsaWRJcHY0IiwiaXB2NiIsImhhc0NvbG9uIiwiaGFzRG91YmxlQ29sb24iLCJoZXh0ZXRDb3VudCIsImlzVmFsaWRJcHY2IiwiaG9zdG5hbWUiLCJkYXRlIiwibWF0Y2giLCJleGVjIiwieWVhclN0ciIsIm1vbnRoU3RyIiwiZGF5U3RyIiwiTnVtYmVyIiwicmVnZXgiLCJSZWdFeHAiLCJlIiwibmV4dCIsImlzVmFsaWRKc29uUG9pbnRlciIsImlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyIiwidGltZSIsImluY2x1ZGVzIiwiY2xvc2VJbmRleCIsImluZGV4T2YiLCJpc1ZhbGlkVXJpVGVtcGxhdGUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVpbnQ4IiwiaW50MTYiLCJ1aW50MTYiLCJpbnQzMiIsInVpbnQzMiIsImZsb2F0MzIiLCJmbG9hdDY0IiwiaGFzQ2hhbmdlZCIsInByZXYiLCJjdXJyZW50IiwiaXMiLCJpc1VuaXF1ZVByaW1pdGl2ZSIsImdldEFycmF5QnVja2V0S2V5IiwibGFzdCIsImZpcnN0VHlwZSIsImxhc3RUeXBlIiwiZmlyc3RBcnJheU1hcmtlciIsImZpcnN0U2lnbmF0dXJlIiwiZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUiLCJsYXN0QXJyYXlNYXJrZXIiLCJsYXN0U2lnbmF0dXJlIiwiZ2V0T2JqZWN0U2hhcGVLZXkiLCJrZXlzIiwic29ydCIsImpvaW4iLCJzaWduYXR1cmUiLCJpc05hTiIsIkFycmF5S2V5d29yZHMiLCJpdGVtcyIsImRlZmluZUVycm9yIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsInNjaGVtYUl0ZW0iLCJ2YWxpZGF0ZSIsIiR2YWxpZGF0ZSIsImVycm9yIiwiZWxlbWVudHMiLCJlbGVtZW50c1NjaGVtYSIsIm1pbkl0ZW1zIiwibWF4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJ0dXBsZUxlbmd0aCIsIl90dXBsZUl0ZW1zTGVuZ3RoIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidW5pcXVlSXRlbXMiLCJsZW4iLCJsZWZ0IiwicmlnaHQiLCJwcmltaXRpdmVTZWVuIiwiU2V0IiwicHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzIiwiYXJyYXlCdWNrZXRzIiwib2JqZWN0QnVja2V0cyIsImhhcyIsImFkZCIsIk1hcCIsImJ1Y2tldEtleSIsImNhbmRpZGF0ZXMiLCJnZXQiLCJzZXQiLCJwdXNoIiwiY29udGFpbnMiLCJjb250YWluc1ZhbGlkYXRlIiwiZGVlcENsb25lVW5mcmVlemUiLCJvYmoiLCJjbG9uZUNsYXNzSW5zdGFuY2VzIiwic2VlbiIsIldlYWtNYXAiLCJzb3VyY2UiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJCdWZmZXIiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwiaXNQbGFpbk9iamVjdCIsIkRhdGUiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImNsb25lZCIsImNsb25lIiwibCIsImdldFRpbWUiLCJmbGFncyIsImVudHJpZXMiLCJ2YWx1ZXMiLCJzbGljZSIsImJ1ZmZlciIsImZyb20iLCJQcm9taXNlIiwiV2Vha1NldCIsImNyZWF0ZSIsIlJlZmxlY3QiLCJvd25LZXlzIiwiZGVzY3JpcHRvcnMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsIk51bWJlcktleXdvcmRzIiwibWluaW11bSIsImluc3RhbmNlIiwibWluIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heGltdW0iLCJtYXgiLCJleGNsdXNpdmVNYXhpbXVtIiwibXVsdGlwbGVPZiIsInF1b3RpZW50IiwiaXNGaW5pdGUiLCJlcHNpbG9uIiwiTWF0aCIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJSRUdFWF9NRVRBX0NIQVJTIiwiaGFzUmVnZXhNZXRhIiwiUEFUVEVSTl9DQUNIRSIsImNvbXBpbGVQYXR0ZXJuTWF0Y2hlciIsInBhdHRlcm4iLCJjYWNoZWQiLCJjb21waWxlZCIsIl92YWx1ZSIsInBhdHRlcm5MZW5ndGgiLCJpbm5lciIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsIlBBVFRFUk5fS0VZX0NBQ0hFX0xJTUlUIiwiZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyIsIl9wYXR0ZXJuUHJvcGVydHlFbnRyaWVzIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuS2V5cyIsImNvbXBpbGVkTWF0Y2hlciIsInNjaGVtYVByb3AiLCJnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzIiwiY2FjaGUiLCJfcGF0dGVybktleU1hdGNoSW5kZXhDYWNoZSIsImluZGV4ZXMiLCJzaXplIiwiZ2V0QnJhbmNoRW50cmllcyIsImNhY2hlS2V5Iiwia2luZCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJwcm9wZXJ0aWVzIiwicHJvcEtleXMiLCJfcHJvcEtleXMiLCJyZXF1aXJlZFNldCIsIl9yZXF1aXJlZFNldCIsImRlZmF1bHQiLCJ2YWx1ZVNjaGVtYSIsIm1heFByb3BlcnRpZXMiLCJjb3VudCIsIm1pblByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImFwVmFsaWRhdGUiLCJfYXBWYWxpZGF0ZSIsInBhdHRlcm5FbnRyaWVzIiwibWF0Y2hpbmdJbmRleGVzIiwicHJvcGVydHlOYW1lcyIsInBuIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiZGVmaW5pdGlvbnMiLCIkaWQiLCIkc2NoZW1hIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIiRjb21tZW50IiwiZXhhbXBsZXMiLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudEVuY29kaW5nIiwiZGlzY3JpbWluYXRvciIsIm51bGxhYmxlIiwibWluTGVuZ3RoIiwibWF4TGVuZ3RoIiwicGF0dGVybk1hdGNoIiwiX3BhdHRlcm5NYXRjaCIsInBhdHRlcm5NYXRjaENhY2hlIiwiX3BhdHRlcm5NYXRjaENhY2hlIiwiaXNNYXRjaCIsImZvcm1hdCIsImZvcm1hdFZhbGlkYXRlIiwiX2Zvcm1hdFZhbGlkYXRlIiwiZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkIiwiX2Zvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCIsImZvcm1hdFJlc3VsdENhY2hlIiwiX2Zvcm1hdFJlc3VsdENhY2hlIiwiZ2V0Rm9ybWF0IiwiaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yIiwiaXNWYWxpZCIsImVudW0iLCJlbnVtQ2FjaGUiLCJfZW51bUNhY2hlIiwicHJpbWl0aXZlU2V0Iiwib2JqZWN0VmFsdWVzIiwibGlzdCIsImVudW1JdGVtIiwiYWxsT2YiLCJicmFuY2hlcyIsIm9ubHlCcmFuY2giLCJicmFuY2giLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCIkcmVmIiwiX3Jlc29sdmVkUmVmIiwicmVmUGF0aCIsInRhcmdldFNjaGVtYSIsImdldFNjaGVtYVJlZiIsImdldFNjaGVtYUJ5SWQiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJyb290U2NoZW1hIiwiaWRSZWdpc3RyeSIsInR5cGUiLCJ2YWxpZGF0b3IiLCJhZGRUeXBlIiwiYWRkS2V5d29yZCIsImFkZEZvcm1hdCIsIm92ZXJ3cml0ZSIsImdldFR5cGUiLCJnZXRLZXl3b3JkIiwicGF0aCIsInJvb3QiLCJwYXJ0cyIsInNwbGl0IiwicGFydCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJkZWZzIiwicmVzb2x2ZVBhdGgiLCJpZCIsImNvbXBpbGUiLCJjbGVhciIsImNvbXBpbGVkU2NoZW1hIiwiY29tcGlsZVNjaGVtYSIsIl9oYXNSZWYiLCJsaW5rUmVmZXJlbmNlcyIsImlzU2NoZW1hTGlrZSIsImNsb25lZERhdGEiLCJyZXMiLCJ2YWxpZCIsImlzVHJpdmlhbEFsd2F5c1ZhbGlkU3Vic2NoZW1hIiwic2hhbGxvd0FycmF5RXF1YWxzIiwiZmxhdHRlbkFzc29jaWF0aXZlQnJhbmNoZXMiLCJvdXQiLCJuZXN0ZWQiLCJmbGF0dGVuU2luZ2xlV3JhcHBlck9uZU9mIiwibm9ybWFsaXplU2NoZW1hRm9yQ29tcGlsZSIsIm5vcm1hbGl6ZWQiLCJzY2hlbWFLZXlzIiwiaGFzT25seUtleSIsInNldE5vcm1hbGl6ZWQiLCJmbGF0dGVuZWRBbGxPZiIsImZpbHRlciIsImZsYXR0ZW5lZEFueU9mIiwiZmxhdHRlbmVkT25lT2YiLCJtYXJrU2NoZW1hSGFzUmVmIiwic2hvdWxkU2tpcEtleXdvcmQiLCJoYXNSZXF1aXJlZERlZmF1bHRzIiwiaXNEZWZhdWx0VHlwZVZhbGlkYXRvciIsInNjaGVtYUhhc1JlZiIsInJlZlZhbGlkYXRvciIsInZhbGlkYXRvcnMiLCJhY3RpdmVOYW1lcyIsImRlZmluZVR5cGVFcnJvciIsIm1hcCIsInQiLCJ0cmltIiwidHlwZUZ1bmN0aW9ucyIsInR5cGVOYW1lcyIsImRlZmF1bHRUeXBlTmFtZXMiLCJjb21iaW5lZFR5cGVWYWxpZGF0b3IiLCJhbGxUeXBlc0RlZmF1bHQiLCJ0eXBlTWV0aG9kTmFtZSIsInNpbmdsZVR5cGVOYW1lIiwiaXNJbnRlZ2VyIiwic2luZ2xlVHlwZUZuIiwiYWxsb3dzT2JqZWN0IiwiYWxsb3dzQXJyYXkiLCJhbGxvd3NTdHJpbmciLCJhbGxvd3NOdW1iZXIiLCJhbGxvd3NJbnRlZ2VyIiwiYWxsb3dzQm9vbGVhbiIsImFsbG93c051bGwiLCJkYXRhVHlwZSIsIm90aGVyS2V5cyIsImtleU9yZGVyIiwia2V5d29yZEZuIiwiZm5OYW1lIiwibGl0ZXJhbEtleXdvcmRzIiwiY29tcGlsZWRTdWJTY2hlbWEiLCJzdWJLZXkiLCJ2IiwiY29tcG9zaXRlTmFtZSIsIm1hc3RlclZhbGlkYXRvciIsInN0YWNrIiwibm9kZSIsInBvcCIsInRhcmdldCIsIl9kYXRhIl0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzL21haW4tdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi91dGlscy9oYXMtY2hhbmdlZC50cyIsIi4uL2xpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50cyIsIi4uL2xpYi91dGlscy9kZWVwLWZyZWV6ZS50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIvdXRpbHMvcGF0dGVybi1tYXRjaGVyLnRzIiwiLi4vbGliL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuaW50ZXJmYWNlIEVycm9yVHJlZSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAga2V5d29yZDogc3RyaW5nO1xuICBpdGVtPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzY2hlbWFQYXRoOiBzdHJpbmc7XG4gIGluc3RhbmNlUGF0aDogc3RyaW5nO1xuICBkYXRhPzogYW55O1xuICBjYXVzZT86IEVycm9yVHJlZTtcbn1cblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBpdGVtPzogc3RyaW5nIHwgbnVtYmVyO1xuICBrZXl3b3JkOiBzdHJpbmc7XG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yO1xuICBzY2hlbWFQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZyA9IFwiXCI7XG4gIGRhdGE/OiBhbnk7XG4gIHNjaGVtYT86IENvbXBpbGVkU2NoZW1hO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0aGlzLml0ZW0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdGhpcy5zY2hlbWEgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHRoaXMuaXRlbSBpbiB0aGlzLnNjaGVtYVxuICAgICAgKSB7XG4gICAgICAgIHNjaGVtYVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgICAgfVxuICAgICAgaW5zdGFuY2VQYXRoICs9IGAvJHt0aGlzLml0ZW19YDtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlUGF0aCA9IGluc3RhbmNlUGF0aDtcbiAgICB0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2F1c2Ugb3IgdGhlIGNhdXNlIGlzIG5vdCBhIFZhbGlkYXRpb25FcnJvciwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXRoaXMuY2F1c2UgfHwgISh0aGlzLmNhdXNlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2F1c2UuX2dldENhdXNlKHNjaGVtYVBhdGgsIGluc3RhbmNlUGF0aCk7XG4gIH1cblxuICBnZXRDYXVzZSgpOiBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VHJlZSgpOiBFcnJvclRyZWUge1xuICAgIGNvbnN0IHRyZWU6IEVycm9yVHJlZSA9IHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGtleXdvcmQ6IHRoaXMua2V5d29yZCxcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcbiAgICAgIHNjaGVtYVBhdGg6IHRoaXMuc2NoZW1hUGF0aCxcbiAgICAgIGluc3RhbmNlUGF0aDogdGhpcy5pbnN0YW5jZVBhdGgsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2F1c2UpIHtcbiAgICAgIHRyZWUuY2F1c2UgPSB0aGlzLmNhdXNlLl9nZXRUcmVlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9nZXRUcmVlKCk7XG4gIH1cblxuICBnZXRQYXRoKCkge1xuICAgIGNvbnN0IGNhdXNlID0gdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFQYXRoOiBjYXVzZS5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiBjYXVzZS5pbnN0YW5jZVBhdGhcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgc2NoZW1hUGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvciB8IHRydWU7IC8vIENhdXNlIG9mIHRoZSBlcnJvclxuICBkYXRhPzogYW55OyAvLyBEYXRhIHRoYXQgY2F1c2VkIHRoZSBlcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yRnVuY3Rpb24ge1xuICAoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBEZWZpbmVFcnJvck9wdGlvbnNcbiAgKTogVmFsaWRhdGlvbkVycm9yIHwgdm9pZCB8IHRydWU7XG59XG5cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiAoXG4gICAgISFzdWJTY2hlbWEgJiZcbiAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkoc3ViU2NoZW1hKSAmJlxuICAgIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aChyb290OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGlmICghcGF0aCB8fCBwYXRoID09PSBcIiNcIikge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gSlNPTiBQb2ludGVyXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgbGV0IGN1cnJlbnQgPSByb290O1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVXJpUGFydCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZWRVcmlQYXJ0LnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XG5cbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiICYmIGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLy8gU2ltcGxlIGxvb2t1cCBieSBkZWZpbml0aW9uIG5hbWUgKG5vbi1zdGFuZGFyZCwgYnV0IHVzZWZ1bClcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgIGlmIChyb290LmRlZmluaXRpb25zICYmIHJvb3QuZGVmaW5pdGlvbnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZmluaXRpb25zW3BhdGhdO1xuICAgIH1cbiAgICBpZiAocm9vdC5kZWZzICYmIHJvb3QuZGVmc1twYXRoXSkge1xuICAgICAgcmV0dXJuIHJvb3QuZGVmc1twYXRoXTtcbiAgICB9XG5cbiAgICBpZiAocm9vdC4kaWQgJiYgdHlwZW9mIHJvb3QuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocm9vdC4kaWQgPT09IHBhdGggfHwgcm9vdC4kaWQuZW5kc1dpdGgoXCIvXCIgKyBwYXRoKSkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhOiBudW1iZXIsIGI6IG51bWJlciwgZXBzaWxvbiA9IDFlLTE1KTogYm9vbGVhbiB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlZ2V4IGhlbHBlcnNcbmNvbnN0IFVVSURfUkVHRVggPVxuICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8vIElTTyA4NjAxIER1cmF0aW9uIChQM1k2TTREVDEySDMwTTVTKVxuY29uc3QgRFVSQVRJT05fUkVHRVggPVxuICAvXlAoPyEkKSgoXFxkK1kpPyhcXGQrTSk/KFxcZCtXKT8oXFxkK0QpPykoVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvO1xuY29uc3QgVVJJX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVowLTkrXFwtLl0qOlteXFxzXSokLztcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2k7XG5jb25zdCBIT1NUTkFNRV9SRUdFWCA9XG4gIC9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0oPzpcXC5bYS16MC05XVthLXowLTktXXswLDYyfSkqW2EtejAtOV0kL2k7XG5jb25zdCBEQVRFX1JFR0VYID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuY29uc3QgVElNRV9SRUdFWCA9XG4gIC9eKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpOihbMC01XVxcZCkoXFwuXFxkKyk/KFp8KFsrLV0pKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpKSQvO1xuY29uc3QgVVJJX1JFRkVSRU5DRV9SRUdFWCA9XG4gIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaTtcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzRGlnaXRDaGFyQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gcGFyc2VUd29EaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGZpcnN0ID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4KSAtIDQ4O1xuICBjb25zdCBzZWNvbmQgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuXG4gIGlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiA5IHx8IHNlY29uZCA8IDAgfHwgc2Vjb25kID4gOSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdCAqIDEwICsgc2Vjb25kO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZvdXJEaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGEgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXgpIC0gNDg7XG4gIGNvbnN0IGIgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuICBjb25zdCBjID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4ICsgMikgLSA0ODtcbiAgY29uc3QgZCA9IGRhdGEuY2hhckNvZGVBdChpbmRleCArIDMpIC0gNDg7XG5cbiAgaWYgKFxuICAgIGEgPCAwIHx8XG4gICAgYSA+IDkgfHxcbiAgICBiIDwgMCB8fFxuICAgIGIgPiA5IHx8XG4gICAgYyA8IDAgfHxcbiAgICBjID4gOSB8fFxuICAgIGQgPCAwIHx8XG4gICAgZCA+IDlcbiAgKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgKiAxMDAwICsgYiAqIDEwMCArIGMgKiAxMCArIGQ7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBsZXQgc2VnbWVudENvdW50ID0gMDtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IHN0YXJ0O1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGlmIChpICE9PSBlbmQgJiYgZGF0YS5jaGFyQ29kZUF0KGkpICE9PSA0Nikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGkgLSBzZWdtZW50U3RhcnQ7XG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPCAxIHx8IHNlZ21lbnRMZW5ndGggPiAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPiAxICYmIGRhdGEuY2hhckNvZGVBdChzZWdtZW50U3RhcnQpID09PSA0OCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IHNlZ21lbnRTdGFydDsgaiA8IGk7IGorKykge1xuICAgICAgY29uc3QgZGlnaXQgPSBkYXRhLmNoYXJDb2RlQXQoaikgLSA0ODtcbiAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VnbWVudENvdW50Kys7XG4gICAgc2VnbWVudFN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudENvdW50ID09PSA0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSXB2NChkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc0hleENoYXJDb2RlKGNvZGU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHxcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZElwdjYoZGF0YTogc3RyaW5nKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG4gIGxldCBoYXNEb3VibGVDb2xvbiA9IGZhbHNlO1xuICBsZXQgaGV4dGV0Q291bnQgPSAwO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuXG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSA9PT0gNTgpIHtcbiAgICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBpO1xuICAgIGxldCBzZWdtZW50TGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGlzSGV4Q2hhckNvZGUoZGF0YS5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgc2VnbWVudExlbmd0aCsrO1xuICAgICAgaWYgKHNlZ21lbnRMZW5ndGggPiA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkpID09PSA0Nikge1xuICAgICAgaWYgKCFoYXNDb2xvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWYWxpZElwdjRSYW5nZShkYXRhLCBzZWdtZW50U3RhcnQsIGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICAgICAgcmV0dXJuIGhleHRldENvdW50IDwgNjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhleHRldENvdW50ID09PSA2O1xuICAgIH1cblxuICAgIGhleHRldENvdW50Kys7XG4gICAgaWYgKGhleHRldENvdW50ID4gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDU4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIGkrKztcblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgaSsrO1xuXG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzQ29sb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICByZXR1cm4gaGV4dGV0Q291bnQgPCA4O1xuICB9XG5cbiAgcmV0dXJuIGhleHRldENvdW50ID09PSA4O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YTogc3RyaW5nKSB7XG4gIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9PSA0Nykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDEyNikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGRhdGEuY2hhckNvZGVBdChpICsgMSk7XG4gICAgaWYgKG5leHQgIT09IDQ4ICYmIG5leHQgIT09IDQ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyKGRhdGE6IHN0cmluZykge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpID09PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSA9PT0gMzUpIHtcbiAgICByZXR1cm4gaSArIDEgPT09IGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSAhPT0gNDcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGkgPSBpICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpICE9PSAxMjYpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIGlmIChuZXh0ICE9PSA0OCAmJiBuZXh0ICE9PSA0OSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJpVGVtcGxhdGUoZGF0YTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoY29kZSA9PT0gMTI1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IDEyMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VJbmRleCA9IGRhdGEuaW5kZXhPZihcIn1cIiwgaSArIDEpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSB8fCBjbG9zZUluZGV4ID09PSBpICsgMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkgPSBjbG9zZUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMTkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNCkgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNykgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoMTMpICE9PSA1OCB8fFxuICAgICAgZGF0YS5jaGFyQ29kZUF0KDE2KSAhPT0gNThcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0Q29kZSA9IGRhdGEuY2hhckNvZGVBdCgxMCk7XG4gICAgaWYgKHRDb2RlICE9PSA4NCAmJiB0Q29kZSAhPT0gMTE2KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlRm91ckRpZ2l0cyhkYXRhLCAwKTtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDUpO1xuICAgIGNvbnN0IGRheSA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDgpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCAxMSk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgMTQpO1xuICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDE3KTtcblxuICAgIGlmIChcbiAgICAgIHllYXIgPCAwIHx8XG4gICAgICBtb250aCA8IDAgfHxcbiAgICAgIGRheSA8IDAgfHxcbiAgICAgIGhvdXIgPCAwIHx8XG4gICAgICBtaW51dGUgPCAwIHx8XG4gICAgICBzZWNvbmQgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGhvdXIgPiAyMyB8fCBtaW51dGUgPiA1OSB8fCBzZWNvbmQgPiA2MCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjdXJzb3IgPSAxOTtcbiAgICBsZXQgb2Zmc2V0U2lnbjogXCIrXCIgfCBcIi1cIiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBvZmZzZXRIb3VyID0gMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gMDtcblxuICAgIGlmIChjdXJzb3IgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGN1cnNvcikgPT09IDQ2KSB7XG4gICAgICBjdXJzb3IrKztcbiAgICAgIGNvbnN0IGZyYWNTdGFydCA9IGN1cnNvcjtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBsZW5ndGggJiYgaXNEaWdpdENoYXJDb2RlKGRhdGEuY2hhckNvZGVBdChjdXJzb3IpKSkge1xuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnNvciA9PT0gZnJhY1N0YXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3Vyc29yIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ekNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoY3Vyc29yKTtcblxuICAgICAgaWYgKHR6Q29kZSA9PT0gOTAgfHwgdHpDb2RlID09PSAxMjIpIHtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9IGVsc2UgaWYgKHR6Q29kZSA9PT0gNDMgfHwgdHpDb2RlID09PSA0NSkge1xuICAgICAgICBvZmZzZXRTaWduID0gdHpDb2RlID09PSA0MyA/IFwiK1wiIDogXCItXCI7XG5cbiAgICAgICAgaWYgKGN1cnNvciArIDYgPiBsZW5ndGggfHwgZGF0YS5jaGFyQ29kZUF0KGN1cnNvciArIDMpICE9PSA1OCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9mZnNldEhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgb2Zmc2V0TWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgY3Vyc29yICsgNCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9mZnNldEhvdXIgPCAwIHx8XG4gICAgICAgICAgb2Zmc2V0TWludXRlIDwgMCB8fFxuICAgICAgICAgIG9mZnNldEhvdXIgPiAyMyB8fFxuICAgICAgICAgIG9mZnNldE1pbnV0ZSA+IDU5XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJzb3IgIT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZCA9PT0gNjApIHtcbiAgICAgIGxldCB1dGNUb3RhbE1pbnV0ZXMgPSBob3VyICogNjAgKyBtaW51dGU7XG5cbiAgICAgIGlmIChvZmZzZXRTaWduKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IG9mZnNldEhvdXIgKiA2MCArIG9mZnNldE1pbnV0ZTtcbiAgICAgICAgdXRjVG90YWxNaW51dGVzICs9XG4gICAgICAgICAgb2Zmc2V0U2lnbiA9PT0gXCIrXCIgPyAtb2Zmc2V0VG90YWxNaW51dGVzIDogb2Zmc2V0VG90YWxNaW51dGVzO1xuICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgJT0gMjQgKiA2MDtcbiAgICAgICAgaWYgKHV0Y1RvdGFsTWludXRlcyA8IDApIHtcbiAgICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgKz0gMjQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXRjVG90YWxNaW51dGVzICE9PSAyMyAqIDYwICsgNTkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBVUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiBFTUFJTF9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNWYWxpZElwdjQoZGF0YSk7XG4gIH0sXG5cbiAgaXB2NihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRJcHY2KGRhdGEpO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkUmVsYXRpdmVKc29uUG9pbnRlcihkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFRJTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmIChkYXRhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBVUklfUkVGRVJFTkNFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJ1cmktdGVtcGxhdGVcIihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRVcmlUZW1wbGF0ZShkYXRhKTtcbiAgfSxcblxuICBkdXJhdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIERVUkFUSU9OX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgdXVpZChkYXRhKSB7XG4gICAgcmV0dXJuIFVVSURfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBJUkkgaXMgbGlrZSBVUkkgYnV0IGFsbG93cyBVbmljb2RlLiBXZSByZXVzZSBhIHBlcm1pc3NpdmUgbG9naWMuXG4gIGlyaShkYXRhKSB7XG4gICAgcmV0dXJuIElSSV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIFwiaXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIElSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBCZXN0LWVmZm9ydCBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZm9yIElETiAobm8gcHVueWNvZGUvdGFibGVzKVxuICBcImlkbi1lbWFpbFwiKGRhdGEpIHtcbiAgICByZXR1cm4gSUROX0VNQUlMX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJpZG4taG9zdG5hbWVcIihkYXRhKSB7XG4gICAgLy8gQWxsb3dzIHVuaWNvZGUsIGZvcmJpZHMgc3BhY2VzIGFuZCB0eXBpY2FsIGludmFsaWQgVVJMIGNoYXJzXG4gICAgcmV0dXJuIElETl9IT1NUTkFNRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVpbnQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1aW50MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVpbnQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsIi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCByZWN1cnNpdmVseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGFuZ2VkKHByZXY6IGFueSwgY3VycmVudDogYW55KSB7XG4gIGlmIChPYmplY3QuaXMocHJldiwgY3VycmVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBjdXJyZW50W2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgJiYgcHJldiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIiB8fCBjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgaWYgKGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBoYXNDaGFuZ2VkIH0gZnJvbSBcIi4uL3V0aWxzL2hhcy1jaGFuZ2VkXCI7XG5cbmZ1bmN0aW9uIGlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWNrZXRLZXkodmFsdWU6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiMFwiO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW2xlbmd0aCAtIDFdO1xuICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGZpcnN0O1xuICBjb25zdCBsYXN0VHlwZSA9IGxhc3QgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBsYXN0O1xuXG4gIGxldCBmaXJzdEFycmF5TWFya2VyID0gXCJcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XG4gICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShmaXJzdCk7XG4gICAgZmlyc3RBcnJheU1hcmtlciA9IGZpcnN0U2lnbmF0dXJlID09PSBudWxsID8gYGE6JHtmaXJzdC5sZW5ndGh9YCA6IGZpcnN0U2lnbmF0dXJlO1xuICB9XG5cbiAgbGV0IGxhc3RBcnJheU1hcmtlciA9IFwiXCI7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgY29uc3QgbGFzdFNpZ25hdHVyZSA9IGdldFByaW1pdGl2ZUFycmF5U2lnbmF0dXJlKGxhc3QpO1xuICAgIGxhc3RBcnJheU1hcmtlciA9IGxhc3RTaWduYXR1cmUgPT09IG51bGwgPyBgYToke2xhc3QubGVuZ3RofWAgOiBsYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgcmV0dXJuIGAke2xlbmd0aH06JHtmaXJzdFR5cGV9OiR7Zmlyc3RBcnJheU1hcmtlcn06JHtsYXN0VHlwZX06JHtsYXN0QXJyYXlNYXJrZXJ9YDtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U2hhcGVLZXkodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKTtcbiAgcmV0dXJuIGAke2tleXMubGVuZ3RofToke2tleXMuam9pbihcIlxcdTAwMDFcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUodmFsdWU6IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiYTowXCI7XG4gIH1cblxuICBpZiAoIWlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlWzBdKSB8fCAhaXNVbmlxdWVQcmltaXRpdmUodmFsdWVbbGVuZ3RoIC0gMV0pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc2lnbmF0dXJlID0gYGE6JHtsZW5ndGh9OmA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcblxuICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICBzaWduYXR1cmUgKz0gXCJsO1wiO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzaWduYXR1cmUgKz0gYHMke2l0ZW0ubGVuZ3RofToke2l0ZW19O2A7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaXRlbSkpIHtcbiAgICAgICAgc2lnbmF0dXJlICs9IFwibjpOYU47XCI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmlzKGl0ZW0sIC0wKSkge1xuICAgICAgICBzaWduYXR1cmUgKz0gXCJuOi0wO1wiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlICs9IGBuOiR7aXRlbX07YDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHNpZ25hdHVyZSArPSBpdGVtID8gXCJiOjE7XCIgOiBcImI6MDtcIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIC8vIGxpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50c1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPVxuICAgICAgICBzY2hlbWFJdGVtc0xlbmd0aCA8IGRhdGFMZW5ndGggPyBzY2hlbWFJdGVtc0xlbmd0aCA6IGRhdGFMZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChzY2hlbWFJdGVtID09PSBmYWxzZSAmJiBkYXRhW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW0gJiYgc2NoZW1hSXRlbS4kdmFsaWRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBzY2hlbWFJdGVtcyAmJiBzY2hlbWFJdGVtcy4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbGVtZW50cyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNTY2hlbWEgPSBzY2hlbWEuZWxlbWVudHM7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBlbGVtZW50c1NjaGVtYSAmJiBlbGVtZW50c1NjaGVtYS4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHVwbGVMZW5ndGggPSAoc2NoZW1hIGFzIGFueSkuX3R1cGxlSXRlbXNMZW5ndGggYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0dXBsZUxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0dXBsZUxlbmd0aCA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl90dXBsZUl0ZW1zTGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IHR1cGxlTGVuZ3RoLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gdHVwbGVMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcylcbiAgICApIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0dXBsZUxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsZW4gPD0gOCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YVtpXTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YVtqXTtcblxuICAgICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHJpZ2h0ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNOYU4obGVmdCkgJiZcbiAgICAgICAgICAgIE51bWJlci5pc05hTihyaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogcmlnaHQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVmdCAmJlxuICAgICAgICAgICAgcmlnaHQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBsZWZ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcmlnaHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFoYXNDaGFuZ2VkKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1pdGl2ZVNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBsZXQgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXJyYXlCdWNrZXRzOiBNYXA8c3RyaW5nLCBhbnlbXT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9iamVjdEJ1Y2tldHM6IE1hcDxzdHJpbmcsIGFueVtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2ldO1xuXG4gICAgICBpZiAoaXNVbmlxdWVQcmltaXRpdmUoaXRlbSkpIHtcbiAgICAgICAgaWYgKHByaW1pdGl2ZVNlZW4uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW1pdGl2ZVNlZW4uYWRkKGl0ZW0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShpdGVtKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmhhcyhzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheUJ1Y2tldHMpIHtcbiAgICAgICAgICBhcnJheUJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRBcnJheUJ1Y2tldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBhcnJheUJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICAgIGFycmF5QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChpdGVtKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0QnVja2V0cykge1xuICAgICAgICBvYmplY3RCdWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRPYmplY3RTaGFwZUtleShpdGVtKTtcbiAgICAgIGxldCBjYW5kaWRhdGVzID0gb2JqZWN0QnVja2V0cy5nZXQoYnVja2V0S2V5KTtcblxuICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgb2JqZWN0QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGVzLnB1c2goaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbnNWYWxpZGF0ZSA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbnRhaW5zVmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShcbiAgb2JqOiBhbnksXG4gIGZyZWV6ZUNsYXNzSW5zdGFuY2VzOiBib29sZWFuID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha1NldCgpXG4pOiBhbnkge1xuICBpZiAoXG4gICAgb2JqID09PSBudWxsIHx8XG4gICAgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHNlZW4uaGFzKG9iaikgfHxcbiAgICBPYmplY3QuaXNGcm96ZW4ob2JqKVxuICApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc2Vlbi5hZGQob2JqKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtpXSwgZnJlZXplQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wcyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtwcm9wc1tpXV0sIGZyZWV6ZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgKG5vdCBhIHBsYWluIG9iamVjdCBvciBhcnJheSkgd2UgbmVlZCB0byBmcmVlemUgdGhlIHByb3RvdHlwZVxuICAgIGlmIChmcmVlemVDbGFzc0luc3RhbmNlcykge1xuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBkZWVwRnJlZXplKHByb3RvLCBmcmVlemVDbGFzc0luc3RhbmNlcywgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgeyBpc1BsYWluT2JqZWN0IH07XG5cbmZ1bmN0aW9uIGNhblVzZVN0cnVjdHVyZWRDbG9uZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3RydWN0dXJlZENsb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVVbmZyZWV6ZTxUPihcbiAgb2JqOiBULFxuICBjbG9uZUNsYXNzSW5zdGFuY2VzID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gb2JqIGFzIGFueTtcblxuICBpZiAoc2Vlbi5oYXMoc291cmNlKSkge1xuICAgIHJldHVybiBzZWVuLmdldChzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGNhblVzZVN0cnVjdHVyZWRDbG9uZShzb3VyY2UpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gc3RydWN0dXJlZENsb25lKHNvdXJjZSk7XG4gICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBsZXQgY2xvbmU6IGFueTtcblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIEFycmF5LmlzQXJyYXkoc291cmNlKToge1xuICAgICAgY2xvbmUgPSBbXTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNsb25lW2ldID0gZGVlcENsb25lVW5mcmVlemUoc291cmNlW2ldLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBzb3VyY2UgaW5zdGFuY2VvZiBEYXRlOiB7XG4gICAgICBjbG9uZSA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgUmVnRXhwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIE1hcDoge1xuICAgICAgY2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY2xvbmUuc2V0KFxuICAgICAgICAgIGRlZXBDbG9uZVVuZnJlZXplKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lVW5mcmVlemUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgU2V0OiB7XG4gICAgICBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UudmFsdWVzKCkpIHtcbiAgICAgICAgY2xvbmUuYWRkKGRlZXBDbG9uZVVuZnJlZXplKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gc291cmNlLnNsaWNlKDApO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIFR5cGVkQXJyYXlzIGFuZCBEYXRhVmlld1xuICAgIGNhc2UgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSk6IHtcbiAgICAgIGNsb25lID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihzb3VyY2UuYnVmZmVyLnNsaWNlKDApKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICAvLyBOb2RlLmpzIEJ1ZmZlclxuICAgIGNhc2UgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIHNvdXJjZS5jb25zdHJ1Y3RvciAmJiBzb3VyY2UuY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhzb3VyY2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZVVuZnJlZXplKFxuICAgICAgICAgIHNvdXJjZVtrZXkgYXMgc3RyaW5nXSxcbiAgICAgICAgICBjbG9uZUNsYXNzSW5zdGFuY2VzLFxuICAgICAgICAgIHNlZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba2V5IGFzIHN0cmluZ107XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZGVlcENsb25lVW5mcmVlemUoXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgIGNsb25lQ2xhc3NJbnN0YW5jZXMsXG4gICAgICAgIHNlZW5cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9uZSwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiY29uc3QgUkVHRVhfTUVUQV9DSEFSUyA9IC9bXFxcXC5eJCorPygpW1xcXXt9fF0vO1xuXG5mdW5jdGlvbiBoYXNSZWdleE1ldGEodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVhfTUVUQV9DSEFSUy50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgUEFUVEVSTl9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCBDb21waWxlZFBhdHRlcm5NYXRjaGVyPigpO1xuXG5leHBvcnQgdHlwZSBDb21waWxlZFBhdHRlcm5NYXRjaGVyID0gUmVnRXhwIHwgKCh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuTWF0Y2hlcihwYXR0ZXJuOiBzdHJpbmcpOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyIHtcbiAgY29uc3QgY2FjaGVkID0gUEFUVEVSTl9DQUNIRS5nZXQocGF0dGVybik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgbGV0IGNvbXBpbGVkOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyO1xuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICB9IGVsc2UgaWYgKCFoYXNSZWdleE1ldGEocGF0dGVybikpIHtcbiAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcyhwYXR0ZXJuKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICBpZiAocGF0dGVybkxlbmd0aCA+PSAyICYmIHBhdHRlcm5bMF0gPT09IFwiXlwiICYmIHBhdHRlcm5bcGF0dGVybkxlbmd0aCAtIDFdID09PSBcIiRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBwYXR0ZXJuLnNsaWNlKDEsIC0xKTtcbiAgICAgIGlmICghaGFzUmVnZXhNZXRhKGlubmVyKSkge1xuICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZWQgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5bMF0gPT09IFwiXlwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMSk7XG4gICAgICBpZiAoIWhhc1JlZ2V4TWV0YShpbm5lcikpIHtcbiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnN0YXJ0c1dpdGgoaW5uZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21waWxlZCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGF0dGVybltwYXR0ZXJuTGVuZ3RoIC0gMV0gPT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMCwgLTEpO1xuICAgICAgaWYgKCFoYXNSZWdleE1ldGEoaW5uZXIpKSB7XG4gICAgICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb21waWxlZCA9IChfdmFsdWU6IHN0cmluZykgPT4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5lbmRzV2l0aChpbm5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgfVxuICB9XG5cbiAgUEFUVEVSTl9DQUNIRS5zZXQocGF0dGVybiwgY29tcGlsZWQpO1xuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSB9IGZyb20gXCIuLi91dGlscy9kZWVwLWZyZWV6ZVwiO1xuaW1wb3J0IHsgY29tcGlsZVBhdHRlcm5NYXRjaGVyIH0gZnJvbSBcIi4uL3V0aWxzL3BhdHRlcm4tbWF0Y2hlclwiO1xuXG5jb25zdCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCA9IDUxMjtcblxudHlwZSBQYXR0ZXJuUHJvcGVydHlFbnRyeSA9IHtcbiAgc2NoZW1hUHJvcDogYW55O1xuICBtYXRjaDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyhzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgbGV0IGVudHJpZXMgPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXMgYXNcbiAgICB8IFBhdHRlcm5Qcm9wZXJ0eUVudHJ5W11cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgaWYgKFxuICAgICFzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHxcbiAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gIGVudHJpZXMgPSBuZXcgQXJyYXkocGF0dGVybktleXMubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgY29uc3QgY29tcGlsZWRNYXRjaGVyID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKGtleSk7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgY29tcGlsZWRNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgID8gKHZhbHVlOiBzdHJpbmcpID0+IGNvbXBpbGVkTWF0Y2hlci50ZXN0KHZhbHVlKVxuICAgICAgICA6IGNvbXBpbGVkTWF0Y2hlcjtcblxuICAgIGVudHJpZXNbaV0gPSB7XG4gICAgICBzY2hlbWFQcm9wOiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNba2V5XSxcbiAgICAgIG1hdGNoXG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXNcIiwge1xuICAgIHZhbHVlOiBlbnRyaWVzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyaWVzOiBQYXR0ZXJuUHJvcGVydHlFbnRyeVtdXG4pIHtcbiAgbGV0IGNhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlIGFzXG4gICAgfCBNYXA8c3RyaW5nLCBudW1iZXJbXT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBjYWNoZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5tYXRjaChrZXkpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhY2hlLnNpemUgPCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCkge1xuICAgIGNhY2hlLnNldChrZXksIGluZGV4ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9wS2V5cyA9IChzY2hlbWEgYXMgYW55KS5fcHJvcEtleXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwcm9wS2V5cykge1xuICAgICAgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wcm9wS2V5c1wiLCB7XG4gICAgICAgIHZhbHVlOiBwcm9wS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVpcmVkU2V0ID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZFNldCBhc1xuICAgICAgfCBTZXQ8c3RyaW5nPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWlyZWRTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWlyZWRTZXQgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZClcbiAgICAgICAgPyBuZXcgU2V0PHN0cmluZz4oc2NoZW1hLnJlcXVpcmVkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9yZXF1aXJlZFNldFwiLCB7XG4gICAgICAgIHZhbHVlOiByZXF1aXJlZFNldCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRTZXQgJiZcbiAgICAgICAgICByZXF1aXJlZFNldC5oYXMoa2V5KSAmJlxuICAgICAgICAgIHNjaGVtYVByb3AgJiZcbiAgICAgICAgICB0eXBlb2Ygc2NoZW1hUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYVByb3ApICYmXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gc2NoZW1hUHJvcFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IChzY2hlbWFQcm9wIGFzIGFueSkuJHZhbGlkYXRlKHNjaGVtYVByb3AuZGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZWZhdWx0IHByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogc2NoZW1hUHJvcC5kZWZhdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YVtrZXldID0gZGVlcENsb25lVW5mcmVlemUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gc2NoZW1hLnZhbHVlcztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbHVlU2NoZW1hICYmIHZhbHVlU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBmZXcgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwVmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2FwVmFsaWRhdGUgYXNcbiAgICAgIHwgKChkYXRhOiBhbnkpID0+IGFueSlcbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwVmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBWYWxpZGF0ZSA9IGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKVxuICAgICAgICA/IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcy4kdmFsaWRhdGVcbiAgICAgICAgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfYXBWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBhcFZhbGlkYXRlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuRW50cmllcyA9IGdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMoc2NoZW1hKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXR0ZXJuRW50cmllcyAmJiBwYXR0ZXJuRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGdldFBhdHRlcm5LZXlNYXRjaEluZGV4ZXMoc2NoZW1hLCBrZXksIHBhdHRlcm5FbnRyaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhcFZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybkVudHJpZXMgPSBnZXRQYXR0ZXJuUHJvcGVydHlFbnRyaWVzKHNjaGVtYSk7XG4gICAgaWYgKCFwYXR0ZXJuRW50cmllcyB8fCBwYXR0ZXJuRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGluZ0luZGV4ZXMgPSBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKHNjaGVtYSwga2V5LCBwYXR0ZXJuRW50cmllcyk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0luZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlICYmXG4gICAgICAgICAgIShzY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIGtleSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGluZ0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHBhdHRlcm5FbnRyaWVzW21hdGNoaW5nSW5kZXhlc1tqXV0uc2NoZW1hUHJvcDtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYVByb3AgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYVByb3AuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuICBwcm9wZXJ0eU5hbWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBuID0gc2NoZW1hLnByb3BlcnR5TmFtZXM7XG5cbiAgICBpZiAodHlwZW9mIHBuID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHBuID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBuICYmIHBuLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShrZXkpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IG5hbWUgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGhhc0NoYW5nZWQgfSBmcm9tIFwiLi4vdXRpbHMvaGFzLWNoYW5nZWRcIjtcblxudHlwZSBCcmFuY2hFbnRyeSA9XG4gIHwgeyBraW5kOiBcInZhbGlkYXRlXCI7IHZhbGlkYXRlOiAoZGF0YTogYW55KSA9PiBhbnkgfVxuICB8IHsga2luZDogXCJhbHdheXNWYWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwiYWx3YXlzSW52YWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwibGl0ZXJhbFwiOyB2YWx1ZTogYW55IH07XG5cbmZ1bmN0aW9uIHRvQnJhbmNoRW50cnkoaXRlbTogYW55KTogQnJhbmNoRW50cnkge1xuICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwidmFsaWRhdGVcIiwgdmFsaWRhdGU6IGl0ZW0uJHZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsga2luZDogXCJhbHdheXNWYWxpZFwiIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHsga2luZDogaXRlbSA/IFwiYWx3YXlzVmFsaWRcIiA6IFwiYWx3YXlzSW52YWxpZFwiIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiBcImxpdGVyYWxcIiwgdmFsdWU6IGl0ZW0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnJhbmNoRW50cmllcyhzY2hlbWE6IGFueSwga2V5OiBcImFsbE9mXCIgfCBcImFueU9mXCIgfCBcIm9uZU9mXCIpIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgXyR7a2V5fUJyYW5jaEVudHJpZXNgO1xuICBsZXQgZW50cmllcyA9IHNjaGVtYVtjYWNoZUtleV0gYXMgQnJhbmNoRW50cnlbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gc2NoZW1hW2tleV0gfHwgW107XG4gIGVudHJpZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGVudHJpZXMucHVzaCh0b0JyYW5jaEVudHJ5KHNvdXJjZVtpXSkpO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgY2FjaGVLZXksIHtcbiAgICB2YWx1ZTogZW50cmllcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCBlbnVtQ2FjaGUgPSAoc2NoZW1hIGFzIGFueSkuX2VudW1DYWNoZSBhc1xuICAgICAgfCB7IHByaW1pdGl2ZVNldDogU2V0PGFueT47IG9iamVjdFZhbHVlczogYW55W10gfVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVudW1DYWNoZSkge1xuICAgICAgY29uc3QgcHJpbWl0aXZlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgICBjb25zdCBvYmplY3RWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBsaXN0ID0gc2NoZW1hLmVudW07XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnVtSXRlbSA9IGxpc3RbaV07XG4gICAgICAgIGlmIChlbnVtSXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBvYmplY3RWYWx1ZXMucHVzaChlbnVtSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlU2V0LmFkZChlbnVtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW51bUNhY2hlID0geyBwcmltaXRpdmVTZXQsIG9iamVjdFZhbHVlcyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZW51bUNhY2hlXCIsIHtcbiAgICAgICAgdmFsdWU6IGVudW1DYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgISh0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNOYU4oZGF0YSkpICYmXG4gICAgICBlbnVtQ2FjaGUucHJpbWl0aXZlU2V0LmhhcyhkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDb25zZXJ2YXRpdmUgZXhhY3Qtc2VtYW50aWNzIHBhdGguXG4gICAgICAvLyBGdXR1cmUgb3B0LWluIG9wdGltaXphdGlvbjogc3RydWN0dXJhbCBoYXNoaW5nIGJ1Y2tldHMgZm9yIGxhcmdlIGVudW1zLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnVtQ2FjaGUub2JqZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbnVtQ2FjaGUub2JqZWN0VmFsdWVzW2ldLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJhbGxPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNJbnZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IG9ubHlCcmFuY2gudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSAhPT0gYnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGFueU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IGdldEJyYW5jaEVudHJpZXMoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb25seUJyYW5jaCA9IGJyYW5jaGVzWzBdO1xuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBvbmx5QnJhbmNoLnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSBvbmx5QnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBicmFuY2gudmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IGJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c1ZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gb25seUJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG4gICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBpc1ZhbGlkID0gIWJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVmFsaWQgPSBkYXRhID09PSBicmFuY2gudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZENvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBjb25zdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKGRhdGEgPT09IHNjaGVtYS5jb25zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIHNjaGVtYS5jb25zdCAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hLmNvbnN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgIWhhc0NoYW5nZWQoZGF0YSwgc2NoZW1hLmNvbnN0KSkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSkge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEubm90ICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLm5vdClcbiAgICApIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoc2NoZW1hLm5vdCBhcyBhbnkpLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gICRyZWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2NoZW1hLl9yZXNvbHZlZFJlZikge1xuICAgICAgaWYgKHNjaGVtYS4kdmFsaWRhdGUgIT09IHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgICAgc2NoZW1hLiR2YWxpZGF0ZSA9IHNjaGVtYS5fcmVzb2x2ZWRSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBzY2hlbWEuJHZhbGlkYXRlID0gc2NoZW1hLl9yZXNvbHZlZFJlZjtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uLCBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGNvbXBpbGVQYXR0ZXJuTWF0Y2hlciB9IGZyb20gXCIuLi91dGlscy9wYXR0ZXJuLW1hdGNoZXJcIjtcblxuY29uc3QgUEFUVEVSTl9NQVRDSF9DQUNIRV9MSU1JVCA9IDUxMjtcbmNvbnN0IEZPUk1BVF9SRVNVTFRfQ0FDSEVfTElNSVQgPSA1MTI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuTWF0Y2ggPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5NYXRjaCBhc1xuICAgICAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwYXR0ZXJuTWF0Y2hDYWNoZSA9IChzY2hlbWEgYXMgYW55KS5fcGF0dGVybk1hdGNoQ2FjaGUgYXNcbiAgICAgIHwgTWFwPHN0cmluZywgYm9vbGVhbj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTWF0Y2gpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKHNjaGVtYS5wYXR0ZXJuKTtcbiAgICAgICAgcGF0dGVybk1hdGNoID1cbiAgICAgICAgICBjb21waWxlZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgPyAodmFsdWU6IHN0cmluZykgPT4gY29tcGlsZWQudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgIDogY29tcGlsZWQ7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVybk1hdGNoXCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGF0dGVybk1hdGNoLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGF0dGVybk1hdGNoQ2FjaGUpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuTWF0Y2hDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXR0ZXJuTWF0Y2hDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9IHBhdHRlcm5NYXRjaChkYXRhKTtcbiAgICBpZiAocGF0dGVybk1hdGNoQ2FjaGUuc2l6ZSA8IFBBVFRFUk5fTUFUQ0hfQ0FDSEVfTElNSVQpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlLnNldChkYXRhLCBpc01hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGlmIHdlIHJlY2VpdmUgYSBmb3JtYXQgdGhhdCBpcyBub3QgZGVmaW5lZCwgd2VcbiAgLy8gd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIHdlIGp1c3QgaWdub3JlIGl0LlxuICBmb3JtYXQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0VmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2Zvcm1hdFZhbGlkYXRlIGFzXG4gICAgICB8IEZvcm1hdEZ1bmN0aW9uXG4gICAgICB8IGZhbHNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgYXNcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdFJlc3VsdENhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZSBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBib29sZWFuPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gaW5zdGFuY2UuaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuZm9ybWF0LFxuICAgICAgICBmb3JtYXRWYWxpZGF0ZVxuICAgICAgKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkXCIsIHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQpIHtcbiAgICAgIGlmIChmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmICghZm9ybWF0UmVzdWx0Q2FjaGUpIHtcbiAgICAgIGZvcm1hdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRSZXN1bHRDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRSZXN1bHRDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkID0gZm9ybWF0VmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKGZvcm1hdFJlc3VsdENhY2hlLnNpemUgPCBGT1JNQVRfUkVTVUxUX0NBQ0hFX0xJTUlUKSB7XG4gICAgICBmb3JtYXRSZXN1bHRDYWNoZS5zZXQoZGF0YSwgaXNWYWxpZCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgRm9ybWF0cyB9IGZyb20gXCIuL2Zvcm1hdHNcIjtcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuZXhwb3J0IHsgZGVlcENsb25lVW5mcmVlemUgYXMgZGVlcENsb25lIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHR5cGUgUmVzdWx0ID0gdm9pZCB8IFZhbGlkYXRpb25FcnJvciB8IHRydWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGwgfCB0cnVlO1xuICAgIHZhbGlkOiBib29sZWFuO1xuICB9O1xuICBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWE7XG59XG5cbmludGVyZmFjZSBWYWxpZGF0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWxpZGF0ZTogVmFsaWRhdGVGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKGZvcm1hdDogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChGb3JtYXRzIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+KVtmb3JtYXRdID09PSB2YWxpZGF0b3I7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBnZXRTY2hlbWFSZWYocGF0aDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlUGF0aCh0aGlzLnJvb3RTY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgZ2V0U2NoZW1hQnlJZChpZDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIHRoaXMuaWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgdGhpcy5yb290U2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgaWYgKChjb21waWxlZFNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwib25lT2ZcIixcbiAgICAgICAgICBjb21waWxlZFNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0ZhbHNlXCIsXG4gICAgICAgICAgKGRhdGEpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0FueVwiLFxuICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9BbnlcIixcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lVW5mcmVlemUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgcmVzID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlIShjbG9uZWREYXRhKTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBjbG9uZWREYXRhLCBlcnJvcjogcmVzLCB2YWxpZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IG51bGwsIHZhbGlkOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dBcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICBrZXk6IFwiYWxsT2ZcIiB8IFwiYW55T2ZcIixcbiAgICBicmFuY2hlczogYW55W11cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IG91dDogYW55W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBicmFuY2hlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKGtleSwgaXRlbVtrZXldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXN0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvdXQucHVzaChuZXN0ZWRbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihicmFuY2hlczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGN1cnJlbnQgPSBicmFuY2hlcztcblxuICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRbMF07XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChpdGVtKSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLm9uZU9mKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBpdGVtLm9uZU9mO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGxldCBub3JtYWxpemVkID0gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIGNvbnN0IGhhc09ubHlLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBzY2hlbWFLZXlzLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWFLZXlzWzBdID09PSBrZXk7XG5cbiAgICBjb25zdCBzZXROb3JtYWxpemVkID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gc2NoZW1hKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB7IC4uLnNjaGVtYSB9O1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEFsbE9mID0gdGhpcy5mbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICBzY2hlbWEuYWxsT2ZcbiAgICAgICkuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAhKFxuICAgICAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzT25seUtleShcImFsbE9mXCIpICYmXG4gICAgICAgIGZsYXR0ZW5lZEFsbE9mLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QoZmxhdHRlbmVkQWxsT2ZbMF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5lZEFsbE9mWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hhbGxvd0FycmF5RXF1YWxzKGZsYXR0ZW5lZEFsbE9mLCBzY2hlbWEuYWxsT2YpKSB7XG4gICAgICAgIHNldE5vcm1hbGl6ZWQoXCJhbGxPZlwiLCBmbGF0dGVuZWRBbGxPZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkQW55T2YgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKFxuICAgICAgICBcImFueU9mXCIsXG4gICAgICAgIHNjaGVtYS5hbnlPZlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBoYXNPbmx5S2V5KFwiYW55T2ZcIikgJiZcbiAgICAgICAgZmxhdHRlbmVkQW55T2YubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChmbGF0dGVuZWRBbnlPZlswXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbmVkQW55T2ZbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaGFsbG93QXJyYXlFcXVhbHMoZmxhdHRlbmVkQW55T2YsIHNjaGVtYS5hbnlPZikpIHtcbiAgICAgICAgc2V0Tm9ybWFsaXplZChcImFueU9mXCIsIGZsYXR0ZW5lZEFueU9mKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRPbmVPZiA9IHRoaXMuZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihzY2hlbWEub25lT2YpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc09ubHlLZXkoXCJvbmVPZlwiKSAmJlxuICAgICAgICBmbGF0dGVuZWRPbmVPZi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGZsYXR0ZW5lZE9uZU9mWzBdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRPbmVPZlswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNoYWxsb3dBcnJheUVxdWFscyhmbGF0dGVuZWRPbmVPZiwgc2NoZW1hLm9uZU9mKSkge1xuICAgICAgICBzZXROb3JtYWxpemVkKFwib25lT2ZcIiwgZmxhdHRlbmVkT25lT2YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2NoZW1hSGFzUmVmKHNjaGVtYTogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBpZiAoKHNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9oYXNSZWZcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gc2NoZW1hW2tleV07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICBjYXNlIFwidW5pcXVlSXRlbXNcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcbiAgICAgIGNhc2UgXCJwcm9wZXJ0aWVzXCI6XG4gICAgICBjYXNlIFwicGF0dGVyblByb3BlcnRpZXNcIjpcbiAgICAgIGNhc2UgXCJkZXBlbmRlbmNpZXNcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInByb3BlcnR5TmFtZXNcIjpcbiAgICAgIGNhc2UgXCJpdGVtc1wiOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjpcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZSAmJlxuICAgICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbEl0ZW1zXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpO1xuICAgICAgY2FzZSBcImFsbE9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFueU9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcXVpcmVkRGVmYXVsdHMoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gcHJvcGVydGllc1trZXlzW2ldXTtcbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc3ViU2NoZW1hKSAmJiBcImRlZmF1bHRcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RlZmF1bHRUeXBlVmFsaWRhdG9yKHR5cGU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFR5cGVzIGFzIFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPilbdHlwZV0gPT09IHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgYW55T2Y6IFt7fV0gfTsgLy8gQWx3YXlzIHZhbGlkXG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0geyBvbmVPZjogW10gfTsgLy8gQWx3YXlzIGludmFsaWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtzY2hlbWFdIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZW1hID0gdGhpcy5ub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYSk7XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSBkZWVwQ2xvbmVVbmZyZWV6ZShcbiAgICAgIHNjaGVtYVxuICAgICkgYXMgQ29tcGlsZWRTY2hlbWE7XG5cbiAgICBsZXQgc2NoZW1hSGFzUmVmID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYS4kaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuaWRSZWdpc3RyeS5zZXQoc2NoZW1hLiRpZCwgY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEpIHtcbiAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya1NjaGVtYUhhc1JlZihjb21waWxlZFNjaGVtYSk7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZGVmYXVsdFR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbGxUeXBlc0RlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLmlzRGVmYXVsdFR5cGVWYWxpZGF0b3IodHlwZSwgdmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgZGVmYXVsdFR5cGVOYW1lcy5wdXNoKHR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxUeXBlc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICkoXCJJbnZhbGlkIHR5cGUgZm9yIHNjaGVtYVwiLCB7IGRhdGE6IHNjaGVtYS50eXBlIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29tYmluZWRUeXBlVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICAgICAgbGV0IHR5cGVNZXRob2ROYW1lID0gXCJcIjtcblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAxICYmIGFsbFR5cGVzRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBzaW5nbGVUeXBlTmFtZSA9IGRlZmF1bHRUeXBlTmFtZXNbMF07XG4gICAgICAgIHR5cGVNZXRob2ROYW1lID0gc2luZ2xlVHlwZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoIChzaW5nbGVUeXBlTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2luZ2xlVHlwZUZuKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID4gMSAmJiBhbGxUeXBlc0RlZmF1bHQpIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSBkZWZhdWx0VHlwZU5hbWVzLmpvaW4oXCJfT1JfXCIpO1xuXG4gICAgICAgIGNvbnN0IGFsbG93c09iamVjdCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJvYmplY3RcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0FycmF5ID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImFycmF5XCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NTdHJpbmcgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwic3RyaW5nXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NOdW1iZXIgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NJbnRlZ2VyID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImludGVnZXJcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0Jvb2xlYW4gPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY29uc3QgYWxsb3dzTnVsbCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJudWxsXCIpO1xuXG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgZGF0YTtcblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c051bWJlciB8fCAoYWxsb3dzSW50ZWdlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRhdGEpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c1N0cmluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd3NCb29sZWFuKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzTnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93c09iamVjdCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiB0eXBlTWV0aG9kTmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IGdldE5hbWVkRnVuY3Rpb24odHlwZU1ldGhvZE5hbWUsIGNvbWJpbmVkVHlwZVZhbGlkYXRvcilcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IHRoaXMuaGFzUmVxdWlyZWREZWZhdWx0cyhzY2hlbWEpXG4gICAgICAgID8gWy4uLk9iamVjdC5rZXlzKG90aGVyS2V5cyksIFwicmVxdWlyZWRcIl1cbiAgICAgICAgOiBbXCJyZXF1aXJlZFwiLCAuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpXVxuICAgICAgOiBPYmplY3Qua2V5cyhvdGhlcktleXMpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoIWtleXdvcmRGbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICBrZXksXG4gICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICApO1xuICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiBmbk5hbWUsXG4gICAgICAgIHZhbGlkYXRlOiBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KGZuTmFtZSwgKGRhdGEpID0+XG4gICAgICAgICAgKGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24pKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICAgKVxuICAgICAgfSk7XG5cbiAgICAgIGFjdGl2ZU5hbWVzLnB1c2goZm5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsS2V5d29yZHMgPSBbXCJlbnVtXCIsIFwiY29uc3RcIiwgXCJkZWZhdWx0XCIsIFwiZXhhbXBsZXNcIl07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGlmIChsaXRlcmFsS2V5d29yZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzY2hlbWFba2V5XSAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcm9wZXJ0aWVzXCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyhzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBzY2hlbWFIYXNSZWYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGlsZWRTdWJTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gY29tcGlsZWRTdWJTY2hlbWE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWFba2V5XVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldW2ldKTtcbiAgICAgICAgICAgIGlmICgoY29tcGlsZWRTdWJTY2hlbWEgYXMgYW55KS5faGFzUmVmID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV1baV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYUhhc1JlZikge1xuICAgICAgdGhpcy5tYXJrU2NoZW1hSGFzUmVmKGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb21waWxlZFNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWxpZGF0b3JzWzBdO1xuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbih2Lm5hbWUsIHYudmFsaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb3NpdGVOYW1lID0gXCJWYWxpZGF0ZV9cIiArIGFjdGl2ZU5hbWVzLmpvaW4oXCJfQU5EX1wiKTtcblxuICAgICAgY29uc3QgbWFzdGVyVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbaV07XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2LnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3ViU2NoZW1hICYmXG4gICAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzdWJTY2hlbWEpXG4gICAgKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmIChzdWJLZXkgaW4gdGhpcy5rZXl3b3Jkcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbGlua1JlZmVyZW5jZXMocm9vdDogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBjb25zdCBzdGFjazogYW55W10gPSBbcm9vdF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBub2RlLiRyZWYgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgbm9kZS4kdmFsaWRhdGUubmFtZSA9PT0gXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZlBhdGggPSBub2RlLiRyZWYgYXMgc3RyaW5nO1xuXG4gICAgICAgIGxldCB0YXJnZXQ6IGFueSA9IHRoaXMuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0U2NoZW1hQnlJZChyZWZQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmICh0YXJnZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcIlZhbGlkYXRlX1JlZl9UcnVlXCIsICgpID0+IHt9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICAgICAgXCIkcmVmXCIsXG4gICAgICAgICAgICAgIG5vZGUgYXMgYW55LFxuICAgICAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb24oXG4gICAgICAgICAgICAgIFwiVmFsaWRhdGVfUmVmX0ZhbHNlXCIsXG4gICAgICAgICAgICAgIChfZGF0YTogYW55KSA9PiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IHRhcmdldC4kdmFsaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFQUMsWUFBWVIsR0FDVlMsTUFBTVQsR0FDTlUs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
1
+ {"version":3,"file":"index.min.js","names":["hasOwnPropertyIntrinsic","Object","prototype","hasOwnProperty","hasOwnPropertyCall","Function","call","bind","definePropertyOrThrow","target","key","descriptor","Reflect","defineProperty","TypeError","String","hasOwn","ValidationError","Error","code","message","item","keyword","cause","schemaPath","instancePath","data","schema","constructor","super","this","getCause","current","schemaPointer","instancePointer","seen","Set","has","add","escapeJsonPointerToken","getTree","root","node","getPath","FAIL_FAST_DEFINE_ERROR","getDefinedErrorFunctionForKey","failFast","KeywordError","getNamedFunction","options","value","replace","isCompiledSchema","subSchema","Array","isArray","name","fn","resolvePath","path","startsWith","parts","split","slice","part","decodeURIComponent","includes","definitions","defs","$id","endsWith","UUID_REGEX","DURATION_REGEX","URI_REGEX","EMAIL_REGEX","HOSTNAME_REGEX","TIME_REGEX","URI_REFERENCE_REGEX","IRI_REGEX","IRI_REFERENCE_REGEX","IDN_EMAIL_REGEX","IDN_HOSTNAME_REGEX","DAYS_IN_MONTH","parseTwoDigits","index","first","charCodeAt","second","parseFourDigits","a","b","c","d","isValidIpv4Range","start","end","segmentCount","segmentStart","i","segmentLength","j","digit","isHexCharCode","Formats","length","tCode","year","month","day","hour","minute","cursor","offsetSign","offsetHour","offsetMinute","fracStart","tzCode","maxDays","utcTotalMinutes","offsetTotalMinutes","uri","test","hasValidPercentEncoding","email","ipv4","isValidIpv4","ipv6","hasColon","hasDoubleColon","hextetCount","isValidIpv6","hostname","date","regex","RegExp","e","next","isValidJsonPointer","isValidRelativeJsonPointer","time","closeIndex","indexOf","isValidUriTemplate","duration","uuid","iri","Types","object","array","string","number","Number","isFinite","integer","boolean","null","timestamp","int8","uint8","int16","uint16","int32","uint32","float32","float64","hasChanged","prev","is","isUniquePrimitive","getArrayBucketKey","last","firstType","lastType","firstArrayMarker","firstSignature","getPrimitiveArraySignature","lastArrayMarker","lastSignature","getObjectShapeKey","keys","sort","join","signature","isNaN","ArrayKeywords","items","defineError","schemaItems","dataLength","schemaItemsLength","itemsLength","schemaItem","validate2","$validate","error","validate","elements","elementsSchema","minItems","maxItems","additionalItems","tupleLength","_tupleItemsLength","enumerable","configurable","writable","uniqueItems","len","left","right","firstPrimitive","primitiveSeen","primitiveArraySignatures","arrayBuckets","objectBuckets","hasFirstPrimitive","Map","bucketKey2","candidates2","get","set","push","bucketKey","candidates","contains","containsValidate","deepCloneUnfreeze","obj","cloneClassInstances","WeakMap","source","structuredClone","Buffer","proto","getPrototypeOf","isPlainObject","Date","ArrayBuffer","isView","cloned","clone","l","getTime","flags","entries","values","buffer","from","Promise","WeakSet","create","ownKeys","descriptors","getOwnPropertyDescriptors","NumberKeywords","minimum","instance","min","exclusiveMinimum","maximum","max","exclusiveMaximum","multipleOf","quotient","epsilon","Math","abs","areCloseEnough","round","REGEX_META_CHARS","hasRegexMeta","PATTERN_CACHE","compilePatternMatcher","pattern","cached","compiled","_value","patternLength","inner","PATTERN_KEY_CACHE_LIMIT","createApplyPropertyDefaults","replaceEmpty","defaultKeys","_defaultKeys","hasOwnValue","setDefault","properties","default","applyPropertyDefaults","applyEmptyPropertyDefaults","getPatternPropertyEntries","_patternPropertyEntries","patternProperties","patternKeys","compiledMatcher","match","schemaProp","getPatternKeyMatchIndexes","cache","_patternKeyMatchIndexCache","indexes","size","getBranchEntries","cacheKey","kind","evaluateAllOf","branches","branch","evaluateAnyOf","evaluateOneOf","validCount","winnerIndex","isValid","createCombinatorValidator","validateSubschema","transactions","sourceBranches","map","savepoint","rollback","defaultsByBranch","isolatedBranches","branchSavepoint","capture","result","restore","hasAtLeastCodePoints","limit","count","unit","nextUnit","keywords","required","propKeys","_propKeys","valueSchema","maxProperties","minProperties","additionalProperties","apValidate","_apValidate","patternEntries","matchingIndexes","propertyNames","pn","dependencies","dependency","then","else","$schema","title","description","$comment","examples","contentMediaType","contentEncoding","discriminator","nullable","minLength","units","maxLength","patternMatch","_patternMatch","patternMatchCache","_patternMatchCache","isMatch","format","formatValidate","_formatValidate","formatResultCacheEnabled","_formatResultCacheEnabled","formatResultCache","_formatResultCache","getFormat","isDefaultFormatValidator","enum","enumCache","_enumCache","primitiveSet","objectValues","list","enumItem","allOf","anyOf","oneOf","const","if","not","$ref","_resolvedRef","LOCAL_SCHEMA_BASE","FAIL_FAST_TYPE_VALIDATORS","isInteger","__EXPORTS__","SchemaShield","types","formats","immutable","useDefaults","rootSchema","maxDepth","validationContexts","compileCache","compilingRequiresContext","compilingMutableSchemas","type","validator","addType","addKeyword","addFormat","context","defaults","getOwnPropertyDescriptor","defaultSavepoint","rollbackDefaultSavepoint","rollbackDefaults","captureDefaultSavepoint","mutations","entry","restoreDefaults","mutation","overwrite","getType","getKeyword","getSchemaRef","getSchemaById","id","stack","pop","children","schemaChildren","depthError","schemaChildEntries","mapKeys","arrayKeys","singleKeys","childKey","child","pointer","escapePointerToken","registrySubschemaEntries","dependencyKey","resolveUri","reference","baseUri","URL","href","resourceUri","hashIndex","buildReferenceRegistry","aliases","positions","positionsByNode","freeze","register","existing","visited","inheritedBase","resourceRoot","position","resolveReferenceSource","ref","registry","resolvedUri","exactTarget","fragment","analyzeSchema","requiresDepthGuard","requiresMutationJournal","mutableSchemas","visiting","depth","exit","delete","hasPropertyDefaults","semanticState","semanticStack","state","mutationStack","mutationVisited","children2","hasCustomKeyword","some","compile","prepared","prepareSchema","compiledSchema","directValidate","clonedData","valid","createGuardedValidator","depthGuardState","referenceRegistry","analysis","compileSchema","installDepthGuards","_hasRef","linkReferences","isSchemaLike","reusableContext","active","depthExceeded","priorContext","isDepthError","isTrivialAlwaysValidSubschema","shallowArrayEquals","flattenAssociativeBranches","out","nested","flattenSingleWrapperOneOf","normalizeSchemaForCompile","normalized","schemaKeys","hasOnlyKey","setNormalized","flattenedAllOf","filter","flattenedAnyOf","flattenedOneOf","markSchemaHasRef","shouldSkipKeyword","propertyKeys","isDefaultTypeValidator","nextDepth","compiledFalse","sourceSchema","schemaCanApplyDefaults","schemaHasRef","refValidator","isBuiltinRef","compiledDefinitions","definitionKey","validators","activeNames","pendingCombinators","applyDefaults","defineTypeError","t","trim","typeFunctions","typeNames","defaultTypeNames","combinedTypeValidator","allTypesDefault","type2","typeMethodName","singleTypeName","fallback","allowsObject","allowsArray","allowsString","allowsNumber","allowsInteger","allowsBoolean","allowsNull","dataType","singleTypeFn","otherKeys","otherKeyNames","keyOrder","keywordFn","fnName","keywordValidate","literalKeywords","compiledSubSchema","subKey","compiledSubSchema2","property","prepareCombinatorEntries","pending","_canApplyDefaults","v","compositeName","masterValidator","getCompiledReferenceTarget","compiledResource","targetValidate","deepClone","module","exports","self"],"sources":["index.browser.js"],"sourcesContent":["(()=>{// lib/utils/main-utils.ts\nvar hasOwnPropertyIntrinsic = Object.prototype.hasOwnProperty;\nvar hasOwnPropertyCall = Function.prototype.call.bind(\n hasOwnPropertyIntrinsic\n);\nfunction definePropertyOrThrow(target, key, descriptor) {\n if (!Reflect.defineProperty(target, key, descriptor)) {\n throw new TypeError(`Cannot define property \"${String(key)}\"`);\n }\n return target;\n}\nfunction hasOwn(target, key) {\n return hasOwnPropertyCall(target, key);\n}\nvar ValidationError = class extends Error {\n code;\n message;\n item;\n keyword;\n cause;\n schemaPath = \"\";\n instancePath = \"\";\n data;\n schema;\n constructor(message) {\n super(message);\n this.message = message;\n }\n getCause() {\n let current = this;\n let schemaPointer = \"#\";\n let instancePointer = \"#\";\n const seen = /* @__PURE__ */ new Set();\n while (!seen.has(current)) {\n seen.add(current);\n let schemaPath = `${schemaPointer}/${current.keyword}`;\n let instancePath = instancePointer;\n if (typeof current.item !== \"undefined\") {\n if (typeof current.item === \"string\" && current.schema && typeof current.schema === \"object\" && current.item in current.schema) {\n schemaPath += `/${escapeJsonPointerToken(current.item)}`;\n }\n instancePath += `/${escapeJsonPointerToken(current.item)}`;\n }\n current.schemaPath = schemaPath;\n current.instancePath = instancePath;\n if (!(current.cause instanceof ValidationError) || seen.has(current.cause)) {\n return current;\n }\n schemaPointer = schemaPath;\n instancePointer = instancePath;\n current = current.cause;\n }\n return current;\n }\n getTree() {\n this.getCause();\n let current = this;\n let root;\n let target;\n const seen = /* @__PURE__ */ new Set();\n while (current && !seen.has(current)) {\n seen.add(current);\n const node = {\n message: current.message,\n keyword: current.keyword,\n item: current.item,\n schemaPath: current.schemaPath,\n instancePath: current.instancePath,\n data: current.data\n };\n if (!root) {\n root = node;\n } else if (target) {\n target.cause = node;\n }\n target = node;\n current = current.cause instanceof ValidationError ? current.cause : void 0;\n }\n return root;\n }\n getPath() {\n const cause = this.getCause();\n return {\n schemaPath: cause.schemaPath,\n instancePath: cause.instancePath\n };\n }\n};\nvar FAIL_FAST_DEFINE_ERROR = () => true;\nfunction getDefinedErrorFunctionForKey(key, schema, failFast) {\n if (failFast) {\n return FAIL_FAST_DEFINE_ERROR;\n }\n const KeywordError = new ValidationError(`Invalid ${key}`);\n KeywordError.keyword = key;\n KeywordError.schema = schema;\n const defineError = (message, options = {}) => {\n KeywordError.message = message;\n KeywordError.code = options.code;\n KeywordError.item = options.item;\n if (options.cause !== KeywordError) {\n KeywordError.cause = options.cause && options.cause !== true ? options.cause : void 0;\n }\n KeywordError.data = options.data;\n return KeywordError;\n };\n return getNamedFunction(\n `defineError_${key}`,\n defineError\n );\n}\nfunction escapeJsonPointerToken(value) {\n return String(value).replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n}\nfunction isCompiledSchema(subSchema) {\n return !!subSchema && typeof subSchema === \"object\" && !Array.isArray(subSchema) && \"$validate\" in subSchema;\n}\nfunction getNamedFunction(name, fn) {\n return definePropertyOrThrow(fn, \"name\", { value: name });\n}\nfunction resolvePath(root, path) {\n if (!path || path === \"#\") {\n return root;\n }\n if (path.startsWith(\"#/\")) {\n const parts = path.split(\"/\").slice(1);\n let current = root;\n for (const part of parts) {\n const decodedUriPart = decodeURIComponent(part);\n const key = decodedUriPart.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n if (current && typeof current === \"object\" && key in current) {\n current = current[key];\n } else {\n return;\n }\n }\n return current;\n }\n if (!path.includes(\"#\")) {\n if (root.definitions && root.definitions[path]) {\n return root.definitions[path];\n }\n if (root.defs && root.defs[path]) {\n return root.defs[path];\n }\n if (root.$id && typeof root.$id === \"string\") {\n if (root.$id === path || root.$id.endsWith(\"/\" + path)) {\n return root;\n }\n }\n }\n return;\n}\nfunction areCloseEnough(a, b, epsilon = 1e-15) {\n return Math.abs(a - b) <= epsilon * Math.max(Math.abs(a), Math.abs(b));\n}\n\n// lib/formats.ts\nvar UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nvar DURATION_REGEX = /^P(?!$)((\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?)(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?$/;\nvar URI_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:[^\\s]*$/;\nvar EMAIL_REGEX = /^(?!\\.)(?!.*\\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i;\nvar HOSTNAME_REGEX = /^[a-z0-9][a-z0-9-]{0,62}(?:\\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i;\nvar TIME_REGEX = /^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(\\.\\d+)?(Z|([+-])([01]\\d|2[0-3]):([0-5]\\d))$/;\nvar URI_REFERENCE_REGEX = /^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#((?![^#]*\\\\)[^#]*))?/i;\nvar IRI_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:[^\\s]*$/;\nvar IRI_REFERENCE_REGEX = /^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#((?![^#]*\\\\)[^#]*))?/i;\nvar IDN_EMAIL_REGEX = /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/;\nvar IDN_HOSTNAME_REGEX = /^[^\\s!@#$%^&*()_+\\=\\[\\]{};':\"\\\\|,<>\\/?]+$/;\nvar DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction isDigitCharCode(code) {\n return code >= 48 && code <= 57;\n}\nfunction parseTwoDigits(data, index) {\n const first = data.charCodeAt(index) - 48;\n const second = data.charCodeAt(index + 1) - 48;\n if (first < 0 || first > 9 || second < 0 || second > 9) {\n return -1;\n }\n return first * 10 + second;\n}\nfunction parseFourDigits(data, index) {\n const a = data.charCodeAt(index) - 48;\n const b = data.charCodeAt(index + 1) - 48;\n const c = data.charCodeAt(index + 2) - 48;\n const d = data.charCodeAt(index + 3) - 48;\n if (a < 0 || a > 9 || b < 0 || b > 9 || c < 0 || c > 9 || d < 0 || d > 9) {\n return -1;\n }\n return a * 1e3 + b * 100 + c * 10 + d;\n}\nfunction isValidIpv4Range(data, start, end) {\n let segmentCount = 0;\n let segmentStart = start;\n for (let i = start; i <= end; i++) {\n if (i !== end && data.charCodeAt(i) !== 46) {\n continue;\n }\n const segmentLength = i - segmentStart;\n if (segmentLength < 1 || segmentLength > 3) {\n return false;\n }\n if (segmentLength > 1 && data.charCodeAt(segmentStart) === 48) {\n return false;\n }\n let value = 0;\n for (let j = segmentStart; j < i; j++) {\n const digit = data.charCodeAt(j) - 48;\n if (digit < 0 || digit > 9) {\n return false;\n }\n value = value * 10 + digit;\n }\n if (value > 255) {\n return false;\n }\n segmentCount++;\n segmentStart = i + 1;\n }\n return segmentCount === 4;\n}\nfunction isValidIpv4(data) {\n return isValidIpv4Range(data, 0, data.length);\n}\nfunction isHexCharCode(code) {\n return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;\n}\nfunction hasValidPercentEncoding(data) {\n for (let index = 0; index < data.length; index++) {\n const code = data.charCodeAt(index);\n if (code === 92) {\n return false;\n }\n if (code !== 37) {\n continue;\n }\n if (index + 2 >= data.length || !isHexCharCode(data.charCodeAt(index + 1)) || !isHexCharCode(data.charCodeAt(index + 2))) {\n return false;\n }\n index += 2;\n }\n return true;\n}\nfunction isValidIpv6(data) {\n const length = data.length;\n if (length === 0) {\n return false;\n }\n let hasColon = false;\n let hasDoubleColon = false;\n let hextetCount = 0;\n let i = 0;\n while (i < length) {\n if (data.charCodeAt(i) === 58) {\n hasColon = true;\n if (i + 1 < length && data.charCodeAt(i + 1) === 58) {\n if (hasDoubleColon) {\n return false;\n }\n hasDoubleColon = true;\n i += 2;\n if (i === length) {\n break;\n }\n continue;\n }\n return false;\n }\n const segmentStart = i;\n let segmentLength = 0;\n while (i < length && isHexCharCode(data.charCodeAt(i))) {\n segmentLength++;\n if (segmentLength > 4) {\n return false;\n }\n i++;\n }\n if (segmentLength === 0) {\n return false;\n }\n if (i < length && data.charCodeAt(i) === 46) {\n if (!hasColon) {\n return false;\n }\n if (!isValidIpv4Range(data, segmentStart, length)) {\n return false;\n }\n if (hasDoubleColon) {\n return hextetCount < 6;\n }\n return hextetCount === 6;\n }\n hextetCount++;\n if (hextetCount > 8) {\n return false;\n }\n if (i === length) {\n break;\n }\n if (data.charCodeAt(i) !== 58) {\n return false;\n }\n hasColon = true;\n i++;\n if (i === length) {\n return false;\n }\n if (data.charCodeAt(i) === 58) {\n if (hasDoubleColon) {\n return false;\n }\n hasDoubleColon = true;\n i++;\n if (i === length) {\n break;\n }\n }\n }\n if (!hasColon) {\n return false;\n }\n if (hasDoubleColon) {\n return hextetCount < 8;\n }\n return hextetCount === 8;\n}\nfunction isValidJsonPointer(data) {\n if (data === \"\") {\n return true;\n }\n if (data.charCodeAt(0) !== 47) {\n return false;\n }\n for (let i = 1; i < data.length; i++) {\n if (data.charCodeAt(i) !== 126) {\n continue;\n }\n const next = data.charCodeAt(i + 1);\n if (next !== 48 && next !== 49) {\n return false;\n }\n i++;\n }\n return true;\n}\nfunction isValidRelativeJsonPointer(data) {\n if (data.length === 0) {\n return false;\n }\n let i = 0;\n while (i < data.length) {\n const code = data.charCodeAt(i);\n if (code < 48 || code > 57) {\n break;\n }\n i++;\n }\n if (i === 0) {\n return false;\n }\n if (i > 1 && data.charCodeAt(0) === 48) {\n return false;\n }\n if (i === data.length) {\n return true;\n }\n if (data.charCodeAt(i) === 35) {\n return i + 1 === data.length;\n }\n if (data.charCodeAt(i) !== 47) {\n return false;\n }\n for (i = i + 1; i < data.length; i++) {\n if (data.charCodeAt(i) !== 126) {\n continue;\n }\n const next = data.charCodeAt(i + 1);\n if (next !== 48 && next !== 49) {\n return false;\n }\n i++;\n }\n return true;\n}\nfunction isValidUriTemplate(data) {\n for (let i = 0; i < data.length; i++) {\n const code = data.charCodeAt(i);\n if (code === 125) {\n return false;\n }\n if (code !== 123) {\n continue;\n }\n const closeIndex = data.indexOf(\"}\", i + 1);\n if (closeIndex === -1 || closeIndex === i + 1) {\n return false;\n }\n i = closeIndex;\n }\n return true;\n}\nvar Formats = {\n [\"date-time\"](data) {\n const length = data.length;\n if (length < 19) {\n return false;\n }\n if (data.charCodeAt(4) !== 45 || data.charCodeAt(7) !== 45 || data.charCodeAt(13) !== 58 || data.charCodeAt(16) !== 58) {\n return false;\n }\n const tCode = data.charCodeAt(10);\n if (tCode !== 84 && tCode !== 116) {\n return false;\n }\n const year = parseFourDigits(data, 0);\n const month = parseTwoDigits(data, 5);\n const day = parseTwoDigits(data, 8);\n const hour = parseTwoDigits(data, 11);\n const minute = parseTwoDigits(data, 14);\n const second = parseTwoDigits(data, 17);\n if (year < 0 || month < 0 || day < 0 || hour < 0 || minute < 0 || second < 0) {\n return false;\n }\n if (hour > 23 || minute > 59 || second > 60) {\n return false;\n }\n let cursor = 19;\n let offsetSign = null;\n let offsetHour = 0;\n let offsetMinute = 0;\n if (cursor < length && data.charCodeAt(cursor) === 46) {\n cursor++;\n const fracStart = cursor;\n while (cursor < length && isDigitCharCode(data.charCodeAt(cursor))) {\n cursor++;\n }\n if (cursor === fracStart) {\n return false;\n }\n }\n if (cursor < length) {\n const tzCode = data.charCodeAt(cursor);\n if (tzCode === 90 || tzCode === 122) {\n cursor++;\n } else if (tzCode === 43 || tzCode === 45) {\n offsetSign = tzCode === 43 ? \"+\" : \"-\";\n if (cursor + 6 > length || data.charCodeAt(cursor + 3) !== 58) {\n return false;\n }\n offsetHour = parseTwoDigits(data, cursor + 1);\n offsetMinute = parseTwoDigits(data, cursor + 4);\n if (offsetHour < 0 || offsetMinute < 0 || offsetHour > 23 || offsetMinute > 59) {\n return false;\n }\n cursor += 6;\n } else {\n return false;\n }\n }\n if (cursor !== length) {\n return false;\n }\n if (month < 1 || month > 12) {\n return false;\n }\n if (day < 1) {\n return false;\n }\n const maxDays = month === 2 ? year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28 : DAYS_IN_MONTH[month - 1];\n if (!maxDays || day > maxDays) {\n return false;\n }\n if (second === 60) {\n let utcTotalMinutes = hour * 60 + minute;\n if (offsetSign) {\n const offsetTotalMinutes = offsetHour * 60 + offsetMinute;\n utcTotalMinutes += offsetSign === \"+\" ? -offsetTotalMinutes : offsetTotalMinutes;\n utcTotalMinutes %= 24 * 60;\n if (utcTotalMinutes < 0) {\n utcTotalMinutes += 24 * 60;\n }\n }\n if (utcTotalMinutes !== 23 * 60 + 59) {\n return false;\n }\n }\n return true;\n },\n uri(data) {\n return URI_REGEX.test(data) && hasValidPercentEncoding(data);\n },\n email(data) {\n return EMAIL_REGEX.test(data);\n },\n ipv4(data) {\n return isValidIpv4(data);\n },\n ipv6(data) {\n return isValidIpv6(data);\n },\n hostname(data) {\n return HOSTNAME_REGEX.test(data);\n },\n date(data) {\n if (data.length !== 10 || data.charCodeAt(4) !== 45 || data.charCodeAt(7) !== 45) {\n return false;\n }\n const year = parseFourDigits(data, 0);\n const month = parseTwoDigits(data, 5);\n const day = parseTwoDigits(data, 8);\n if (year < 0 || month < 1 || month > 12) {\n return false;\n }\n if (day < 1) {\n return false;\n }\n const maxDays = month === 2 ? year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28 : DAYS_IN_MONTH[month - 1];\n return !!maxDays && day <= maxDays;\n },\n regex(data) {\n try {\n new RegExp(data);\n return true;\n } catch (e) {\n return false;\n }\n },\n \"json-pointer\"(data) {\n return isValidJsonPointer(data);\n },\n \"relative-json-pointer\"(data) {\n return isValidRelativeJsonPointer(data);\n },\n time(data) {\n return TIME_REGEX.test(data);\n },\n \"uri-reference\"(data) {\n if (data.includes(\"\\\\\")) {\n return false;\n }\n return URI_REFERENCE_REGEX.test(data);\n },\n \"uri-template\"(data) {\n return isValidUriTemplate(data);\n },\n duration(data) {\n return DURATION_REGEX.test(data);\n },\n uuid(data) {\n return UUID_REGEX.test(data);\n },\n // IRI is like URI but allows Unicode. We reuse a permissive logic.\n iri(data) {\n return IRI_REGEX.test(data);\n },\n \"iri-reference\"(data) {\n if (data.includes(\"\\\\\")) {\n return false;\n }\n return IRI_REFERENCE_REGEX.test(data);\n },\n // Best-effort structural validation for IDN (no punycode/tables)\n \"idn-email\"(data) {\n return IDN_EMAIL_REGEX.test(data);\n },\n \"idn-hostname\"(data) {\n return IDN_HOSTNAME_REGEX.test(data);\n }\n};\n\n// lib/types.ts\nvar Types = {\n object(data) {\n return data !== null && typeof data === \"object\" && !Array.isArray(data);\n },\n array(data) {\n return Array.isArray(data);\n },\n string(data) {\n return typeof data === \"string\";\n },\n number(data) {\n return typeof data === \"number\" && Number.isFinite(data);\n },\n integer(data) {\n return typeof data === \"number\" && Number.isFinite(data) && data % 1 === 0;\n },\n boolean(data) {\n return typeof data === \"boolean\";\n },\n null(data) {\n return data === null;\n },\n // Not implemented yet\n timestamp: false,\n int8: false,\n uint8: false,\n int16: false,\n uint16: false,\n int32: false,\n uint32: false,\n float32: false,\n float64: false\n};\n\n// lib/utils/has-changed.ts\nfunction hasChanged(prev, current) {\n if (Object.is(prev, current)) {\n return false;\n }\n if (Array.isArray(prev)) {\n if (Array.isArray(current) === false) {\n return true;\n }\n if (prev.length !== current.length) {\n return true;\n }\n for (let i = 0; i < current.length; i++) {\n if (hasChanged(prev[i], current[i])) {\n return true;\n }\n }\n return false;\n }\n if (typeof prev === \"object\" && prev !== null) {\n if (typeof current !== \"object\" || current === null) {\n return true;\n }\n for (const key in current) {\n if (hasChanged(prev[key], current[key])) {\n return true;\n }\n }\n for (const key in prev) {\n if (key in current) {\n continue;\n }\n if (hasChanged(prev[key], void 0)) {\n return true;\n }\n }\n return false;\n }\n return true;\n}\n\n// lib/keywords/array-keywords.ts\nfunction isUniquePrimitive(value) {\n return value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\nfunction getArrayBucketKey(value) {\n const length = value.length;\n if (length === 0) {\n return \"0\";\n }\n const first = value[0];\n const last = value[length - 1];\n const firstType = first === null ? \"null\" : typeof first;\n const lastType = last === null ? \"null\" : typeof last;\n let firstArrayMarker = \"\";\n if (Array.isArray(first)) {\n const firstSignature = getPrimitiveArraySignature(first);\n firstArrayMarker = firstSignature === null ? `a:${first.length}` : firstSignature;\n }\n let lastArrayMarker = \"\";\n if (Array.isArray(last)) {\n const lastSignature = getPrimitiveArraySignature(last);\n lastArrayMarker = lastSignature === null ? `a:${last.length}` : lastSignature;\n }\n return `${length}:${firstType}:${firstArrayMarker}:${lastType}:${lastArrayMarker}`;\n}\nfunction getObjectShapeKey(value) {\n const keys = Object.keys(value).sort();\n return `${keys.length}:${keys.join(\"\u0001\")}`;\n}\nfunction getPrimitiveArraySignature(value) {\n const length = value.length;\n if (length === 0) {\n return \"a:0\";\n }\n if (!isUniquePrimitive(value[0]) || !isUniquePrimitive(value[length - 1])) {\n return null;\n }\n let signature = `a:${length}:`;\n for (let i = 0; i < length; i++) {\n const item = value[i];\n if (item === null) {\n signature += \"l;\";\n continue;\n }\n if (typeof item === \"string\") {\n signature += `s${item.length}:${item};`;\n continue;\n }\n if (typeof item === \"number\") {\n if (Number.isNaN(item)) {\n signature += \"n:NaN;\";\n continue;\n }\n if (Object.is(item, -0)) {\n signature += \"n:-0;\";\n continue;\n }\n signature += `n:${item};`;\n continue;\n }\n if (typeof item === \"boolean\") {\n signature += item ? \"b:1;\" : \"b:0;\";\n continue;\n }\n return null;\n }\n return signature;\n}\nvar ArrayKeywords = {\n // lib/keywords/array-keywords.ts\n items(schema, data, defineError) {\n if (!Array.isArray(data)) {\n return;\n }\n const schemaItems = schema.items;\n const dataLength = data.length;\n if (typeof schemaItems === \"boolean\") {\n if (schemaItems === false && dataLength > 0) {\n return defineError(\"Array items are not allowed\", { data });\n }\n return;\n }\n if (Array.isArray(schemaItems)) {\n const schemaItemsLength = schemaItems.length;\n const itemsLength = schemaItemsLength < dataLength ? schemaItemsLength : dataLength;\n for (let i = 0; i < itemsLength; i++) {\n const schemaItem = schemaItems[i];\n if (typeof schemaItem === \"boolean\") {\n if (schemaItem === false && data[i] !== void 0) {\n return defineError(\"Array item is not allowed\", {\n item: i,\n data: data[i]\n });\n }\n continue;\n }\n const validate2 = schemaItem && schemaItem.$validate;\n if (typeof validate2 === \"function\") {\n const error = validate2(data[i]);\n if (error) {\n return defineError(\"Array item is invalid\", {\n item: i,\n cause: error,\n data: data[i]\n });\n }\n }\n }\n return;\n }\n const validate = schemaItems && schemaItems.$validate;\n if (typeof validate !== \"function\") {\n return;\n }\n for (let i = 0; i < dataLength; i++) {\n const error = validate(data[i]);\n if (error) {\n return defineError(\"Array item is invalid\", {\n item: i,\n cause: error,\n data: data[i]\n });\n }\n }\n },\n elements(schema, data, defineError) {\n if (!Array.isArray(data)) {\n return;\n }\n const elementsSchema = schema.elements;\n const validate = elementsSchema && elementsSchema.$validate;\n if (typeof validate !== \"function\") {\n return;\n }\n for (let i = 0; i < data.length; i++) {\n const error = validate(data[i]);\n if (error) {\n return defineError(\"Array item is invalid\", {\n item: i,\n cause: error,\n data: data[i]\n });\n }\n }\n },\n minItems(schema, data, defineError) {\n if (!Array.isArray(data) || data.length >= schema.minItems) {\n return;\n }\n return defineError(\"Array is too short\", { data });\n },\n maxItems(schema, data, defineError) {\n if (!Array.isArray(data) || data.length <= schema.maxItems) {\n return;\n }\n return defineError(\"Array is too long\", { data });\n },\n additionalItems(schema, data, defineError) {\n if (!Array.isArray(data) || !Array.isArray(schema.items)) {\n return;\n }\n let tupleLength = schema._tupleItemsLength;\n if (tupleLength === void 0) {\n tupleLength = schema.items.length;\n definePropertyOrThrow(schema, \"_tupleItemsLength\", {\n value: tupleLength,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n if (data.length <= tupleLength) {\n return;\n }\n if (schema.additionalItems === false) {\n return defineError(\"Array is too long\", { data });\n }\n if (schema.additionalItems && typeof schema.additionalItems === \"object\" && !Array.isArray(schema.additionalItems)) {\n if (isCompiledSchema(schema.additionalItems)) {\n for (let i = tupleLength; i < data.length; i++) {\n const error = schema.additionalItems.$validate(data[i]);\n if (error) {\n return defineError(\"Array item is invalid\", {\n item: i,\n cause: error,\n data: data[i]\n });\n }\n }\n return;\n }\n return;\n }\n return;\n },\n uniqueItems(schema, data, defineError) {\n if (!Array.isArray(data) || !schema.uniqueItems) {\n return;\n }\n const len = data.length;\n if (len <= 1) {\n return;\n }\n if (len <= 8) {\n for (let i = 0; i < len; i++) {\n const left = data[i];\n for (let j = i + 1; j < len; j++) {\n const right = data[j];\n if (left === right) {\n return defineError(\"Array items are not unique\", { data: right });\n }\n if (typeof left === \"number\" && typeof right === \"number\" && Number.isNaN(left) && Number.isNaN(right)) {\n return defineError(\"Array items are not unique\", { data: right });\n }\n if (left && right && typeof left === \"object\" && typeof right === \"object\" && !hasChanged(left, right)) {\n return defineError(\"Array items are not unique\", { data: right });\n }\n }\n }\n return;\n }\n let hasFirstPrimitive = false;\n let firstPrimitive;\n let primitiveSeen;\n let primitiveArraySignatures;\n let arrayBuckets;\n let objectBuckets;\n for (let i = 0; i < len; i++) {\n const item = data[i];\n if (isUniquePrimitive(item)) {\n if (!hasFirstPrimitive) {\n hasFirstPrimitive = true;\n firstPrimitive = item;\n continue;\n }\n if (!primitiveSeen) {\n primitiveSeen = /* @__PURE__ */ new Set([firstPrimitive]);\n }\n if (primitiveSeen.has(item)) {\n return defineError(\"Array items are not unique\", { data: item });\n }\n primitiveSeen.add(item);\n continue;\n }\n if (!item || typeof item !== \"object\") {\n continue;\n }\n if (Array.isArray(item)) {\n const signature = getPrimitiveArraySignature(item);\n if (signature !== null) {\n if (!primitiveArraySignatures) {\n primitiveArraySignatures = /* @__PURE__ */ new Set();\n }\n if (primitiveArraySignatures.has(signature)) {\n return defineError(\"Array items are not unique\", { data: item });\n }\n primitiveArraySignatures.add(signature);\n continue;\n }\n if (!arrayBuckets) {\n arrayBuckets = /* @__PURE__ */ new Map();\n }\n const bucketKey2 = getArrayBucketKey(item);\n let candidates2 = arrayBuckets.get(bucketKey2);\n if (!candidates2) {\n candidates2 = [];\n arrayBuckets.set(bucketKey2, candidates2);\n }\n for (let j = 0; j < candidates2.length; j++) {\n if (!hasChanged(candidates2[j], item)) {\n return defineError(\"Array items are not unique\", { data: item });\n }\n }\n candidates2.push(item);\n continue;\n }\n if (!objectBuckets) {\n objectBuckets = /* @__PURE__ */ new Map();\n }\n const bucketKey = getObjectShapeKey(item);\n let candidates = objectBuckets.get(bucketKey);\n if (!candidates) {\n candidates = [];\n objectBuckets.set(bucketKey, candidates);\n }\n for (let j = 0; j < candidates.length; j++) {\n if (!hasChanged(candidates[j], item)) {\n return defineError(\"Array items are not unique\", { data: item });\n }\n }\n candidates.push(item);\n }\n },\n contains(schema, data, defineError) {\n if (!Array.isArray(data)) {\n return;\n }\n if (typeof schema.contains === \"boolean\") {\n if (schema.contains) {\n if (data.length === 0) {\n return defineError(\"Array must contain at least one item\", { data });\n }\n return;\n }\n return defineError(\"Array must not contain any items\", { data });\n }\n const containsValidate = schema.contains.$validate;\n for (let i = 0; i < data.length; i++) {\n const error = containsValidate(data[i]);\n if (!error) {\n return;\n }\n continue;\n }\n return defineError(\"Array must contain at least one item\", { data });\n }\n};\n\n// lib/utils/deep-freeze.ts\nfunction isPlainObject(value) {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Reflect.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\nfunction canUseStructuredClone(value) {\n if (typeof structuredClone !== \"function\") {\n return false;\n }\n if (typeof Buffer !== \"undefined\" && value instanceof Buffer) {\n return false;\n }\n return Array.isArray(value) || isPlainObject(value) || value instanceof Date || value instanceof RegExp || value instanceof Map || value instanceof Set || value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\nfunction deepCloneUnfreeze(obj, cloneClassInstances = false, seen = /* @__PURE__ */ new WeakMap()) {\n if (typeof obj === \"undefined\" || obj === null || typeof obj !== \"object\") {\n return obj;\n }\n const source = obj;\n if (seen.has(source)) {\n return seen.get(source);\n }\n if (canUseStructuredClone(source)) {\n const cloned = structuredClone(source);\n seen.set(source, cloned);\n return cloned;\n }\n let clone;\n switch (true) {\n case Array.isArray(source): {\n clone = [];\n seen.set(source, clone);\n for (let i = 0, l = source.length; i < l; i++) {\n clone[i] = deepCloneUnfreeze(source[i], cloneClassInstances, seen);\n }\n return clone;\n }\n case source instanceof Date: {\n clone = new Date(source.getTime());\n seen.set(source, clone);\n return clone;\n }\n case source instanceof RegExp: {\n clone = new RegExp(source.source, source.flags);\n seen.set(source, clone);\n return clone;\n }\n case source instanceof Map: {\n clone = /* @__PURE__ */ new Map();\n seen.set(source, clone);\n for (const [key, value] of source.entries()) {\n clone.set(\n deepCloneUnfreeze(key, cloneClassInstances, seen),\n deepCloneUnfreeze(value, cloneClassInstances, seen)\n );\n }\n return clone;\n }\n case source instanceof Set: {\n clone = /* @__PURE__ */ new Set();\n seen.set(source, clone);\n for (const value of source.values()) {\n clone.add(deepCloneUnfreeze(value, cloneClassInstances, seen));\n }\n return clone;\n }\n case source instanceof ArrayBuffer: {\n clone = source.slice(0);\n seen.set(source, clone);\n return clone;\n }\n case ArrayBuffer.isView(source): {\n clone = new source.constructor(source.buffer.slice(0));\n seen.set(source, clone);\n return clone;\n }\n case (typeof Buffer !== \"undefined\" && source instanceof Buffer): {\n clone = Buffer.from(source);\n seen.set(source, clone);\n return clone;\n }\n case source instanceof Error: {\n clone = new source.constructor(source.message);\n seen.set(source, clone);\n break;\n }\n case (source instanceof Promise || source instanceof WeakMap || source instanceof WeakSet): {\n clone = source;\n seen.set(source, clone);\n return clone;\n }\n case (source.constructor && source.constructor !== Object): {\n if (!cloneClassInstances) {\n clone = source;\n seen.set(source, clone);\n return clone;\n }\n clone = Object.create(Reflect.getPrototypeOf(source));\n seen.set(source, clone);\n break;\n }\n default: {\n clone = {};\n seen.set(source, clone);\n const keys = Reflect.ownKeys(source);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n clone[key] = deepCloneUnfreeze(\n source[key],\n cloneClassInstances,\n seen\n );\n }\n return clone;\n }\n }\n const descriptors = Object.getOwnPropertyDescriptors(source);\n for (const key of Reflect.ownKeys(descriptors)) {\n const descriptor = descriptors[key];\n if (\"value\" in descriptor) {\n descriptor.value = deepCloneUnfreeze(\n descriptor.value,\n cloneClassInstances,\n seen\n );\n }\n definePropertyOrThrow(clone, key, descriptor);\n }\n return clone;\n}\n\n// lib/keywords/number-keywords.ts\nvar NumberKeywords = {\n minimum(schema, data, defineError, instance) {\n if (typeof data !== \"number\") {\n return;\n }\n if (!Number.isFinite(data)) {\n return defineError(\"Value must be finite\", { data });\n }\n let min = schema.minimum;\n if (typeof schema.exclusiveMinimum === \"number\") {\n min = schema.exclusiveMinimum + 1e-15;\n } else if (schema.exclusiveMinimum === true) {\n min += 1e-15;\n }\n if (data < min) {\n return defineError(\"Value is less than the minimum\", { data });\n }\n return;\n },\n maximum(schema, data, defineError, instance) {\n if (typeof data !== \"number\") {\n return;\n }\n if (!Number.isFinite(data)) {\n return defineError(\"Value must be finite\", { data });\n }\n let max = schema.maximum;\n if (typeof schema.exclusiveMaximum === \"number\") {\n max = schema.exclusiveMaximum - 1e-15;\n } else if (schema.exclusiveMaximum === true) {\n max -= 1e-15;\n }\n if (data > max) {\n return defineError(\"Value is greater than the maximum\", { data });\n }\n return;\n },\n multipleOf(schema, data, defineError, instance) {\n if (typeof data !== \"number\") {\n return;\n }\n if (!Number.isFinite(data) || !Number.isFinite(schema.multipleOf) || schema.multipleOf <= 0) {\n return defineError(\"Value must use a finite positive multipleOf\", {\n data\n });\n }\n const quotient = data / schema.multipleOf;\n const valid = Number.isFinite(quotient) ? areCloseEnough(quotient, Math.round(quotient)) : data % schema.multipleOf === 0;\n if (!valid) {\n return defineError(\"Value is not a multiple of the multipleOf\", { data });\n }\n return;\n },\n exclusiveMinimum(schema, data, defineError, instance) {\n if (typeof data !== \"number\" || typeof schema.exclusiveMinimum !== \"number\" || \"minimum\" in schema) {\n return;\n }\n if (data <= schema.exclusiveMinimum + 1e-15) {\n return defineError(\"Value is less than or equal to the exclusiveMinimum\");\n }\n return;\n },\n exclusiveMaximum(schema, data, defineError, instance) {\n if (typeof data !== \"number\" || typeof schema.exclusiveMaximum !== \"number\" || \"maximum\" in schema) {\n return;\n }\n if (data >= schema.exclusiveMaximum) {\n return defineError(\n \"Value is greater than or equal to the exclusiveMaximum\",\n { data }\n );\n }\n return;\n }\n};\n\n// lib/utils/pattern-matcher.ts\nvar REGEX_META_CHARS = /[\\\\.^$*+?()[\\]{}|]/;\nfunction hasRegexMeta(value) {\n return REGEX_META_CHARS.test(value);\n}\nvar PATTERN_CACHE = /* @__PURE__ */ new Map();\nfunction compilePatternMatcher(pattern) {\n const cached = PATTERN_CACHE.get(pattern);\n if (cached) {\n return cached;\n }\n let compiled;\n if (pattern.length === 0) {\n compiled = (_value) => true;\n } else if (!hasRegexMeta(pattern)) {\n compiled = (value) => value.includes(pattern);\n } else {\n const patternLength = pattern.length;\n if (patternLength >= 2 && pattern[0] === \"^\" && pattern[patternLength - 1] === \"$\") {\n const inner = pattern.slice(1, -1);\n if (!hasRegexMeta(inner)) {\n if (inner.length === 0) {\n compiled = (value) => value.length === 0;\n } else {\n compiled = (value) => value === inner;\n }\n } else {\n compiled = new RegExp(pattern, \"u\");\n }\n } else if (pattern[0] === \"^\") {\n const inner = pattern.slice(1);\n if (!hasRegexMeta(inner)) {\n if (inner.length === 0) {\n compiled = (_value) => true;\n } else {\n compiled = (value) => value.startsWith(inner);\n }\n } else {\n compiled = new RegExp(pattern, \"u\");\n }\n } else if (pattern[patternLength - 1] === \"$\") {\n const inner = pattern.slice(0, -1);\n if (!hasRegexMeta(inner)) {\n if (inner.length === 0) {\n compiled = (_value) => true;\n } else {\n compiled = (value) => value.endsWith(inner);\n }\n } else {\n compiled = new RegExp(pattern, \"u\");\n }\n } else {\n compiled = new RegExp(pattern, \"u\");\n }\n }\n PATTERN_CACHE.set(pattern, compiled);\n return compiled;\n}\n\n// lib/keywords/object-keywords.ts\nvar PATTERN_KEY_CACHE_LIMIT = 512;\nfunction createApplyPropertyDefaults(replaceEmpty) {\n return function applyPropertyDefaults2(schema, data, instance) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n const defaultKeys = schema._defaultKeys;\n for (let i = 0; i < defaultKeys.length; i++) {\n const key = defaultKeys[i];\n const hasOwnValue = hasOwn(data, key);\n const value = hasOwnValue ? data[key] : void 0;\n if (hasOwnValue && value !== void 0 && (!replaceEmpty || value !== null && value !== \"\")) {\n continue;\n }\n instance.setDefault(\n data,\n key,\n deepCloneUnfreeze(schema.properties[key].default)\n );\n }\n };\n}\nvar applyPropertyDefaults = createApplyPropertyDefaults(false);\nvar applyEmptyPropertyDefaults = createApplyPropertyDefaults(true);\nfunction getPatternPropertyEntries(schema) {\n let entries = schema._patternPropertyEntries;\n if (entries) {\n return entries;\n }\n if (!schema.patternProperties || typeof schema.patternProperties !== \"object\" || Array.isArray(schema.patternProperties)) {\n return void 0;\n }\n const patternKeys = Object.keys(schema.patternProperties);\n entries = new Array(patternKeys.length);\n for (let i = 0; i < patternKeys.length; i++) {\n const key = patternKeys[i];\n const compiledMatcher = compilePatternMatcher(key);\n const match = compiledMatcher instanceof RegExp ? (value) => compiledMatcher.test(value) : compiledMatcher;\n entries[i] = {\n schemaProp: schema.patternProperties[key],\n match\n };\n }\n definePropertyOrThrow(schema, \"_patternPropertyEntries\", {\n value: entries,\n enumerable: false,\n configurable: false,\n writable: false\n });\n return entries;\n}\nfunction getPatternKeyMatchIndexes(schema, key, entries) {\n let cache = schema._patternKeyMatchIndexCache;\n if (cache) {\n const cached = cache.get(key);\n if (cached) {\n return cached;\n }\n } else {\n cache = /* @__PURE__ */ new Map();\n definePropertyOrThrow(schema, \"_patternKeyMatchIndexCache\", {\n value: cache,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n const indexes = [];\n for (let i = 0; i < entries.length; i++) {\n if (entries[i].match(key)) {\n indexes.push(i);\n }\n }\n if (cache.size < PATTERN_KEY_CACHE_LIMIT) {\n cache.set(key, indexes);\n }\n return indexes;\n}\nvar ObjectKeywords = {\n required(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n for (let i = 0; i < schema.required.length; i++) {\n const key = schema.required[i];\n if (!hasOwn(data, key)) {\n return defineError(\"Required property is missing\", {\n item: key,\n data: data[key]\n });\n }\n }\n return;\n },\n properties(schema, data, defineError, instance) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n const propKeys = schema._propKeys;\n for (let i = 0; i < propKeys.length; i++) {\n const key = propKeys[i];\n const schemaProp = schema.properties[key];\n if (!hasOwn(data, key)) {\n continue;\n }\n if (typeof schemaProp === \"boolean\") {\n if (schemaProp === false) {\n return defineError(\"Property is not allowed\", {\n item: key,\n data: data[key]\n });\n }\n continue;\n }\n if (schemaProp && \"$validate\" in schemaProp) {\n const error = schemaProp.$validate(data[key]);\n if (error) {\n return defineError(\"Property is invalid\", {\n item: key,\n cause: error,\n data: data[key]\n });\n }\n }\n }\n return;\n },\n values(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n const valueSchema = schema.values;\n const validate = valueSchema && valueSchema.$validate;\n if (typeof validate !== \"function\") {\n return;\n }\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n const error = validate(data[key]);\n if (error) {\n return defineError(\"Property is invalid\", {\n item: key,\n cause: error,\n data: data[key]\n });\n }\n }\n },\n maxProperties(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n let count = 0;\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n count++;\n if (count > schema.maxProperties) {\n return defineError(\"Too many properties\", { data });\n }\n }\n return;\n },\n minProperties(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n let count = 0;\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n count++;\n if (count >= schema.minProperties) {\n return;\n }\n }\n return defineError(\"Too few properties\", { data });\n },\n additionalProperties(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n let apValidate = schema._apValidate;\n if (apValidate === void 0) {\n apValidate = isCompiledSchema(schema.additionalProperties) ? schema.additionalProperties.$validate : null;\n definePropertyOrThrow(schema, \"_apValidate\", {\n value: apValidate,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n const patternEntries = getPatternPropertyEntries(schema);\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n if (schema.properties && hasOwn(schema.properties, key)) {\n continue;\n }\n if (patternEntries && patternEntries.length) {\n if (getPatternKeyMatchIndexes(schema, key, patternEntries).length > 0) {\n continue;\n }\n }\n if (schema.additionalProperties === false) {\n return defineError(\"Additional properties are not allowed\", {\n item: key,\n data: data[key]\n });\n }\n if (apValidate) {\n const error = apValidate(data[key]);\n if (error) {\n return defineError(\"Additional properties are invalid\", {\n item: key,\n cause: error,\n data: data[key]\n });\n }\n }\n }\n return;\n },\n patternProperties(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n const patternEntries = getPatternPropertyEntries(schema);\n if (!patternEntries || patternEntries.length === 0) {\n return;\n }\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n const matchingIndexes = getPatternKeyMatchIndexes(schema, key, patternEntries);\n if (matchingIndexes.length === 0) {\n if (schema.additionalProperties === false && !(schema.properties && hasOwn(schema.properties, key))) {\n return defineError(\"Additional properties are not allowed\", {\n item: key,\n data: data[key]\n });\n }\n continue;\n }\n for (let j = 0; j < matchingIndexes.length; j++) {\n const schemaProp = patternEntries[matchingIndexes[j]].schemaProp;\n if (typeof schemaProp === \"boolean\") {\n if (schemaProp === false) {\n return defineError(\"Property is not allowed\", {\n item: key,\n data: data[key]\n });\n }\n continue;\n }\n if (\"$validate\" in schemaProp) {\n const error = schemaProp.$validate(data[key]);\n if (error) {\n return defineError(\"Property is invalid\", {\n item: key,\n cause: error,\n data: data[key]\n });\n }\n }\n }\n }\n return;\n },\n propertyNames(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n const pn = schema.propertyNames;\n if (typeof pn === \"boolean\") {\n if (pn === false) {\n for (const key in data) {\n if (hasOwn(data, key)) {\n return defineError(\"Properties are not allowed\", { data });\n }\n }\n }\n return;\n }\n const validate = pn && pn.$validate;\n if (typeof validate !== \"function\") {\n return;\n }\n for (const key in data) {\n if (!hasOwn(data, key)) {\n continue;\n }\n const error = validate(key);\n if (error) {\n return defineError(\"Property name is invalid\", {\n item: key,\n cause: error,\n data: data[key]\n });\n }\n }\n },\n dependencies(schema, data, defineError) {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return;\n }\n for (const key in schema.dependencies) {\n if (key in data === false) {\n continue;\n }\n const dependency = schema.dependencies[key];\n if (Array.isArray(dependency)) {\n for (let i = 0; i < dependency.length; i++) {\n if (!(dependency[i] in data)) {\n return defineError(\"Dependency is not satisfied\", {\n item: i,\n data: dependency[i]\n });\n }\n }\n continue;\n }\n if (typeof dependency === \"boolean\") {\n if (dependency) {\n continue;\n }\n return defineError(\"Dependency is not satisfied\", { data: dependency });\n }\n if (typeof dependency === \"string\") {\n if (dependency in data) {\n continue;\n }\n return defineError(\"Dependency is not satisfied\", { data: dependency });\n }\n const error = dependency.$validate(data);\n if (error) {\n return defineError(\"Dependency is not satisfied\", {\n cause: error,\n data\n });\n }\n }\n return;\n },\n // Required by other keywords but not used as a function itself\n then: false,\n else: false,\n default: false,\n // Not implemented yet\n definitions: false,\n $id: false,\n $schema: false,\n // Metadata keywords (not used as a function)\n title: false,\n description: false,\n $comment: false,\n examples: false,\n contentMediaType: false,\n contentEncoding: false,\n // Not supported Open API keywords\n discriminator: false,\n nullable: false\n};\n\n// lib/keywords/other-keywords.ts\nfunction toBranchEntry(item) {\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n if (\"$validate\" in item && typeof item.$validate === \"function\") {\n return { kind: \"validate\", validate: item.$validate };\n }\n return { kind: \"alwaysValid\" };\n }\n if (typeof item === \"boolean\") {\n return { kind: item ? \"alwaysValid\" : \"alwaysInvalid\" };\n }\n return { kind: \"literal\", value: item };\n}\nfunction getBranchEntries(schema, key) {\n const cacheKey = `_${key}BranchEntries`;\n let entries = schema[cacheKey];\n if (entries) {\n return entries;\n }\n const source = schema[key] || [];\n entries = [];\n for (let i = 0; i < source.length; i++) {\n entries.push(toBranchEntry(source[i]));\n }\n definePropertyOrThrow(schema, cacheKey, {\n value: entries,\n enumerable: false,\n configurable: false,\n writable: false\n });\n return entries;\n}\nfunction evaluateAllOf(branches, data, defineError) {\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n if (branch.kind === \"validate\") {\n const error = branch.validate(data);\n if (error) {\n return defineError(\"Value is not valid\", { cause: error, data });\n }\n continue;\n }\n if (branch.kind === \"alwaysValid\") {\n continue;\n }\n if (branch.kind === \"alwaysInvalid\" || data !== branch.value) {\n return defineError(\"Value is not valid\", { data });\n }\n }\n}\nfunction evaluateAnyOf(branches, data, defineError) {\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n if (branch.kind === \"validate\") {\n if (!branch.validate(data)) {\n return;\n }\n continue;\n }\n if (branch.kind === \"alwaysValid\") {\n return;\n }\n if (branch.kind === \"literal\" && data === branch.value) {\n return;\n }\n }\n return defineError(\"Value is not valid\", { data });\n}\nfunction evaluateOneOf(branches, data, defineError) {\n let validCount = 0;\n let winnerIndex = -1;\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n let isValid = false;\n if (branch.kind === \"validate\") {\n isValid = !branch.validate(data);\n } else if (branch.kind === \"alwaysValid\") {\n isValid = true;\n } else if (branch.kind === \"literal\") {\n isValid = data === branch.value;\n }\n if (isValid) {\n validCount++;\n winnerIndex = i;\n if (validCount > 1) {\n return {\n error: defineError(\"Value is not valid\", { data }),\n winnerIndex: -1\n };\n }\n }\n }\n return {\n error: validCount === 1 ? void 0 : defineError(\"Value is not valid\", { data }),\n winnerIndex: validCount === 1 ? winnerIndex : -1\n };\n}\nfunction createCombinatorValidator(key, schema, defineError, validateSubschema, transactions) {\n const sourceBranches = getBranchEntries(schema, key);\n const branches = validateSubschema ? sourceBranches.map(\n (branch, index) => branch.kind === \"validate\" ? {\n kind: \"validate\",\n validate: (data) => validateSubschema(schema[key][index], data)\n } : branch\n ) : sourceBranches;\n if (!transactions) {\n if (key === \"allOf\") {\n return (data) => evaluateAllOf(branches, data, defineError);\n }\n if (key === \"anyOf\") {\n return (data) => evaluateAnyOf(branches, data, defineError);\n }\n return (data) => evaluateOneOf(branches, data, defineError).error;\n }\n if (key === \"allOf\") {\n return (data) => {\n const savepoint = transactions.savepoint();\n try {\n const error = evaluateAllOf(branches, data, defineError);\n if (error) {\n transactions.rollback(savepoint);\n }\n return error;\n } catch (error) {\n transactions.rollback(savepoint);\n throw error;\n }\n };\n }\n if (key === \"anyOf\") {\n return (data) => evaluateAnyOf(branches, data, defineError);\n }\n return (data) => {\n const savepoint = transactions.savepoint();\n const defaultsByBranch = [];\n const isolatedBranches = branches.map(\n (branch, index) => branch.kind === \"validate\" ? {\n kind: \"validate\",\n validate: (value) => {\n const branchSavepoint = transactions.savepoint();\n const error = branch.validate(value);\n if (!error) {\n defaultsByBranch[index] = transactions.capture(branchSavepoint);\n }\n return error;\n }\n } : branch\n );\n try {\n const result = evaluateOneOf(isolatedBranches, data, defineError);\n if (result.error) {\n transactions.rollback(savepoint);\n return result.error;\n }\n transactions.restore(defaultsByBranch[result.winnerIndex] || []);\n return;\n } catch (error) {\n transactions.rollback(savepoint);\n throw error;\n }\n };\n}\nfunction prepareCombinatorEntries(schema) {\n if (Array.isArray(schema.allOf)) {\n getBranchEntries(schema, \"allOf\");\n }\n if (Array.isArray(schema.anyOf)) {\n getBranchEntries(schema, \"anyOf\");\n }\n if (Array.isArray(schema.oneOf)) {\n getBranchEntries(schema, \"oneOf\");\n }\n}\nvar OtherKeywords = {\n enum(schema, data, defineError) {\n let enumCache = schema._enumCache;\n if (!enumCache) {\n const primitiveSet = /* @__PURE__ */ new Set();\n const objectValues = [];\n const list = schema.enum;\n for (let i = 0; i < list.length; i++) {\n const enumItem = list[i];\n if (enumItem !== null && typeof enumItem === \"object\") {\n objectValues.push(enumItem);\n } else {\n primitiveSet.add(enumItem);\n }\n }\n enumCache = { primitiveSet, objectValues };\n definePropertyOrThrow(schema, \"_enumCache\", {\n value: enumCache,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n if (!(typeof data === \"number\" && Number.isNaN(data)) && enumCache.primitiveSet.has(data)) {\n return;\n }\n if (data !== null && typeof data === \"object\") {\n for (let i = 0; i < enumCache.objectValues.length; i++) {\n if (!hasChanged(enumCache.objectValues[i], data)) {\n return;\n }\n }\n }\n return defineError(\"Value is not one of the allowed values\", { data });\n },\n allOf(schema, data, defineError) {\n return createCombinatorValidator(\"allOf\", schema, defineError)(data);\n },\n anyOf(schema, data, defineError) {\n return createCombinatorValidator(\"anyOf\", schema, defineError)(data);\n },\n oneOf(schema, data, defineError) {\n return createCombinatorValidator(\"oneOf\", schema, defineError)(data);\n },\n const(schema, data, defineError) {\n if (data === schema.const) {\n return;\n }\n if (data && typeof data === \"object\" && !Array.isArray(data) && schema.const && typeof schema.const === \"object\" && !Array.isArray(schema.const) && !hasChanged(data, schema.const) || Array.isArray(data) && Array.isArray(schema.const) && !hasChanged(data, schema.const)) {\n return;\n }\n return defineError(\"Value is not valid\", { data });\n },\n if(schema, data) {\n if (\"then\" in schema === false && \"else\" in schema === false) {\n return;\n }\n if (typeof schema.if === \"boolean\") {\n if (schema.if) {\n if (isCompiledSchema(schema.then)) {\n return schema.then.$validate(data);\n }\n } else if (isCompiledSchema(schema.else)) {\n return schema.else.$validate(data);\n }\n return;\n }\n if (!isCompiledSchema(schema.if)) {\n return;\n }\n const error = schema.if.$validate(data);\n if (!error) {\n if (isCompiledSchema(schema.then)) {\n return schema.then.$validate(data);\n }\n return;\n } else {\n if (isCompiledSchema(schema.else)) {\n return schema.else.$validate(data);\n }\n return;\n }\n },\n not(schema, data, defineError) {\n if (typeof schema.not === \"boolean\") {\n if (schema.not) {\n return defineError(\"Value is not valid\", { data });\n }\n return;\n }\n if (schema.not && typeof schema.not === \"object\" && !Array.isArray(schema.not)) {\n if (\"$validate\" in schema.not) {\n const error = schema.not.$validate(data);\n if (!error) {\n return defineError(\"Value is not valid\", { data });\n }\n return;\n }\n return defineError(\"Value is not valid\", { data });\n }\n return defineError(\"Value is not valid\", { data });\n },\n $ref(schema, data, defineError) {\n if (typeof schema._resolvedRef === \"function\") {\n return schema._resolvedRef(data);\n }\n return defineError(`Missing reference: ${schema.$ref}`);\n }\n};\n\n// lib/keywords/string-keywords.ts\nvar PATTERN_MATCH_CACHE_LIMIT = 512;\nvar FORMAT_RESULT_CACHE_LIMIT = 512;\nfunction hasAtLeastCodePoints(value, limit) {\n let count = 0;\n for (let index = 0; index < value.length; index++) {\n const unit = value.charCodeAt(index);\n if (unit >= 55296 && unit <= 56319 && index + 1 < value.length) {\n const nextUnit = value.charCodeAt(index + 1);\n if (nextUnit >= 56320 && nextUnit <= 57343) {\n index++;\n }\n }\n count++;\n if (count >= limit) {\n return true;\n }\n }\n return count >= limit;\n}\nvar StringKeywords = {\n minLength(schema, data, defineError) {\n if (typeof data !== \"string\") {\n return;\n }\n const units = data.length;\n const limit = schema.minLength;\n if (units < limit) {\n return defineError(\"Value is shorter than the minimum length\", { data });\n }\n if (units - limit >= limit || hasAtLeastCodePoints(data, limit)) {\n return;\n }\n return defineError(\"Value is shorter than the minimum length\", { data });\n },\n maxLength(schema, data, defineError) {\n if (typeof data !== \"string\") {\n return;\n }\n const units = data.length;\n const limit = schema.maxLength;\n if (units <= limit) {\n return;\n }\n if (units - limit > limit || hasAtLeastCodePoints(data, limit + 1)) {\n return defineError(\"Value is longer than the maximum length\", { data });\n }\n return;\n },\n pattern(schema, data, defineError) {\n if (typeof data !== \"string\") {\n return;\n }\n let patternMatch = schema._patternMatch;\n let patternMatchCache = schema._patternMatchCache;\n if (!patternMatch) {\n try {\n const compiled = compilePatternMatcher(schema.pattern);\n patternMatch = compiled instanceof RegExp ? (value) => compiled.test(value) : compiled;\n definePropertyOrThrow(schema, \"_patternMatch\", {\n value: patternMatch,\n enumerable: false,\n configurable: false,\n writable: false\n });\n } catch (error) {\n return defineError(\"Invalid regular expression\", {\n data,\n cause: error\n });\n }\n }\n if (!patternMatchCache) {\n patternMatchCache = /* @__PURE__ */ new Map();\n definePropertyOrThrow(schema, \"_patternMatchCache\", {\n value: patternMatchCache,\n enumerable: false,\n configurable: false,\n writable: false\n });\n } else if (patternMatchCache.has(data)) {\n if (patternMatchCache.get(data)) {\n return;\n }\n return defineError(\"Value does not match the pattern\", { data });\n }\n const isMatch = patternMatch(data);\n if (patternMatchCache.size < PATTERN_MATCH_CACHE_LIMIT) {\n patternMatchCache.set(data, isMatch);\n }\n if (isMatch) {\n return;\n }\n return defineError(\"Value does not match the pattern\", { data });\n },\n // Take into account that if we receive a format that is not defined, we\n // will not throw an error, we just ignore it.\n format(schema, data, defineError, instance) {\n if (typeof data !== \"string\") {\n return;\n }\n let formatValidate = schema._formatValidate;\n let formatResultCacheEnabled = schema._formatResultCacheEnabled;\n let formatResultCache = schema._formatResultCache;\n if (formatValidate === void 0) {\n formatValidate = instance.getFormat(schema.format);\n definePropertyOrThrow(schema, \"_formatValidate\", {\n value: formatValidate,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n if (!formatValidate) {\n return;\n }\n if (formatResultCacheEnabled === void 0) {\n formatResultCacheEnabled = instance.isDefaultFormatValidator(\n schema.format,\n formatValidate\n );\n definePropertyOrThrow(schema, \"_formatResultCacheEnabled\", {\n value: formatResultCacheEnabled,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n if (!formatResultCacheEnabled) {\n if (formatValidate(data)) {\n return;\n }\n return defineError(\"Value does not match the format\", { data });\n }\n if (!formatResultCache) {\n formatResultCache = /* @__PURE__ */ new Map();\n definePropertyOrThrow(schema, \"_formatResultCache\", {\n value: formatResultCache,\n enumerable: false,\n configurable: false,\n writable: false\n });\n } else if (formatResultCache.has(data)) {\n if (formatResultCache.get(data)) {\n return;\n }\n return defineError(\"Value does not match the format\", { data });\n }\n const isValid = formatValidate(data);\n if (formatResultCache.size < FORMAT_RESULT_CACHE_LIMIT) {\n formatResultCache.set(data, isValid);\n }\n if (isValid) {\n return;\n }\n return defineError(\"Value does not match the format\", { data });\n }\n};\n\n// lib/keywords.ts\nvar keywords = {\n ...ObjectKeywords,\n ...ArrayKeywords,\n ...StringKeywords,\n ...NumberKeywords,\n ...OtherKeywords\n};\n\n// lib/index.ts\nvar MAX_COMPILE_DEPTH = 128;\nvar LOCAL_SCHEMA_BASE = \"schema-shield://local/root\";\nvar FAIL_FAST_TYPE_VALIDATORS = {\n object: (data) => data !== null && typeof data === \"object\" && !Array.isArray(data) ? void 0 : true,\n array: (data) => Array.isArray(data) ? void 0 : true,\n string: (data) => typeof data === \"string\" ? void 0 : true,\n number: (data) => typeof data === \"number\" && Number.isFinite(data) ? void 0 : true,\n integer: (data) => typeof data === \"number\" && Number.isFinite(data) && Number.isInteger(data) ? void 0 : true,\n boolean: (data) => typeof data === \"boolean\" ? void 0 : true,\n null: (data) => data === null ? void 0 : true\n};\nfunction createBuiltinTypeValidator(_type, defineError, fallback) {\n return (data) => {\n if (!fallback(data)) {\n return defineError(\"Invalid type\", { data });\n }\n };\n}\nvar SchemaShield = class {\n types = {};\n formats = {};\n keywords = {};\n immutable = false;\n useDefaults = false;\n rootSchema = null;\n failFast = true;\n maxDepth;\n validationContexts = [];\n compileCache = /* @__PURE__ */ new WeakMap();\n compilingRequiresContext = false;\n compilingMutableSchemas = /* @__PURE__ */ new WeakSet();\n constructor({\n immutable = false,\n failFast = true,\n maxDepth = 128,\n useDefaults = false\n } = {}) {\n if (!Number.isInteger(maxDepth) || maxDepth < 1 || maxDepth > 256) {\n const error = new ValidationError(\"maxDepth must be an integer from 1 to 256\");\n error.code = \"INVALID_MAX_DEPTH\";\n error.keyword = \"maxDepth\";\n throw error;\n }\n if (useDefaults !== false && useDefaults !== true && useDefaults !== \"empty\") {\n const error = new ValidationError(\n 'useDefaults must be false, true, or \"empty\"'\n );\n error.code = \"INVALID_USE_DEFAULTS\";\n error.keyword = \"useDefaults\";\n throw error;\n }\n this.immutable = immutable;\n this.failFast = failFast;\n this.maxDepth = maxDepth;\n this.useDefaults = useDefaults;\n for (const [type, validator] of Object.entries(Types)) {\n if (validator) {\n this.addType(type, validator);\n }\n }\n for (const [keyword, validator] of Object.entries(keywords)) {\n this.addKeyword(keyword, validator);\n }\n for (const [format, validator] of Object.entries(Formats)) {\n if (validator) {\n this.addFormat(format, validator);\n }\n }\n }\n setDefault(target, key, value) {\n const context = this.validationContexts[this.validationContexts.length - 1];\n if (context) {\n context.defaults.push({\n target,\n key,\n descriptor: Reflect.getOwnPropertyDescriptor(target, key)\n });\n }\n definePropertyOrThrow(target, key, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n #defaultSavepoint() {\n const context = this.validationContexts[this.validationContexts.length - 1];\n return context ? context.defaults.length : 0;\n }\n #rollbackDefaultSavepoint(savepoint) {\n const context = this.validationContexts[this.validationContexts.length - 1];\n if (context) {\n this.rollbackDefaults(context, savepoint);\n }\n }\n #captureDefaultSavepoint(savepoint) {\n const context = this.validationContexts[this.validationContexts.length - 1];\n if (!context || context.defaults.length === savepoint) {\n return [];\n }\n const mutations = context.defaults.slice(savepoint).map((entry) => ({\n ...entry,\n value: entry.target[entry.key]\n }));\n this.rollbackDefaults(context, savepoint);\n return mutations;\n }\n #restoreDefaults(mutations) {\n for (let index = 0; index < mutations.length; index++) {\n const mutation = mutations[index];\n this.setDefault(mutation.target, mutation.key, mutation.value);\n }\n }\n addType(name, validator, overwrite = false) {\n if (this.types[name] && !overwrite) {\n throw new ValidationError(`Type \"${name}\" already exists`);\n }\n this.types[name] = validator;\n }\n getType(type) {\n return this.types[type];\n }\n addFormat(name, validator, overwrite = false) {\n if (this.formats[name] && !overwrite) {\n throw new ValidationError(`Format \"${name}\" already exists`);\n }\n this.formats[name] = validator;\n }\n getFormat(format) {\n return this.formats[format];\n }\n isDefaultFormatValidator(format, validator) {\n return Formats[format] === validator;\n }\n addKeyword(name, validator, overwrite = false) {\n if (this.keywords[name] && !overwrite) {\n throw new ValidationError(`Keyword \"${name}\" already exists`);\n }\n this.keywords[name] = validator;\n }\n getKeyword(keyword) {\n return this.keywords[keyword];\n }\n getSchemaRef(path) {\n if (!this.rootSchema) {\n return;\n }\n return resolvePath(this.rootSchema, path);\n }\n getSchemaById(id) {\n if (!this.rootSchema) {\n return;\n }\n const stack = [this.rootSchema];\n const seen = /* @__PURE__ */ new WeakSet();\n while (stack.length > 0) {\n const node = stack.pop();\n if (seen.has(node)) {\n continue;\n }\n seen.add(node);\n if (node.$id === id) {\n return node;\n }\n const children = this.schemaChildren(node);\n for (let index = 0; index < children.length; index++) {\n stack.push(children[index]);\n }\n }\n return;\n }\n depthError(message = \"Maximum schema depth exceeded\") {\n if (this.failFast) {\n return true;\n }\n const error = new ValidationError(message);\n error.code = \"MAX_DEPTH_EXCEEDED\";\n error.keyword = \"maxDepth\";\n return error;\n }\n schemaChildEntries(schema) {\n const children = [];\n const mapKeys = [\n \"properties\",\n \"patternProperties\",\n \"definitions\",\n \"$defs\",\n \"dependencies\"\n ];\n const arrayKeys = [\"allOf\", \"anyOf\", \"oneOf\", \"items\"];\n const singleKeys = [\n \"items\",\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"propertyNames\",\n \"values\",\n \"elements\",\n \"not\",\n \"if\",\n \"then\",\n \"else\"\n ];\n for (const key of mapKeys) {\n const value = schema[key];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n continue;\n }\n for (const childKey of Object.keys(value)) {\n const child = value[childKey];\n if (child && typeof child === \"object\") {\n children.push({\n value: child,\n pointer: `/${this.escapePointerToken(key)}/${this.escapePointerToken(\n childKey\n )}`\n });\n }\n }\n }\n for (const key of arrayKeys) {\n const value = schema[key];\n if (!Array.isArray(value)) {\n continue;\n }\n for (let index = 0; index < value.length; index++) {\n const child = value[index];\n if (child && typeof child === \"object\") {\n children.push({\n value: child,\n pointer: `/${this.escapePointerToken(key)}/${index}`\n });\n }\n }\n }\n for (const key of singleKeys) {\n const value = schema[key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n children.push({\n value,\n pointer: `/${this.escapePointerToken(key)}`\n });\n }\n }\n for (const key of Object.keys(schema)) {\n if (key === \"enum\" || key === \"const\" || key === \"default\" || key === \"examples\" || mapKeys.includes(key) || arrayKeys.includes(key) || singleKeys.includes(key)) {\n continue;\n }\n const keyword = this.getKeyword(key);\n const value = schema[key];\n if (keyword && keyword !== keywords[key] && value && typeof value === \"object\") {\n children.push({\n value,\n pointer: `/${this.escapePointerToken(key)}`\n });\n }\n }\n return children;\n }\n schemaChildren(schema) {\n return this.schemaChildEntries(schema).map((entry) => entry.value);\n }\n registrySubschemaEntries(schema) {\n const children = [];\n const mapKeys = [\"properties\", \"patternProperties\", \"definitions\"];\n const arrayKeys = [\"allOf\", \"anyOf\", \"oneOf\", \"items\"];\n const singleKeys = [\n \"items\",\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"propertyNames\",\n \"not\",\n \"if\",\n \"then\",\n \"else\"\n ];\n for (const key of mapKeys) {\n const value = schema[key];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n continue;\n }\n for (const childKey of Object.keys(value)) {\n const child = value[childKey];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n children.push({\n value: child,\n pointer: `/${this.escapePointerToken(key)}/${this.escapePointerToken(\n childKey\n )}`\n });\n }\n }\n }\n const dependencies = schema.dependencies;\n if (dependencies && typeof dependencies === \"object\" && !Array.isArray(dependencies)) {\n for (const dependencyKey of Object.keys(dependencies)) {\n const child = dependencies[dependencyKey];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n children.push({\n value: child,\n pointer: `/dependencies/${this.escapePointerToken(dependencyKey)}`\n });\n }\n }\n }\n for (const key of arrayKeys) {\n const value = schema[key];\n if (!Array.isArray(value)) {\n continue;\n }\n for (let index = 0; index < value.length; index++) {\n const child = value[index];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n children.push({\n value: child,\n pointer: `/${this.escapePointerToken(key)}/${index}`\n });\n }\n }\n }\n for (const key of singleKeys) {\n const value = schema[key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n children.push({\n value,\n pointer: `/${this.escapePointerToken(key)}`\n });\n }\n }\n return children;\n }\n escapePointerToken(value) {\n return value.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n }\n resolveUri(reference, baseUri, keyword) {\n try {\n return new URL(reference, baseUri).href;\n } catch {\n const error = new ValidationError(`Invalid ${keyword} URI: ${reference}`);\n error.code = keyword === \"$id\" ? \"INVALID_SCHEMA_ID\" : \"REFERENCE_NOT_FOUND\";\n error.keyword = keyword;\n throw error;\n }\n }\n resourceUri(uri) {\n const hashIndex = uri.indexOf(\"#\");\n return hashIndex === -1 ? uri : uri.slice(0, hashIndex);\n }\n buildReferenceRegistry(schema) {\n const aliases = /* @__PURE__ */ new Map();\n const positions = [];\n const positionsByNode = /* @__PURE__ */ new WeakMap();\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return Object.freeze({\n aliases,\n positions: Object.freeze(positions),\n positionsByNode\n });\n }\n const register = (uri, node) => {\n const existing = aliases.get(uri);\n if (existing && existing !== node) {\n const error = new ValidationError(`Duplicate schema identity: ${uri}`);\n error.code = \"DUPLICATE_SCHEMA_ID\";\n error.keyword = \"$id\";\n throw error;\n }\n aliases.set(uri, node);\n };\n register(LOCAL_SCHEMA_BASE, schema);\n const visited = /* @__PURE__ */ new WeakSet();\n const stack = [\n {\n node: schema,\n inheritedBase: LOCAL_SCHEMA_BASE,\n resourceRoot: schema,\n pointer: \"#\"\n }\n ];\n while (stack.length > 0) {\n const entry = stack.pop();\n if (visited.has(entry.node)) {\n continue;\n }\n visited.add(entry.node);\n let baseUri = entry.inheritedBase;\n let resourceRoot = entry.resourceRoot;\n if (typeof entry.node.$id === \"string\" && !(\"$ref\" in entry.node)) {\n baseUri = this.resolveUri(entry.node.$id, entry.inheritedBase, \"$id\");\n register(baseUri, entry.node);\n if (baseUri.indexOf(\"#\") === -1 || baseUri.endsWith(\"#\")) {\n resourceRoot = entry.node;\n register(this.resourceUri(baseUri), entry.node);\n }\n }\n const position = {\n source: entry.node,\n baseUri,\n resourceRoot,\n pointer: entry.pointer\n };\n positions.push(position);\n positionsByNode.set(entry.node, position);\n const children = this.registrySubschemaEntries(entry.node);\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index];\n if (Array.isArray(child.value)) {\n continue;\n }\n stack.push({\n node: child.value,\n inheritedBase: baseUri,\n resourceRoot,\n pointer: `${entry.pointer}${child.pointer}`\n });\n }\n }\n return Object.freeze({\n aliases,\n positions: Object.freeze(positions),\n positionsByNode\n });\n }\n resolveReferenceSource(ref, position, registry) {\n const resolvedUri = this.resolveUri(ref, position.baseUri, \"$ref\");\n const exactTarget = registry.aliases.get(resolvedUri);\n if (exactTarget) {\n return exactTarget;\n }\n const resourceRoot = registry.aliases.get(this.resourceUri(resolvedUri));\n if (!resourceRoot) {\n return;\n }\n const hashIndex = resolvedUri.indexOf(\"#\");\n const fragment = hashIndex === -1 ? \"\" : resolvedUri.slice(hashIndex + 1);\n if (fragment.length === 0) {\n return resourceRoot;\n }\n if (fragment.startsWith(\"/\")) {\n return resolvePath(resourceRoot, `#${fragment}`);\n }\n return;\n }\n analyzeSchema(schema, registry) {\n if (!schema || typeof schema !== \"object\") {\n return {\n requiresDepthGuard: false,\n requiresMutationJournal: false,\n mutableSchemas: /* @__PURE__ */ new WeakSet()\n };\n }\n const visiting = /* @__PURE__ */ new WeakSet();\n const visited = /* @__PURE__ */ new WeakSet();\n const stack = [{ value: schema, depth: 0, exit: false }];\n let requiresDepthGuard = false;\n let requiresMutationJournal = false;\n while (stack.length > 0) {\n const entry = stack.pop();\n if (entry.exit) {\n visiting.delete(entry.value);\n visited.add(entry.value);\n continue;\n }\n if (visited.has(entry.value)) {\n continue;\n }\n if (visiting.has(entry.value)) {\n const error = new ValidationError(\"Cyclic schema graph is not supported\");\n error.code = \"CYCLIC_SCHEMA_GRAPH\";\n error.keyword = \"compile\";\n throw error;\n }\n if (entry.depth > MAX_COMPILE_DEPTH) {\n const error = new ValidationError(\"Maximum compile depth exceeded\");\n error.code = \"MAX_COMPILE_DEPTH_EXCEEDED\";\n error.keyword = \"compile\";\n throw error;\n }\n if (entry.depth > this.maxDepth) {\n requiresDepthGuard = true;\n }\n visiting.add(entry.value);\n stack.push({ ...entry, exit: true });\n if (this.useDefaults !== false && this.hasPropertyDefaults(entry.value)) {\n requiresMutationJournal = true;\n }\n for (const key of Object.keys(entry.value)) {\n const keyword = this.getKeyword(key);\n if (keyword && keyword !== keywords[key]) {\n requiresDepthGuard = true;\n requiresMutationJournal = true;\n }\n }\n const children = this.schemaChildren(entry.value);\n for (let index = children.length - 1; index >= 0; index--) {\n stack.push({\n value: children[index],\n depth: entry.depth + 1,\n exit: false\n });\n }\n }\n const semanticState = /* @__PURE__ */ new WeakMap();\n const semanticStack = [{ value: schema, exit: false }];\n while (semanticStack.length > 0 && !requiresDepthGuard) {\n const entry = semanticStack.pop();\n if (entry.exit) {\n semanticState.set(entry.value, 2);\n continue;\n }\n const state = semanticState.get(entry.value);\n if (state === 1) {\n requiresDepthGuard = true;\n break;\n }\n if (state === 2) {\n continue;\n }\n semanticState.set(entry.value, 1);\n semanticStack.push({ value: entry.value, exit: true });\n const children = this.schemaChildren(entry.value);\n if (typeof entry.value.$ref === \"string\" && this.getKeyword(\"$ref\") === keywords.$ref) {\n const position = registry.positionsByNode.get(entry.value);\n const target = position ? this.resolveReferenceSource(entry.value.$ref, position, registry) : void 0;\n if (target && typeof target === \"object\") {\n children.push(target);\n }\n }\n for (let index = children.length - 1; index >= 0; index--) {\n semanticStack.push({\n value: children[index],\n exit: false\n });\n }\n }\n const mutableSchemas = /* @__PURE__ */ new WeakSet();\n if (requiresMutationJournal) {\n const mutationStack = [{ value: schema, exit: false }];\n const mutationVisited = /* @__PURE__ */ new WeakSet();\n while (mutationStack.length > 0) {\n const entry = mutationStack.pop();\n if (entry.exit) {\n const children2 = this.schemaChildren(entry.value);\n const hasCustomKeyword = Object.keys(entry.value).some((key) => {\n const keyword = this.getKeyword(key);\n return !!keyword && keyword !== keywords[key];\n });\n if (this.useDefaults !== false && this.hasPropertyDefaults(entry.value) || hasCustomKeyword || typeof entry.value.$ref === \"string\" || children2.some((child) => mutableSchemas.has(child))) {\n mutableSchemas.add(entry.value);\n }\n continue;\n }\n if (mutationVisited.has(entry.value)) {\n continue;\n }\n mutationVisited.add(entry.value);\n mutationStack.push({ value: entry.value, exit: true });\n const children = this.schemaChildren(entry.value);\n for (let index = children.length - 1; index >= 0; index--) {\n mutationStack.push({\n value: children[index],\n exit: false\n });\n }\n }\n }\n return { requiresDepthGuard, requiresMutationJournal, mutableSchemas };\n }\n compile(schema) {\n const prepared = this.prepareSchema(schema);\n const compiledSchema = prepared.compiledSchema;\n if (!prepared.requiresDepthGuard && !prepared.requiresMutationJournal) {\n const directValidate = compiledSchema.$validate;\n const validate = this.immutable ? (data) => {\n const clonedData = deepCloneUnfreeze(data);\n const error = directValidate(clonedData);\n return error ? { data: clonedData, error, valid: false } : { data: clonedData, error: null, valid: true };\n } : (data) => {\n const error = directValidate(data);\n return error ? { data, error, valid: false } : { data, error: null, valid: true };\n };\n validate.compiledSchema = compiledSchema;\n return validate;\n }\n return this.createGuardedValidator(compiledSchema, prepared.depthGuardState);\n }\n prepareSchema(schema) {\n const referenceRegistry = this.buildReferenceRegistry(schema);\n const analysis = this.analyzeSchema(schema, referenceRegistry);\n this.compileCache = /* @__PURE__ */ new WeakMap();\n this.compilingRequiresContext = analysis.requiresDepthGuard || analysis.requiresMutationJournal;\n this.compilingMutableSchemas = analysis.mutableSchemas;\n const compiledSchema = this.compileSchema(schema);\n this.rootSchema = compiledSchema;\n let depthGuardState = null;\n if (analysis.requiresDepthGuard) {\n depthGuardState = this.installDepthGuards(compiledSchema);\n definePropertyOrThrow(compiledSchema, \"_requiresDepthGuard\", {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false\n });\n } else if (analysis.requiresMutationJournal) {\n depthGuardState = { context: null };\n }\n if (compiledSchema._hasRef === true) {\n this.linkReferences(referenceRegistry);\n }\n if (!compiledSchema.$validate) {\n if (schema === false) {\n const defineError = getDefinedErrorFunctionForKey(\n \"oneOf\",\n compiledSchema,\n this.failFast\n );\n compiledSchema.$validate = getNamedFunction(\n \"Validate_False\",\n (data) => defineError(\"Value is not valid\", { data })\n );\n } else if (schema === true) {\n compiledSchema.$validate = getNamedFunction(\n \"Validate_Any\",\n () => {\n }\n );\n } else if (this.isSchemaLike(schema) === false) {\n throw new ValidationError(\"Invalid schema\");\n } else {\n compiledSchema.$validate = getNamedFunction(\n \"Validate_Any\",\n () => {\n }\n );\n }\n }\n return {\n compiledSchema,\n requiresDepthGuard: analysis.requiresDepthGuard,\n requiresMutationJournal: analysis.requiresMutationJournal,\n depthGuardState\n };\n }\n createGuardedValidator(compiledSchema, depthGuardState) {\n const reusableContext = {\n active: false,\n depth: -1,\n depthExceeded: false,\n defaults: []\n };\n const validate = (data) => {\n this.rootSchema = compiledSchema;\n const context = reusableContext.active ? {\n active: false,\n depth: -1,\n depthExceeded: false,\n defaults: []\n } : reusableContext;\n context.active = true;\n context.depth = -1;\n context.depthExceeded = false;\n delete context.depthError;\n context.defaults.length = 0;\n this.validationContexts.push(context);\n const priorContext = depthGuardState.context;\n depthGuardState.context = context;\n let clonedData = data;\n try {\n clonedData = this.immutable ? deepCloneUnfreeze(data) : data;\n let error = compiledSchema.$validate(clonedData);\n if (this.isDepthError(error)) {\n this.rollbackDefaults(context, 0);\n error = context.depthError || this.depthError();\n }\n return error ? { data: clonedData, error, valid: false } : { data: clonedData, error: null, valid: true };\n } catch (error) {\n this.rollbackDefaults(context, 0);\n throw error;\n } finally {\n depthGuardState.context = priorContext;\n this.validationContexts.pop();\n context.active = false;\n }\n };\n validate.compiledSchema = compiledSchema;\n return validate;\n }\n isPlainObject(value) {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n }\n isTrivialAlwaysValidSubschema(value) {\n return value === true || this.isPlainObject(value) && Object.keys(value).length === 0;\n }\n shallowArrayEquals(a, b) {\n if (a === b) {\n return true;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n flattenAssociativeBranches(key, branches) {\n const out = [];\n for (let i = 0; i < branches.length; i++) {\n const item = branches[i];\n if (this.isPlainObject(item) && Object.keys(item).length === 1 && Array.isArray(item[key])) {\n const nested = this.flattenAssociativeBranches(key, item[key]);\n for (let j = 0; j < nested.length; j++) {\n out.push(nested[j]);\n }\n continue;\n }\n out.push(item);\n }\n return out;\n }\n flattenSingleWrapperOneOf(branches) {\n let current = branches;\n while (current.length === 1) {\n const item = current[0];\n if (this.isPlainObject(item) && Object.keys(item).length === 1 && Array.isArray(item.oneOf)) {\n current = item.oneOf;\n continue;\n }\n break;\n }\n return current;\n }\n normalizeSchemaForCompile(schema) {\n let normalized = schema;\n const schemaKeys = Object.keys(schema);\n const hasOnlyKey = (key) => schemaKeys.length === 1 && schemaKeys[0] === key;\n const setNormalized = (key, value) => {\n if (normalized === schema) {\n normalized = { ...schema };\n }\n normalized[key] = value;\n };\n if (Array.isArray(schema.allOf)) {\n const flattenedAllOf = this.flattenAssociativeBranches(\n \"allOf\",\n schema.allOf\n ).filter(\n (item) => !(this.isPlainObject(item) && Object.keys(item).length === 0)\n );\n if (hasOnlyKey(\"allOf\") && flattenedAllOf.length === 1 && this.isPlainObject(flattenedAllOf[0])) {\n return flattenedAllOf[0];\n }\n if (!this.shallowArrayEquals(flattenedAllOf, schema.allOf)) {\n setNormalized(\"allOf\", flattenedAllOf);\n }\n }\n if (Array.isArray(schema.anyOf)) {\n const flattenedAnyOf = this.flattenAssociativeBranches(\n \"anyOf\",\n schema.anyOf\n );\n if (hasOnlyKey(\"anyOf\") && flattenedAnyOf.length === 1 && this.isPlainObject(flattenedAnyOf[0])) {\n return flattenedAnyOf[0];\n }\n if (!this.shallowArrayEquals(flattenedAnyOf, schema.anyOf)) {\n setNormalized(\"anyOf\", flattenedAnyOf);\n }\n }\n if (Array.isArray(schema.oneOf)) {\n const flattenedOneOf = this.flattenSingleWrapperOneOf(schema.oneOf);\n if (hasOnlyKey(\"oneOf\") && flattenedOneOf.length === 1 && this.isPlainObject(flattenedOneOf[0])) {\n return flattenedOneOf[0];\n }\n if (!this.shallowArrayEquals(flattenedOneOf, schema.oneOf)) {\n setNormalized(\"oneOf\", flattenedOneOf);\n }\n }\n return normalized;\n }\n markSchemaHasRef(schema) {\n if (schema._hasRef === true) {\n return;\n }\n definePropertyOrThrow(schema, \"_hasRef\", {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n shouldSkipKeyword(schema, key) {\n const value = schema[key];\n switch (key) {\n case \"required\":\n return Array.isArray(value) && value.length === 0;\n case \"uniqueItems\":\n return value === false;\n case \"properties\":\n case \"patternProperties\":\n case \"dependencies\":\n return this.isPlainObject(value) && Object.keys(value).length === 0;\n case \"propertyNames\":\n case \"items\":\n return value === true;\n case \"additionalProperties\":\n if (value === true) {\n return true;\n }\n return value === false && this.isPlainObject(schema.patternProperties) && Object.keys(schema.patternProperties).length > 0;\n case \"additionalItems\":\n return value === true || !Array.isArray(schema.items);\n case \"allOf\": {\n if (!Array.isArray(value)) {\n return false;\n }\n if (value.length === 0) {\n return true;\n }\n for (let i = 0; i < value.length; i++) {\n if (this.isTrivialAlwaysValidSubschema(value[i])) {\n continue;\n }\n return false;\n }\n return true;\n }\n case \"anyOf\": {\n if (!Array.isArray(value)) {\n return false;\n }\n for (let i = 0; i < value.length; i++) {\n if (this.isTrivialAlwaysValidSubschema(value[i])) {\n return true;\n }\n }\n return false;\n }\n default:\n return false;\n }\n }\n hasPropertyDefaults(schema) {\n const properties = schema.properties;\n if (!this.isPlainObject(properties)) {\n return false;\n }\n const propertyKeys = Object.keys(properties);\n for (let i = 0; i < propertyKeys.length; i++) {\n const subSchema = properties[propertyKeys[i]];\n if (this.isPlainObject(subSchema) && hasOwn(subSchema, \"default\")) {\n return true;\n }\n }\n return false;\n }\n isDefaultTypeValidator(type, validator) {\n return Types[type] === validator;\n }\n rollbackDefaults(context, start) {\n for (let index = context.defaults.length - 1; index >= start; index--) {\n const entry = context.defaults[index];\n if (entry.descriptor) {\n definePropertyOrThrow(entry.target, entry.key, entry.descriptor);\n } else {\n delete entry.target[entry.key];\n }\n }\n context.defaults.length = start;\n }\n isDepthError(error) {\n const context = this.validationContexts[this.validationContexts.length - 1];\n if (context?.depthExceeded) {\n return true;\n }\n if (!(error instanceof ValidationError)) {\n return false;\n }\n return error.getCause().code === \"MAX_DEPTH_EXCEEDED\";\n }\n validateSubschema(schema, data) {\n if (!schema || typeof schema.$validate !== \"function\") {\n return;\n }\n const context = this.validationContexts[this.validationContexts.length - 1];\n const savepoint = context?.defaults.length || 0;\n try {\n const error = schema.$validate(data);\n if (error && context) {\n this.rollbackDefaults(context, savepoint);\n }\n return error;\n } catch (error) {\n if (context) {\n this.rollbackDefaults(context, savepoint);\n }\n throw error;\n }\n }\n installDepthGuards(root) {\n const state = { context: null };\n const stack = [root];\n const seen = /* @__PURE__ */ new WeakSet();\n while (stack.length > 0) {\n const schema = stack.pop();\n if (!schema || typeof schema !== \"object\" || seen.has(schema)) {\n continue;\n }\n seen.add(schema);\n if (typeof schema.$validate === \"function\") {\n const directValidate = schema.$validate;\n schema.$validate = getNamedFunction(directValidate.name, (data) => {\n const context = state.context;\n if (!context) {\n return directValidate(data);\n }\n const nextDepth = context.depth + 1;\n if (nextDepth > this.maxDepth) {\n context.depthExceeded = true;\n if (!context.depthError) {\n context.depthError = this.depthError();\n }\n return context.depthError;\n }\n context.depth = nextDepth;\n try {\n return directValidate(data);\n } finally {\n context.depth--;\n }\n });\n }\n const children = this.schemaChildren(schema);\n for (const child of children) {\n stack.push(child);\n }\n }\n return state;\n }\n compileSchema(schema) {\n if (schema === true) {\n return {\n $validate: getNamedFunction(\"Validate_True\", () => {\n })\n };\n }\n if (schema === false) {\n const compiledFalse = {};\n const defineError = getDefinedErrorFunctionForKey(\n \"oneOf\",\n compiledFalse,\n this.failFast\n );\n compiledFalse.$validate = getNamedFunction(\n \"Validate_False\",\n (data) => defineError(\"Value is not valid\", { data })\n );\n return compiledFalse;\n }\n const sourceSchema = schema && typeof schema === \"object\" && !Array.isArray(schema) ? schema : null;\n const schemaCanApplyDefaults = sourceSchema !== null && this.compilingMutableSchemas.has(sourceSchema);\n if (sourceSchema) {\n const cached = this.compileCache.get(sourceSchema);\n if (cached) {\n return cached;\n }\n }\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n schema = { oneOf: [schema] };\n }\n schema = this.normalizeSchemaForCompile(schema);\n const compiledSchema = deepCloneUnfreeze(\n schema\n );\n if (sourceSchema) {\n this.compileCache.set(sourceSchema, compiledSchema);\n }\n if (schemaCanApplyDefaults) {\n definePropertyOrThrow(compiledSchema, \"_canApplyDefaults\", {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n const validateSubschema = this.compilingRequiresContext ? this.validateSubschema.bind(this) : void 0;\n let schemaHasRef = false;\n if (\"$ref\" in schema) {\n schemaHasRef = true;\n const refValidator = this.getKeyword(\"$ref\");\n if (refValidator) {\n const defineError = getDefinedErrorFunctionForKey(\n \"$ref\",\n schema[\"$ref\"],\n this.failFast\n );\n const isBuiltinRef = refValidator === keywords.$ref;\n compiledSchema.$validate = getNamedFunction(\n isBuiltinRef ? \"Validate_Reference\" : refValidator.name || \"$ref\",\n (data) => refValidator(\n compiledSchema,\n data,\n defineError,\n this,\n validateSubschema\n )\n );\n if (!isBuiltinRef) {\n schemaHasRef = false;\n }\n }\n for (const key of [\"definitions\", \"$defs\"]) {\n const definitions = schema[key];\n if (!definitions || typeof definitions !== \"object\") {\n continue;\n }\n const compiledDefinitions = {};\n for (const definitionKey of Object.keys(definitions)) {\n compiledDefinitions[definitionKey] = this.compileSchema(\n definitions[definitionKey]\n );\n }\n compiledSchema[key] = compiledDefinitions;\n }\n if (schemaHasRef) {\n this.markSchemaHasRef(compiledSchema);\n }\n return compiledSchema;\n }\n const validators = [];\n const activeNames = [];\n const pendingCombinators = [];\n if (this.useDefaults !== false && this.getKeyword(\"properties\") === keywords.properties && this.hasPropertyDefaults(schema)) {\n const applyDefaults = this.useDefaults === \"empty\" ? applyEmptyPropertyDefaults : applyPropertyDefaults;\n validators.push({\n name: applyDefaults.name,\n validate: getNamedFunction(\n applyDefaults.name,\n (data) => applyDefaults(compiledSchema, data, this)\n )\n });\n activeNames.push(applyDefaults.name);\n }\n if (\"type\" in schema) {\n const defineTypeError = getDefinedErrorFunctionForKey(\n \"type\",\n schema,\n this.failFast\n );\n const types = Array.isArray(schema.type) ? schema.type : schema.type.split(\",\").map((t) => t.trim());\n const typeFunctions = [];\n const typeNames = [];\n const defaultTypeNames = [];\n let allTypesDefault = true;\n for (const type2 of types) {\n const validator = this.getType(type2);\n if (validator) {\n typeFunctions.push(validator);\n typeNames.push(validator.name);\n if (this.isDefaultTypeValidator(type2, validator)) {\n defaultTypeNames.push(type2);\n } else {\n allTypesDefault = false;\n }\n }\n }\n if (typeFunctions.length === 0) {\n throw getDefinedErrorFunctionForKey(\n \"type\",\n schema,\n this.failFast\n )(\"Invalid type for schema\", { data: schema.type });\n }\n let combinedTypeValidator;\n let typeMethodName = \"\";\n if (typeFunctions.length === 1 && allTypesDefault) {\n const singleTypeName = defaultTypeNames[0];\n typeMethodName = singleTypeName;\n combinedTypeValidator = this.failFast && FAIL_FAST_TYPE_VALIDATORS[singleTypeName] ? FAIL_FAST_TYPE_VALIDATORS[singleTypeName] : createBuiltinTypeValidator(\n singleTypeName,\n defineTypeError,\n typeFunctions[0]\n );\n } else if (typeFunctions.length > 1 && allTypesDefault) {\n typeMethodName = defaultTypeNames.join(\"_OR_\");\n const allowsObject = defaultTypeNames.includes(\"object\");\n const allowsArray = defaultTypeNames.includes(\"array\");\n const allowsString = defaultTypeNames.includes(\"string\");\n const allowsNumber = defaultTypeNames.includes(\"number\");\n const allowsInteger = defaultTypeNames.includes(\"integer\");\n const allowsBoolean = defaultTypeNames.includes(\"boolean\");\n const allowsNull = defaultTypeNames.includes(\"null\");\n combinedTypeValidator = (data) => {\n const dataType = typeof data;\n if (dataType === \"number\") {\n if (!Number.isFinite(data)) {\n return defineTypeError(\"Invalid type\", { data });\n }\n if (allowsNumber || allowsInteger && Number.isInteger(data)) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n if (dataType === \"string\") {\n if (allowsString) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n if (dataType === \"boolean\") {\n if (allowsBoolean) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n if (dataType === \"object\") {\n if (data === null) {\n if (allowsNull) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n if (Array.isArray(data)) {\n if (allowsArray) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n if (allowsObject) {\n return;\n }\n return defineTypeError(\"Invalid type\", { data });\n }\n return defineTypeError(\"Invalid type\", { data });\n };\n } else if (typeFunctions.length === 1) {\n typeMethodName = typeNames[0];\n const singleTypeFn = typeFunctions[0];\n combinedTypeValidator = (data) => {\n if (!singleTypeFn(data)) {\n return defineTypeError(\"Invalid type\", { data });\n }\n };\n } else {\n typeMethodName = typeNames.join(\"_OR_\");\n combinedTypeValidator = (data) => {\n for (let i = 0; i < typeFunctions.length; i++) {\n if (typeFunctions[i](data)) {\n return;\n }\n }\n return defineTypeError(\"Invalid type\", { data });\n };\n }\n validators.push({\n name: typeMethodName,\n validate: getNamedFunction(typeMethodName, combinedTypeValidator)\n });\n activeNames.push(typeMethodName);\n }\n const { type, $id, $ref, $validate, required, ...otherKeys } = schema;\n const otherKeyNames = Object.keys(otherKeys);\n const keyOrder = required ? [\"required\", ...otherKeyNames] : otherKeyNames;\n for (const key of keyOrder) {\n const keywordFn = this.getKeyword(key);\n if (!keywordFn) {\n continue;\n }\n if (this.shouldSkipKeyword(schema, key)) {\n continue;\n }\n const defineError = getDefinedErrorFunctionForKey(\n key,\n schema[key],\n this.failFast\n );\n const fnName = keywordFn.name || key;\n if ((key === \"allOf\" || key === \"anyOf\" || key === \"oneOf\") && keywordFn === keywords[key]) {\n const item = {\n name: fnName,\n validate: () => {\n throw new ValidationError(\"Combinator validator was not prepared\");\n }\n };\n validators.push(item);\n pendingCombinators.push({ item, key, defineError });\n activeNames.push(fnName);\n continue;\n }\n const keywordValidate = validateSubschema ? (data) => keywordFn(\n compiledSchema,\n data,\n defineError,\n this,\n validateSubschema\n ) : (data) => keywordFn(\n compiledSchema,\n data,\n defineError,\n this\n );\n validators.push({\n name: fnName,\n validate: getNamedFunction(fnName, keywordValidate)\n });\n activeNames.push(fnName);\n }\n const literalKeywords = [\"enum\", \"const\", \"default\", \"examples\"];\n for (const key of keyOrder) {\n if (literalKeywords.includes(key)) {\n continue;\n }\n if (schema[key] && typeof schema[key] === \"object\" && !Array.isArray(schema[key])) {\n if (key === \"properties\") {\n for (const subKey of Object.keys(schema[key])) {\n const compiledSubSchema2 = this.compileSchema(\n schema[key][subKey]\n );\n if (compiledSubSchema2._hasRef === true) {\n schemaHasRef = true;\n }\n compiledSchema[key][subKey] = compiledSubSchema2;\n }\n continue;\n }\n const compiledSubSchema = this.compileSchema(schema[key]);\n if (compiledSubSchema._hasRef === true) {\n schemaHasRef = true;\n }\n compiledSchema[key] = compiledSubSchema;\n continue;\n }\n if (Array.isArray(schema[key])) {\n for (let i = 0; i < schema[key].length; i++) {\n if (this.isSchemaLike(schema[key][i])) {\n const compiledSubSchema = this.compileSchema(schema[key][i]);\n if (compiledSubSchema._hasRef === true) {\n schemaHasRef = true;\n }\n compiledSchema[key][i] = compiledSubSchema;\n }\n }\n continue;\n }\n }\n if (this.isPlainObject(schema.properties)) {\n definePropertyOrThrow(compiledSchema, \"_propKeys\", {\n value: Object.keys(schema.properties),\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n if (this.useDefaults !== false && this.isPlainObject(schema.properties) && this.hasPropertyDefaults(schema)) {\n const defaultKeys = Object.keys(schema.properties).filter(\n (key) => {\n const property = schema.properties[key];\n return property && typeof property === \"object\" && !Array.isArray(property) && hasOwn(property, \"default\");\n }\n );\n if (defaultKeys.length > 0) {\n definePropertyOrThrow(compiledSchema, \"_defaultKeys\", {\n value: defaultKeys,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n }\n prepareCombinatorEntries(compiledSchema);\n for (let index = 0; index < pendingCombinators.length; index++) {\n const pending = pendingCombinators[index];\n const transactions = compiledSchema._canApplyDefaults === true ? {\n savepoint: () => this.#defaultSavepoint(),\n rollback: (savepoint) => this.#rollbackDefaultSavepoint(savepoint),\n capture: (savepoint) => this.#captureDefaultSavepoint(savepoint),\n restore: (mutations) => this.#restoreDefaults(mutations)\n } : void 0;\n pending.item.validate = getNamedFunction(\n pending.item.name,\n createCombinatorValidator(\n pending.key,\n compiledSchema,\n pending.defineError,\n validateSubschema,\n transactions\n )\n );\n }\n if (schemaHasRef) {\n this.markSchemaHasRef(compiledSchema);\n }\n if (validators.length === 0) {\n return compiledSchema;\n }\n if (validators.length === 1) {\n const v = validators[0];\n compiledSchema.$validate = getNamedFunction(v.name, v.validate);\n } else {\n const compositeName = \"Validate_\" + activeNames.join(\"_AND_\");\n const masterValidator = (data) => {\n for (let i = 0; i < validators.length; i++) {\n const v = validators[i];\n const error = v.validate(data);\n if (error) {\n return error;\n }\n }\n return;\n };\n compiledSchema.$validate = getNamedFunction(\n compositeName,\n masterValidator\n );\n }\n return compiledSchema;\n }\n isSchemaLike(subSchema) {\n if (subSchema && typeof subSchema === \"object\" && !Array.isArray(subSchema)) {\n if (\"type\" in subSchema) {\n return true;\n }\n for (let subKey in subSchema) {\n if (subKey in this.keywords) {\n return true;\n }\n }\n }\n return false;\n }\n getCompiledReferenceTarget(ref, position, registry) {\n const resolvedUri = this.resolveUri(ref, position.baseUri, \"$ref\");\n const exactTarget = registry.aliases.get(resolvedUri);\n if (exactTarget) {\n return this.compileCache.get(exactTarget);\n }\n const resourceRoot = registry.aliases.get(this.resourceUri(resolvedUri));\n if (!resourceRoot) {\n return;\n }\n const compiledResource = this.compileCache.get(resourceRoot);\n if (!compiledResource) {\n return;\n }\n const hashIndex = resolvedUri.indexOf(\"#\");\n const fragment = hashIndex === -1 ? \"\" : resolvedUri.slice(hashIndex + 1);\n if (fragment.length === 0) {\n return compiledResource;\n }\n if (fragment.startsWith(\"/\")) {\n return resolvePath(compiledResource, `#${fragment}`);\n }\n return;\n }\n linkReferences(registry) {\n for (let index = 0; index < registry.positions.length; index++) {\n const position = registry.positions[index];\n if (typeof position.source.$ref !== \"string\" || this.getKeyword(\"$ref\") !== keywords.$ref) {\n continue;\n }\n const node = this.compileCache.get(position.source);\n const target = this.getCompiledReferenceTarget(\n position.source.$ref,\n position,\n registry\n );\n if (!node || typeof target === \"undefined\") {\n const error = new ValidationError(\n `Reference not found: ${position.source.$ref}`\n );\n error.code = \"REFERENCE_NOT_FOUND\";\n error.keyword = \"$ref\";\n throw error;\n }\n let targetValidate;\n if (target === true) {\n targetValidate = getNamedFunction(\"Validate_Ref_True\", () => {\n });\n } else if (target === false) {\n const defineError = getDefinedErrorFunctionForKey(\n \"$ref\",\n node,\n this.failFast\n );\n targetValidate = getNamedFunction(\n \"Validate_Ref_False\",\n (data) => defineError(\"Value is not valid\", { data })\n );\n } else {\n if (typeof target.$validate !== \"function\") {\n target.$validate = getNamedFunction(\n \"Validate_Ref_Any\",\n () => {\n }\n );\n }\n targetValidate = target.$validate;\n }\n definePropertyOrThrow(node, \"_resolvedRef\", {\n value: targetValidate,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n }\n};\nvar __EXPORTS__={\n SchemaShield,\n ValidationError,\n deepClone:deepCloneUnfreeze\n};\n;typeof module!=='undefined'?module.exports=__EXPORTS__:self.SchemaShield=__EXPORTS__})()"],"mappings":"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"}