schema-shield 0.0.2

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.
@@ -0,0 +1 @@
1
+ (()=>{var e=class extends Error{name;pointer;message;value;code;constructor(e,r={pointer:"",value:null,code:""}){super(e),this.name="ValidationError",this.pointer=r.pointer,this.message=e,this.value=r.value,this.code=r.code}};function r(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let a=0;a<e.length;a++)if(!r(e[a],t[a]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const a=Object.keys(e);if(a.length!==Object.keys(t).length)return!1;for(const o of a)if(!r(e[o],t[o]))return!1;return!0}return e===t}function t(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}var a={"date-time":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/,uri:/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,email:/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,ipv6:/^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?=(?:[0-9a-fA-F]{0,4}:){0,7}[0-9a-fA-F]{0,4}(?![:.\w]))(([0-9a-fA-F]{1,4}:){1,7}|:)((:[0-9a-fA-F]{1,4}){1,7}|:))$/,hostname:/^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}(\.[a-zA-Z0-9][a-zA-Z0-9-]{0,62})*$/};function o(r){throw new e(`Format "${r}" is not implemented yet. Please open an issue on GitHub.`)}var i={"date-time":e=>a["date-time"].test(e),uri:e=>a.uri.test(e),email:e=>a.email.test(e),ipv4:e=>a.ipv4.test(e),ipv6:e=>a.ipv6.test(e),hostname:e=>a.hostname.test(e),time:o,date:o,duration:o,"idn-email":o,"idn-hostname":o,uuid:o,"uri-reference":o,iri:o,"iri-reference":o,"uri-template":o,"json-pointer":o,"relative-json-pointer":o,regex:o},n={object:(r,t,a)=>"object"!=typeof t||null===t||Array.isArray(t)?{valid:!1,errors:[new e("Data is not an object",{pointer:a,value:t,code:"NOT_AN_OBJECT"})],data:t}:{valid:!0,errors:[],data:t},array(r,t,a){if(Array.isArray(t))return{valid:!0,errors:[],data:t};if("object"==typeof t&&null!==t&&"length"in t){const r=Object.keys(t);return r.length>0&&("0"!==r[0]||r.length!==t.length)?{valid:!1,errors:[new e("Data is not an array",{pointer:a,value:t,code:"NOT_AN_ARRAY"})],data:t}:{valid:!0,errors:[],data:t}}return{valid:!1,errors:[new e("Data is not an array",{pointer:a,value:t,code:"NOT_AN_ARRAY"})],data:t}},string:(r,t,a)=>"string"==typeof t?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Data is not a string",{pointer:a,value:t,code:"NOT_A_STRING"})],data:t},number:(r,t,a)=>"number"==typeof t?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Data is not a number",{pointer:a,value:t,code:"NOT_A_NUMBER"})],data:t},integer:(r,t,a)=>"number"==typeof t&&Number.isInteger(t)?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Data is not an integer",{pointer:a,value:t,code:"NOT_AN_INTEGER"})],data:t},boolean:(r,t,a)=>"boolean"==typeof t?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Data is not a boolean",{pointer:a,value:t,code:"NOT_A_BOOLEAN"})],data:t},null:(r,t,a)=>null===t?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Data is not null",{pointer:a,value:t,code:"NOT_NULL"})],data:t}},s={...{required(r,a,o){if(!t(a))return{valid:!0,errors:[],data:a};const i=[];for(let t=0;t<r.required.length;t++){const n=r.required[t];a.hasOwnProperty(n)||i.push(new e("Missing required property",{pointer:`${o}/${n}`,value:a,code:"MISSING_REQUIRED_PROPERTY"}))}return{valid:0===i.length,errors:i,data:a}},properties(r,a,o,i){if(!t(a))return{valid:!0,errors:[],data:a};const n=[];let s={...a};for(let l in r.properties){if(!a.hasOwnProperty(l)||void 0===a[l]){t(r.properties[l])&&"default"in r.properties[l]&&(s[l]=r.properties[l].default);continue}if("boolean"==typeof r.properties[l]){!1===r.properties[l]&&n.push(new e("Property is not allowed",{pointer:`${o}/${l}`,value:a[l],code:"PROPERTY_NOT_ALLOWED"}));continue}const{validator:d}=r.properties[l];if(!d)continue;const u=d(r.properties[l],s[l],`${o}/${l}`,i);s[l]=u.data,u.valid||n.push(...u.errors)}return{valid:0===n.length,errors:n,data:s}},maxProperties:(r,a,o)=>!t(a)||Object.keys(a).length<=r.maxProperties?{valid:!0,errors:[],data:a}:{valid:!1,errors:[new e("Object has too many properties",{pointer:o,value:a,code:"OBJECT_TOO_MANY_PROPERTIES"})],data:a},minProperties:(r,a,o)=>!t(a)||Object.keys(a).length>=r.minProperties?{valid:!0,errors:[],data:a}:{valid:!1,errors:[new e("Object has too few properties",{pointer:o,value:a,code:"OBJECT_TOO_FEW_PROPERTIES"})],data:a},additionalProperties(r,a,o,i){if(!t(a))return{valid:!0,errors:[],data:a};const n=[];let s={...a};for(let t in a){if(r.properties&&r.properties.hasOwnProperty(t))continue;if(r.patternProperties){let e=!1;for(let a in r.patternProperties)if(new RegExp(a).test(t)){e=!0;break}if(e)continue}if(!1===r.additionalProperties){n.push(new e("Additional property not allowed",{pointer:`${o}/${t}`,value:a,code:"ADDITIONAL_PROPERTY_NOT_ALLOWED"}));continue}const{validator:l}=r.additionalProperties;if(!l)continue;const d=l(r.additionalProperties,s[t],`${o}/${t}`,i);s[t]=d.data,d.valid||n.push(...d.errors)}return{valid:0===n.length,errors:n,data:s}},patternProperties(r,a,o,i){if(!t(a))return{valid:!0,errors:[],data:a};const n=[];let s={...a};for(let t in r.patternProperties){if("boolean"==typeof r.patternProperties[t]){if(!1===r.patternProperties[t])for(let r in s)new RegExp(t).test(r)&&n.push(new e("Property is not allowed",{pointer:`${o}/${r}`,value:a[r],code:"PROPERTY_NOT_ALLOWED"}));continue}const{validator:l}=r.patternProperties[t];if(l)for(let e in s)if(new RegExp(t).test(e)){const a=l(r.patternProperties[t],s[e],`${o}/${e}`,i);s[e]=a.data,a.valid||n.push(...a.errors)}}return{valid:0===n.length,errors:n,data:s}}},...{items(r,t,a,o){if(!Array.isArray(t))return{valid:!0,errors:[],data:t};const i=[];let n=[...t];if(Array.isArray(r.items))for(let s=0;s<r.items.length;s++){if("boolean"==typeof r.items[s]){!1===r.items[s]&&void 0!==t[s]&&i.push(new e("Array item is not allowed",{pointer:`${a}/${s}`,value:t[s],code:"ARRAY_ITEM_NOT_ALLOWED"}));continue}const{validator:l}=r.items[s];if(!l)continue;const d=l(r.items[s],n[s],`${a}/${s}`,o);n[s]=d.data,d.valid||i.push(...d.errors)}else if("boolean"==typeof r.items)!1===r.items&&t.length>0&&i.push(new e("Array is not allowed",{pointer:a,value:t,code:"ARRAY_NOT_ALLOWED"}));else{const{validator:e}=r.items;if(!e)return{valid:!0,errors:[],data:t};for(let t=0;t<n.length;t++){const s=e(r.items,n[t],`${a}/${t}`,o);n[t]=s.data,s.valid||i.push(...s.errors)}}return{valid:0===i.length,errors:i,data:n}},minItems:(r,t,a)=>!Array.isArray(t)||t.length>=r.minItems?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Array is too short",{pointer:a,value:t,code:"ARRAY_TOO_SHORT"})],data:t},maxItems:(r,t,a)=>!Array.isArray(t)||t.length<=r.maxItems?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("Array is too long",{pointer:a,value:t,code:"ARRAY_TOO_LONG"})],data:t},additionalItems(r,t,a,o){if(!Array.isArray(t)||!r.items||!Array.isArray(r.items))return{valid:!0,errors:[],data:t};if(!1===r.additionalItems)return t.length>r.items.length?{valid:!1,errors:[new e("Array has too many items",{pointer:a,value:t,code:"ARRAY_TOO_MANY_ITEMS"})],data:t}:{valid:!0,errors:[],data:t};const i=[];let n=[...t];if("object"==typeof r.additionalItems)for(let e=r.items.length;e<n.length;e++){const{validator:t}=r.additionalItems,s=t(r.additionalItems,n[e],`${a}/${e}`,o);s.valid||i.push(...s.errors),n[e]=s.data}return{valid:0===i.length,errors:i,data:n}},uniqueItems(r,a,o){if(!Array.isArray(a)||!r.uniqueItems)return{valid:!0,errors:[],data:a};const i=new Set;for(const r of a){let n=r;if("string"==typeof r)n=`"${r}"`;else if(t(r)){const e=Object.keys(r).sort(),t={};for(let a=0;a<e.length;a++)t[e[a]]=r[e[a]];n=JSON.stringify(t)}else Array.isArray(r)&&(n=JSON.stringify(r));if(i.has(n))return{valid:!1,errors:[new e("Array items are not unique",{pointer:o,value:a,code:"ARRAY_ITEMS_NOT_UNIQUE"})],data:a};i.add(n)}return{valid:!0,errors:[],data:a}}},...{minLength:(r,t,a)=>"string"!=typeof t||t.length>=r.minLength?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("String is too short",{pointer:a,value:t,code:"STRING_TOO_SHORT"})],data:t},maxLength:(r,t,a)=>"string"!=typeof t||t.length<=r.maxLength?{valid:!0,errors:[],data:t}:{valid:!1,errors:[new e("String is too long",{pointer:a,value:t,code:"STRING_TOO_LONG"})],data:t},pattern(r,t,a){if("string"!=typeof t)return{valid:!0,errors:[],data:t};const o="string"==typeof r.pattern?new RegExp(r.pattern):r.pattern;if(o instanceof RegExp==!1)return{valid:!1,errors:[new e("Pattern is not a valid regular expression",{pointer:a,value:t,code:"PATTERN_IS_NOT_REGEXP"})],data:t};const i=o.test(t);return{valid:i,errors:i?[]:[new e("String does not match pattern",{pointer:a,value:t,code:"STRING_DOES_NOT_MATCH_PATTERN"})],data:t}},format(r,t,a,o){if("string"!=typeof t)return{valid:!0,errors:[],data:t};const i=o.formats.get(r.format);if(!i)return{valid:!1,errors:[new e(`Unknown format ${r.format}`,{pointer:a,value:t,code:"UNKNOWN_FORMAT"})],data:t};const n=i(t);return{valid:n,errors:n?[]:[new e(`String does not match format ${r.format}`,{pointer:a,value:t,code:"STRING_DOES_NOT_MATCH_FORMAT"})],data:t}},enum(t,a,o){for(let e=0;e<t.enum.length;e++)if(t.enum[e]===a)return{valid:!0,errors:[],data:a};if(Array.isArray(a))for(let e=0;e<t.enum.length;e++)if(Array.isArray(t.enum[e])&&r(t.enum[e],a))return{valid:!0,errors:[],data:a};if("object"==typeof a&&null!==a)for(let e=0;e<t.enum.length;e++)if("object"==typeof t.enum[e]&&null!==t.enum[e]&&r(t.enum[e],a))return{valid:!0,errors:[],data:a};return{valid:!1,errors:[new e(`Value must be one of ${t.enum.join(", ")}`,{pointer:o,value:a,code:"VALUE_NOT_IN_ENUM"})],data:a}}},...{minimum(r,t,a){if("number"!=typeof t)return{valid:!0,errors:[],data:t};const o=t>=(r.exclusiveMinimum?r.minimum+1e-15:r.minimum);return{valid:o,errors:o?[]:[new e("Number is too small",{pointer:a,value:t,code:"NUMBER_TOO_SMALL"})],data:t}},maximum(r,t,a){if("number"!=typeof t)return{valid:!0,errors:[],data:t};const o=t<=(r.exclusiveMaximum?r.maximum-1e-15:r.maximum);return{valid:o,errors:o?[]:[new e("Number is too large",{pointer:a,value:t,code:"NUMBER_TOO_LARGE"})],data:t}},multipleOf(r,t,a){if("number"!=typeof t)return{valid:!0,errors:[],data:t};const o=t/r.multipleOf,i=Math.abs(o-Math.round(o))<1e-15;return{valid:i,errors:i?[]:[new e("Number is not a multiple of",{pointer:a,value:t,code:"NUMBER_NOT_MULTIPLE_OF"})],data:t}}},...{nullable:(r,t,a)=>r.nullable&&null!==t?{valid:!1,errors:[new e("Value must be null to be empty",{pointer:a,value:t,code:"VALUE_NOT_NULL"})],data:t}:{valid:!0,errors:[],data:t},oneOf(r,a,o,i){const n=[];let s=0,l=a;for(let e=0;e<r.oneOf.length;e++)if(t(r.oneOf[e])){const{validator:t}=r.oneOf[e];if(!t){s++;continue}const a=t(r.oneOf[e],l,o,i);a.valid?s++:n.push(...a.errors),l=a.data}else{if("boolean"==typeof r.oneOf[e]){Boolean(a)===r.oneOf[e]&&s++;continue}a===r.oneOf[e]&&s++}return 1===s?{valid:!0,errors:[],data:l}:{valid:!1,errors:[new e("Value must match exactly one schema in oneOf",{pointer:o,value:a,code:"VALUE_DOES_NOT_MATCH_ONE_OF"})],data:l}},allOf(r,a,o,i){const n=[];let s=a;for(let l=0;l<r.allOf.length;l++)if(t(r.allOf[l])){const{validator:e}=r.allOf[l];if(!e)continue;const t=e(r.allOf[l],s,o,i);t.valid||n.push(...t.errors),s=t.data}else{if("boolean"==typeof r.allOf[l]){Boolean(a)!==r.allOf[l]&&n.push(new e("Value must match all schemas in allOf",{pointer:o,value:a,code:"VALUE_DOES_NOT_MATCH_ALL_OF"}));continue}a!==r.allOf[l]&&n.push(new e("Value must match all schemas in allOf",{pointer:o,value:a,code:"VALUE_DOES_NOT_MATCH_ALL_OF"}))}return{valid:0===n.length,errors:n,data:s}},anyOf(r,a,o,i){let n=a;for(let e=0;e<r.anyOf.length;e++)if(t(r.anyOf[e])){const{validator:t}=r.anyOf[e];if(!t)return{valid:!0,errors:[],data:a};const s=t(r.anyOf[e],n,o,i);if(n=s.data,s.valid)return{valid:!0,errors:[],data:n}}else{if("boolean"==typeof r.anyOf[e]&&Boolean(a)===r.anyOf[e])return{valid:!0,errors:[],data:n};if(a===r.anyOf[e])return{valid:!0,errors:[],data:n}}return{valid:!1,errors:[new e("Value must match at least one schema in anyOf",{pointer:o,value:a,code:"VALUE_DOES_NOT_MATCH_ANY_OF"})],data:a}},dependencies(r,a,o,i){if(!t(a))return{valid:!0,errors:[],data:a};const n=[];let s=a;for(const t in r.dependencies){if(t in a==!1)continue;const l=r.dependencies[t];if(Array.isArray(l)){for(let r=0;r<l.length;r++)l[r]in a||n.push(new e(`Dependency ${l[r]} is missing`,{pointer:o,value:a,code:"DEPENDENCY_MISSING"}));continue}if("boolean"==typeof l){if(l)continue;n.push(new e(`Dependency ${t} is missing`,{pointer:o,value:a,code:"DEPENDENCY_MISSING"}));continue}if("string"==typeof l){if(l in a)continue;n.push(new e(`Dependency ${l} is missing`,{pointer:o,value:a,code:"DEPENDENCY_MISSING"}));continue}const{validator:d}=l;if(!d)continue;const u=d(l,s,o,i);u.valid||n.push(...u.errors),s=u.data}return{valid:0===n.length,errors:n,data:s}}}},l={SchemaShield:class{types=new Map;formats=new Map;keywords=new Map;constructor(){for(const e in n)this.addType(e,n[e]);for(const e in s)this.addKeyword(e,s[e]);for(const e in i)this.addFormat(e,i[e])}addType(e,r){this.types.set(e,r)}addFormat(e,r){this.formats.set(e,r)}addKeyword(e,r){this.keywords.set(e,r)}compile(e){const r=this.compileSchema(e,"#"),t=this;function a(e){return r.validator(r,e,"#",t)}return a.compiledSchema=r,a}compileSchema(r,a){if("object"!=typeof r||null===r)throw new e("Schema is not an object",{pointer:a,value:r,code:"SCHEMA_NOT_OBJECT"});const o={...r,pointer:a};if("type"in o){const e=Array.isArray(o.type)?o.type:o.type.split(",").map(e=>e.trim());o.validators=e.filter(e=>this.types.has(e)).map(e=>this.types.get(e))}o.validator=(r,t,a)=>{if(void 0===t&&"#"===a)return{valid:!1,errors:[new e("Data is undefined",{pointer:a,value:t,code:"DATA_UNDEFINED"})],data:t};let o=t;const i=this.validateTypes(r,o,a);return!1===i.valid?i:(o=i.data,this.validateKeywords(r,o,a))};for(let e in r)if("type"!==e){if(this.keywords.has(e)){const r=this.keywords.get(e);o.keywords=o.keywords||{},o.keywords[e]=r}Array.isArray(r[e])?this.handleArraySchema(e,r,a,o):t(r[e])&&this.handleObjectSchema(e,r,a,o)}return o}handleArraySchema(e,r,t,a){a[e]=r[e].map((r,a)=>{if("object"==typeof r&&null!==r){if("type"in r)return this.compileSchema(r,`${t}/${e}/${a}`);for(let o in r)if(this.keywords.has(o))return this.compileSchema(r,`${t}/${e}/${a}`)}return r})}handleObjectSchema(e,r,t,a){if("type"in r[e])a[e]=this.compileSchema(r[e],`${t}/${e}`);else for(let o in r[e])if(a[e]=a[e]||{},this.keywords.has(o))a[e][o]=this.compileSchema(r[e][o],`${t}/${o}`);else if("object"==typeof r[e][o]){if("type"in r[e][o]){a[e][o]=this.compileSchema(r[e][o],`${t}/${e}/${o}`);continue}for(let i in r[e][o])this.keywords.has(i)&&(a[e][o]=this.compileSchema(r[e][o],`${t}/${e}/${o}`))}}validateTypes(e,r,t){if(void 0===r||!Array.isArray(e.validators)||0===e.validators.length)return{valid:!0,errors:[],data:r};let a=[],o=r;for(let i of e.validators){const n=i(e,r,t,this);if(o=n.data,n.valid)return n;a=n.errors}return{valid:0===a.length,errors:a,data:o}}validateKeywords(e,r,t){const a=[];let o=r;if("keywords"in e)for(let r in e.keywords){const i=(0,e.keywords[r])(e,o,t,this);o=i.data,i.valid||a.push(...i.errors)}return{valid:0===a.length,errors:a,data:o}}}};"undefined"!=typeof module?module.exports=l:self.SchemaShield=l})();//# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm5hbWUiLCJwb2ludGVyIiwibWVzc2FnZSIsInZhbHVlIiwiY29kZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInN1cGVyIiwidGhpcyIsImRlZXBFcXVhbCIsIm9iaiIsIm90aGVyIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJpc09iamVjdCIsImRhdGEiLCJSZWdFeHBzIiwidXJpIiwiZW1haWwiLCJpcHY0IiwiaXB2NiIsImhvc3RuYW1lIiwibm90SW1wbGVtZW50ZWRGb3JtYXQiLCJGb3JtYXRzIiwidGVzdCIsInRpbWUiLCJkYXRlIiwiZHVyYXRpb24iLCJ1dWlkIiwiaXJpIiwicmVnZXgiLCJUeXBlcyIsIm9iamVjdCIsInNjaGVtYSIsInZhbGlkIiwiZXJyb3JzIiwiYXJyYXkiLCJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiLCJrZXl3b3JkcyIsInJlcXVpcmVkIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwicHJvcGVydGllcyIsInNjaGVtYVNoaWVsZEluc3RhbmNlIiwiZmluYWxEYXRhIiwiZGVmYXVsdCIsInZhbGlkYXRvciIsInZhbGlkYXRvclJlc3VsdCIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsIm1hdGNoIiwicGF0dGVybiIsIlJlZ0V4cCIsIml0ZW1zIiwidmFsaWRhdG9yRXJyb3JzIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInVuaXF1ZUl0ZW1zIiwidW5pcXVlIiwiU2V0IiwiaXRlbSIsIml0ZW1TdHIiLCJzb3J0Iiwic29ydGVkIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhcyIsImFkZCIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJmb3JtYXRJbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZm9ybWF0cyIsImdldCIsImVudW0iLCJqb2luIiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImFyZU11bHRpcGxlcyIsIk1hdGgiLCJhYnMiLCJyb3VuZCIsIm51bGxhYmxlIiwib25lT2YiLCJ2YWxpZENvdW50IiwidmFsaWRhdGlvblJlc3VsdCIsIkJvb2xlYW4iLCJhbGxPZiIsImFueU9mIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInR5cGVzIiwiTWFwIiwidHlwZSIsImFkZFR5cGUiLCJrZXl3b3JkIiwiYWRkS2V5d29yZCIsImFkZEZvcm1hdCIsInNldCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJzY2hlbWFTaGllbGQiLCJ2YWxpZGF0ZSIsInNwbGl0IiwibWFwIiwidCIsInRyaW0iLCJ2YWxpZGF0b3JzIiwiZmlsdGVyIiwidHlwZUVycm9yc1Jlc3VsdCIsInZhbGlkYXRlVHlwZXMiLCJ2YWxpZGF0ZUtleXdvcmRzIiwiaGFuZGxlQXJyYXlTY2hlbWEiLCJoYW5kbGVPYmplY3RTY2hlbWEiLCJzdWJTY2hlbWEiLCJpbmRleCIsInN1YktleSIsInN1YlN1YktleSIsInNjaGVtYVZhbGlkYXRvciIsInNjaGVtYVJlc3VsdCIsImtleXdvcmRSZXN1bHQiLCJrZXl3b3JkVmFsaWRhdG9yIl0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZW1hU2hpZWxkLCBWYWxpZGF0aW9uRXJyb3JQcm9wcyB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWU6IHN0cmluZztcbiAgcG9pbnRlcjogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVmFsaWRhdGlvbkVycm9yUHJvcHMgPSB7XG4gICAgICBwb2ludGVyOiBcIlwiLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb2RlOiBcIlwiXG4gICAgfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlZhbGlkYXRpb25FcnJvclwiO1xuICAgIHRoaXMucG9pbnRlciA9IG9wdGlvbnMucG9pbnRlcjtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIHRoaXMuY29kZSA9IG9wdGlvbnMuY29kZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFZhbGlkYXRvciA9IChzY2hlbWEsIGRhdGEsIHBvaW50ZXIpID0+IHtcbiAgcmV0dXJuIFtcbiAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTm8gdmFsaWRhdG9yIGZvciB0aGlzIHNjaGVtYVwiLCB7XG4gICAgICBwb2ludGVyLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBjb2RlOiBcIk5PX1ZBTElEQVRPUlwiXG4gICAgfSlcbiAgXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoXG4gIG9iajogQXJyYXk8YW55PiB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG90aGVyOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikgJiYgQXJyYXkuaXNBcnJheShvdGhlcikpIHtcbiAgICBpZiAob2JqLmxlbmd0aCAhPT0gb3RoZXIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtpXSwgb3RoZXJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvdGhlciA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgb3RoZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmogPT09IG90aGVyO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob3RoZXIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtrZXldLCBvdGhlcltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gb2JqID09PSBvdGhlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiwgVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0b3JGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IFJlZ0V4cHMgPSB7XG4gIFwiZGF0ZS10aW1lXCI6XG4gICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGQrKT8oWnxbKy1dXFxkezJ9OlxcZHsyfSkkLyxcbiAgdXJpOiAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvLFxuICBlbWFpbDpcbiAgICAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sXG4gIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJC8sXG4gIGlwdjY6IC9eKD86KD86WzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoPz0oPzpbMC05YS1mQS1GXXswLDR9Oil7MCw3fVswLTlhLWZBLUZdezAsNH0oPyFbOi5cXHddKSkoKFswLTlhLWZBLUZdezEsNH06KXsxLDd9fDopKCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KSkkLyxcbiAgaG9zdG5hbWU6IC9eW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2Mn0oXFwuW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2Mn0pKiQvXG59O1xuXG5mdW5jdGlvbiBub3RJbXBsZW1lbnRlZEZvcm1hdChkYXRhOiBhbnkpIHtcbiAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICBgRm9ybWF0IFwiJHtkYXRhfVwiIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIG9uIEdpdEh1Yi5gXG4gICk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgRm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIHJldHVybiBSZWdFeHBzW1wiZGF0ZS10aW1lXCJdLnRlc3QoZGF0YSk7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIFJlZ0V4cHMudXJpLnRlc3QoZGF0YSk7XG4gIH0sXG4gIGVtYWlsKGRhdGEpIHtcbiAgICByZXR1cm4gUmVnRXhwcy5lbWFpbC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gUmVnRXhwcy5pcHY0LnRlc3QoZGF0YSk7XG4gIH0sXG4gIGlwdjYoZGF0YSkge1xuICAgIHJldHVybiBSZWdFeHBzLmlwdjYudGVzdChkYXRhKTtcbiAgfSxcbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiBSZWdFeHBzLmhvc3RuYW1lLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgdGltZTogbm90SW1wbGVtZW50ZWRGb3JtYXQsXG4gIGRhdGU6IG5vdEltcGxlbWVudGVkRm9ybWF0LFxuICBkdXJhdGlvbjogbm90SW1wbGVtZW50ZWRGb3JtYXQsXG4gIFwiaWRuLWVtYWlsXCI6IG5vdEltcGxlbWVudGVkRm9ybWF0LFxuICBcImlkbi1ob3N0bmFtZVwiOiBub3RJbXBsZW1lbnRlZEZvcm1hdCxcbiAgdXVpZDogbm90SW1wbGVtZW50ZWRGb3JtYXQsXG4gIFwidXJpLXJlZmVyZW5jZVwiOiBub3RJbXBsZW1lbnRlZEZvcm1hdCxcbiAgaXJpOiBub3RJbXBsZW1lbnRlZEZvcm1hdCxcbiAgXCJpcmktcmVmZXJlbmNlXCI6IG5vdEltcGxlbWVudGVkRm9ybWF0LFxuICBcInVyaS10ZW1wbGF0ZVwiOiBub3RJbXBsZW1lbnRlZEZvcm1hdCxcbiAgXCJqc29uLXBvaW50ZXJcIjogbm90SW1wbGVtZW50ZWRGb3JtYXQsXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCI6IG5vdEltcGxlbWVudGVkRm9ybWF0LFxuICByZWdleDogbm90SW1wbGVtZW50ZWRGb3JtYXRcbn07XG4iLCJpbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPiA9IHtcbiAgb2JqZWN0KHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgZGF0YVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3JzOiBbXG4gICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJEYXRhIGlzIG5vdCBhbiBvYmplY3RcIiwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJOT1RfQU5fT0JKRUNUXCJcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSxcbiAgYXJyYXkoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsICYmIFwibGVuZ3RoXCIgaW4gZGF0YSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IGtleSBpcyBhIG51bWJlciBhbmQgdGhlIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGtleXMgLSAxIChsZW5ndGgpXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAwICYmIChrZXlzWzBdICE9PSBcIjBcIiB8fCBrZXlzLmxlbmd0aCAhPT0gZGF0YS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkRhdGEgaXMgbm90IGFuIGFycmF5XCIsIHtcbiAgICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgIGNvZGU6IFwiTk9UX0FOX0FSUkFZXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkRhdGEgaXMgbm90IGFuIGFycmF5XCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiTk9UX0FOX0FSUkFZXCJcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSxcbiAgc3RyaW5nKHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIGRhdGFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiRGF0YSBpcyBub3QgYSBzdHJpbmdcIiwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJOT1RfQV9TVFJJTkdcIlxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuICBudW1iZXIoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgZGF0YVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3JzOiBbXG4gICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJEYXRhIGlzIG5vdCBhIG51bWJlclwiLCB7XG4gICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICBjb2RlOiBcIk5PVF9BX05VTUJFUlwiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG4gIGludGVnZXIoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkRhdGEgaXMgbm90IGFuIGludGVnZXJcIiwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJOT1RfQU5fSU5URUdFUlwiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG4gIGJvb2xlYW4oc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIGRhdGFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiRGF0YSBpcyBub3QgYSBib29sZWFuXCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiTk9UX0FfQk9PTEVBTlwiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG4gIG51bGwoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkRhdGEgaXMgbm90IG51bGxcIiwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJOT1RfTlVMTFwiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IENvbXBpbGVkU2NoZW1hLCBWYWxpZGF0b3JGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPiA9IHtcbiAgLy8gT2JqZWN0XG4gIHJlcXVpcmVkKHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiLCB7XG4gICAgICAgICAgICBwb2ludGVyOiBgJHtwb2ludGVyfS8ke2tleX1gLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICBjb2RlOiBcIk1JU1NJTkdfUkVRVUlSRURfUFJPUEVSVFlcIlxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycywgZGF0YSB9O1xuICB9LFxuXG4gIHByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBwb2ludGVyLCBzY2hlbWFTaGllbGRJbnN0YW5jZSkge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGZpbmFsRGF0YSA9IHsgLi4uZGF0YSB9O1xuICAgIGZvciAobGV0IGtleSBpbiBzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkgfHwgdHlwZW9mIGRhdGFba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNPYmplY3Qoc2NoZW1hLnByb3BlcnRpZXNba2V5XSkgJiZcbiAgICAgICAgICBcImRlZmF1bHRcIiBpbiBzY2hlbWEucHJvcGVydGllc1trZXldXG4gICAgICAgICkge1xuICAgICAgICAgIGZpbmFsRGF0YVtrZXldID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XS5kZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBwb2ludGVyOiBgJHtwb2ludGVyfS8ke2tleX1gLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtrZXldLFxuICAgICAgICAgICAgICBjb2RlOiBcIlBST1BFUlRZX05PVF9BTExPV0VEXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2YWxpZGF0b3IgfSA9IHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEucHJvcGVydGllc1trZXldLFxuICAgICAgICBmaW5hbERhdGFba2V5XSxcbiAgICAgICAgYCR7cG9pbnRlcn0vJHtrZXl9YCxcbiAgICAgICAgc2NoZW1hU2hpZWxkSW5zdGFuY2VcbiAgICAgICk7XG5cbiAgICAgIGZpbmFsRGF0YVtrZXldID0gdmFsaWRhdG9yUmVzdWx0LmRhdGE7XG5cbiAgICAgIGlmICghdmFsaWRhdG9yUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRvclJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMsIGRhdGE6IGZpbmFsRGF0YSB9O1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPD0gc2NoZW1hLm1heFByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiT2JqZWN0IGhhcyB0b28gbWFueSBwcm9wZXJ0aWVzXCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiT0JKRUNUX1RPT19NQU5ZX1BST1BFUlRJRVNcIlxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIG1pblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiT2JqZWN0IGhhcyB0b28gZmV3IHByb3BlcnRpZXNcIiwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJPQkpFQ1RfVE9PX0ZFV19QUk9QRVJUSUVTXCJcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSxcblxuICBhZGRpdGlvbmFsUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIHBvaW50ZXIsIHNjaGVtYVNoaWVsZEluc3RhbmNlKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZmluYWxEYXRhID0geyAuLi5kYXRhIH07XG4gICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBwYXR0ZXJuIGluIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChuZXcgUmVnRXhwKHBhdHRlcm4pLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnR5IG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgIHBvaW50ZXI6IGAke3BvaW50ZXJ9LyR7a2V5fWAsXG4gICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgIGNvZGU6IFwiQURESVRJT05BTF9QUk9QRVJUWV9OT1RfQUxMT1dFRFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMsXG4gICAgICAgIGZpbmFsRGF0YVtrZXldLFxuICAgICAgICBgJHtwb2ludGVyfS8ke2tleX1gLFxuICAgICAgICBzY2hlbWFTaGllbGRJbnN0YW5jZVxuICAgICAgKTtcblxuICAgICAgZmluYWxEYXRhW2tleV0gPSB2YWxpZGF0b3JSZXN1bHQuZGF0YTtcblxuICAgICAgaWYgKCF2YWxpZGF0b3JSZXN1bHQudmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdG9yUmVzdWx0LmVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycywgZGF0YTogZmluYWxEYXRhIH07XG4gIH0sXG5cbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBwb2ludGVyLCBzY2hlbWFTaGllbGRJbnN0YW5jZSkge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGZpbmFsRGF0YSA9IHsgLi4uZGF0YSB9O1xuICAgIGZvciAobGV0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZmluYWxEYXRhKSB7XG4gICAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuKS50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXI6IGAke3BvaW50ZXJ9LyR7a2V5fWAsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtrZXldLFxuICAgICAgICAgICAgICAgICAgY29kZTogXCJQUk9QRVJUWV9OT1RfQUxMT1dFRFwiXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQga2V5IGluIGZpbmFsRGF0YSkge1xuICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuKS50ZXN0KGtleSkpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3JSZXN1bHQgPSB2YWxpZGF0b3IoXG4gICAgICAgICAgICBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0sXG4gICAgICAgICAgICBmaW5hbERhdGFba2V5XSxcbiAgICAgICAgICAgIGAke3BvaW50ZXJ9LyR7a2V5fWAsXG4gICAgICAgICAgICBzY2hlbWFTaGllbGRJbnN0YW5jZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBmaW5hbERhdGFba2V5XSA9IHZhbGlkYXRvclJlc3VsdC5kYXRhO1xuXG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3JSZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRvclJlc3VsdC5lcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMsIGRhdGE6IGZpbmFsRGF0YSB9O1xuICB9XG59O1xuIiwiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEsIFZhbGlkYXRvckZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4gPSB7XG4gIGl0ZW1zKHNjaGVtYSwgZGF0YSwgcG9pbnRlciwgc2NoZW1hU2hpZWxkSW5zdGFuY2UpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGZpbmFsRGF0YSA9IFsuLi5kYXRhXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5pdGVtc1tpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hLml0ZW1zW2ldID09PSBmYWxzZSAmJiB0eXBlb2YgZGF0YVtpXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJBcnJheSBpdGVtIGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBwb2ludGVyOiBgJHtwb2ludGVyfS8ke2l9YCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICBjb2RlOiBcIkFSUkFZX0lURU1fTk9UX0FMTE9XRURcIlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gc2NoZW1hLml0ZW1zW2ldIGFzIENvbXBpbGVkU2NoZW1hO1xuICAgICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvcihcbiAgICAgICAgICBzY2hlbWEuaXRlbXNbaV0sXG4gICAgICAgICAgZmluYWxEYXRhW2ldLFxuICAgICAgICAgIGAke3BvaW50ZXJ9LyR7aX1gLFxuICAgICAgICAgIHNjaGVtYVNoaWVsZEluc3RhbmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgZmluYWxEYXRhW2ldID0gdmFsaWRhdG9yUmVzdWx0LmRhdGE7XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0b3JSZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0b3JSZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNjaGVtYS5pdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEuaXRlbXMgPT09IGZhbHNlICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQXJyYXkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgY29kZTogXCJBUlJBWV9OT1RfQUxMT1dFRFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyB2YWxpZGF0b3IgfSA9IHNjaGVtYS5pdGVtcyBhcyBDb21waWxlZFNjaGVtYTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvckVycm9ycyA9IHZhbGlkYXRvcihcbiAgICAgICAgICBzY2hlbWEuaXRlbXMsXG4gICAgICAgICAgZmluYWxEYXRhW2ldLFxuICAgICAgICAgIGAke3BvaW50ZXJ9LyR7aX1gLFxuICAgICAgICAgIHNjaGVtYVNoaWVsZEluc3RhbmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgZmluYWxEYXRhW2ldID0gdmFsaWRhdG9yRXJyb3JzLmRhdGE7XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0b3JFcnJvcnMudmFsaWQpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0b3JFcnJvcnMuZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMsIGRhdGE6IGZpbmFsRGF0YSB9O1xuICB9LFxuXG4gIG1pbkl0ZW1zKHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQXJyYXkgaXMgdG9vIHNob3J0XCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiQVJSQVlfVE9PX1NIT1JUXCJcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSxcblxuICBtYXhJdGVtcyhzY2hlbWEsIGRhdGEsIHBvaW50ZXIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiQVJSQVlfVE9PX0xPTkdcIlxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIHBvaW50ZXIsIHNjaGVtYVNoaWVsZEluc3RhbmNlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFzY2hlbWEuaXRlbXMgfHwgIUFycmF5LmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zXCIsIHtcbiAgICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgIGNvZGU6IFwiQVJSQVlfVE9PX01BTllfSVRFTVNcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZmluYWxEYXRhID0gWy4uLmRhdGFdO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChsZXQgaSA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7IGkgPCBmaW5hbERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgeyB2YWxpZGF0b3IgfSA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvcihcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zLFxuICAgICAgICAgIGZpbmFsRGF0YVtpXSxcbiAgICAgICAgICBgJHtwb2ludGVyfS8ke2l9YCxcbiAgICAgICAgICBzY2hlbWFTaGllbGRJbnN0YW5jZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZhbGlkYXRvclJlc3VsdC52YWxpZCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRvclJlc3VsdC5lcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRGF0YVtpXSA9IHZhbGlkYXRvclJlc3VsdC5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMsIGRhdGE6IGZpbmFsRGF0YSB9O1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICBsZXQgaXRlbVN0ciA9IGl0ZW07XG5cbiAgICAgIC8vIENoYW5nZSBzdHJpbmcgdG8gXCJzdHJpbmdcIiB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpdGVtU3RyID0gYFwiJHtpdGVtfVwiYDtcblxuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkuc29ydCgpO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc29ydGVkW2tleXNbaV1dID0gaXRlbVtrZXlzW2ldXTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtU3RyID0gSlNPTi5zdHJpbmdpZnkoc29ydGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHtcbiAgICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgIGNvZGU6IFwiQVJSQVlfSVRFTVNfTk9UX1VOSVFVRVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5pcXVlLmFkZChpdGVtU3RyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBkZWVwRXF1YWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgVmFsaWRhdG9yRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4gPSB7XG4gIG1pbkxlbmd0aChzY2hlbWEsIGRhdGEsIHBvaW50ZXIpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3JzOiBbXG4gICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJTdHJpbmcgaXMgdG9vIHNob3J0XCIsIHtcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgIGNvZGU6IFwiU1RSSU5HX1RPT19TSE9SVFwiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgcG9pbnRlcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIlN0cmluZyBpcyB0b28gbG9uZ1wiLCB7XG4gICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICBjb2RlOiBcIlNUUklOR19UT09fTE9OR1wiXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIHBvaW50ZXIpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9XG4gICAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm4gPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuKVxuICAgICAgICA6IHNjaGVtYS5wYXR0ZXJuO1xuXG4gICAgaWYgKHBhdHRlcm5SZWdleHAgaW5zdGFuY2VvZiBSZWdFeHAgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogW1xuICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJQYXR0ZXJuIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvblwiLCB7XG4gICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICBjb2RlOiBcIlBBVFRFUk5fSVNfTk9UX1JFR0VYUFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgZGF0YVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZCA9IHBhdHRlcm5SZWdleHAudGVzdChkYXRhKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZCxcbiAgICAgIGVycm9yczogdmFsaWRcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJTdHJpbmcgZG9lcyBub3QgbWF0Y2ggcGF0dGVyblwiLCB7XG4gICAgICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICBjb2RlOiBcIlNUUklOR19ET0VTX05PVF9NQVRDSF9QQVRURVJOXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIGZvcm1hdChzY2hlbWEsIGRhdGEsIHBvaW50ZXIsIGZvcm1hdEluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFZhbGlkYXRlID0gZm9ybWF0SW5zdGFuY2UuZm9ybWF0cy5nZXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKGBVbmtub3duIGZvcm1hdCAke3NjaGVtYS5mb3JtYXR9YCwge1xuICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgY29kZTogXCJVTktOT1dOX0ZPUk1BVFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgZGF0YVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZCA9IGZvcm1hdFZhbGlkYXRlKGRhdGEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkLFxuICAgICAgZXJyb3JzOiB2YWxpZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgYFN0cmluZyBkb2VzIG5vdCBtYXRjaCBmb3JtYXQgJHtzY2hlbWEuZm9ybWF0fWAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiU1RSSU5HX0RPRVNfTk9UX01BVENIX0ZPUk1BVFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICBdLFxuICAgICAgZGF0YVxuICAgIH07XG4gIH0sXG5cbiAgZW51bShzY2hlbWEsIGRhdGEsIHBvaW50ZXIpIHtcbiAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoc2NoZW1hLmVudW1baV0gPT09IGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpcyBhbiBhcnJheSBjaGVjayBmb3IgYSBkZWVwIGVxdWFsaXR5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmVudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW1baV0pKSB7XG4gICAgICAgICAgaWYgKGRlZXBFcXVhbChzY2hlbWEuZW51bVtpXSwgZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgaXMgYW4gb2JqZWN0IGNoZWNrIGZvciBhIGRlZXAgZXF1YWxpdHlcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuZW51bS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5lbnVtW2ldID09PSBcIm9iamVjdFwiICYmIHNjaGVtYS5lbnVtW2ldICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGRlZXBFcXVhbChzY2hlbWEuZW51bVtpXSwgZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogW1xuICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBtdXN0IGJlIG9uZSBvZiAke3NjaGVtYS5lbnVtLmpvaW4oXCIsIFwiKX1gLCB7XG4gICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICBjb2RlOiBcIlZBTFVFX05PVF9JTl9FTlVNXCJcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfVxufTtcbiIsImltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtXG4gICAgICA/IHNjaGVtYS5taW5pbXVtICsgMWUtMTVcbiAgICAgIDogc2NoZW1hLm1pbmltdW07XG5cbiAgICBjb25zdCB2YWxpZCA9IGRhdGEgPj0gbWluO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkLFxuICAgICAgZXJyb3JzOiB2YWxpZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIk51bWJlciBpcyB0b28gc21hbGxcIiwge1xuICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgY29kZTogXCJOVU1CRVJfVE9PX1NNQUxMXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtXG4gICAgICA/IHNjaGVtYS5tYXhpbXVtIC0gMWUtMTVcbiAgICAgIDogc2NoZW1hLm1heGltdW07XG5cbiAgICBjb25zdCB2YWxpZCA9IGRhdGEgPD0gbWF4O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkLFxuICAgICAgZXJyb3JzOiB2YWxpZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIk51bWJlciBpcyB0b28gbGFyZ2VcIiwge1xuICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgY29kZTogXCJOVU1CRVJfVE9PX0xBUkdFXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBwb2ludGVyKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHF1b3RpZW50ID0gZGF0YSAvIHNjaGVtYS5tdWx0aXBsZU9mO1xuICAgIGNvbnN0IGFyZU11bHRpcGxlcyA9IE1hdGguYWJzKHF1b3RpZW50IC0gTWF0aC5yb3VuZChxdW90aWVudCkpIDwgMWUtMTU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGFyZU11bHRpcGxlcyxcbiAgICAgIGVycm9yczogYXJlTXVsdGlwbGVzXG4gICAgICAgID8gW11cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTnVtYmVyIGlzIG5vdCBhIG11bHRpcGxlIG9mXCIsIHtcbiAgICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgIGNvZGU6IFwiTlVNQkVSX05PVF9NVUxUSVBMRV9PRlwiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfVxufTtcbiIsImltcG9ydCB7IENvbXBpbGVkU2NoZW1hLCBWYWxpZGF0b3JGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgVmFsaWRhdG9yRnVuY3Rpb24+ID0ge1xuICBudWxsYWJsZShzY2hlbWEsIGRhdGEsIHBvaW50ZXIpIHtcbiAgICBpZiAoc2NoZW1hLm51bGxhYmxlICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIlZhbHVlIG11c3QgYmUgbnVsbCB0byBiZSBlbXB0eVwiLCB7XG4gICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICBjb2RlOiBcIlZBTFVFX05PVF9OVUxMXCJcbiAgICAgICAgICB9KVxuICAgICAgICBdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhIH07XG4gIH0sXG5cbiAgb25lT2Yoc2NoZW1hLCBkYXRhLCBwb2ludGVyLCBzY2hlbWFTaGllbGRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGxldCB2YWxpZENvdW50ID0gMDtcbiAgICBsZXQgZmluYWxEYXRhID0gZGF0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5vbmVPZi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5vbmVPZltpXSkpIHtcbiAgICAgICAgY29uc3QgeyB2YWxpZGF0b3IgfSA9IHNjaGVtYS5vbmVPZltpXSBhcyBDb21waWxlZFNjaGVtYTtcbiAgICAgICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRvcihcbiAgICAgICAgICBzY2hlbWEub25lT2ZbaV0sXG4gICAgICAgICAgZmluYWxEYXRhLFxuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgc2NoZW1hU2hpZWxkSW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGlvblJlc3VsdC5lcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRGF0YSA9IHZhbGlkYXRpb25SZXN1bHQuZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLm9uZU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLm9uZU9mW2ldKSB7XG4gICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkQ291bnQgPT09IDEpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhOiBmaW5hbERhdGEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3JzOiBbXG4gICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIG11c3QgbWF0Y2ggZXhhY3RseSBvbmUgc2NoZW1hIGluIG9uZU9mYCwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJWQUxVRV9ET0VTX05PVF9NQVRDSF9PTkVfT0ZcIlxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGRhdGE6IGZpbmFsRGF0YVxuICAgIH07XG4gIH0sXG5cbiAgYWxsT2Yoc2NoZW1hLCBkYXRhLCBwb2ludGVyLCBzY2hlbWFTaGllbGRJbnN0YW5jZSkge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGxldCBmaW5hbERhdGEgPSBkYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFsbE9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFsbE9mW2ldKSkge1xuICAgICAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gc2NoZW1hLmFsbE9mW2ldIGFzIENvbXBpbGVkU2NoZW1hO1xuICAgICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKFxuICAgICAgICAgIHNjaGVtYS5hbGxPZltpXSxcbiAgICAgICAgICBmaW5hbERhdGEsXG4gICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICBzY2hlbWFTaGllbGRJbnN0YW5jZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghdmFsaWRhdG9yUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdG9yUmVzdWx0LmVycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbERhdGEgPSB2YWxpZGF0b3JSZXN1bHQuZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpICE9PSBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBtdXN0IG1hdGNoIGFsbCBzY2hlbWFzIGluIGFsbE9mYCwge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogXCJWQUxVRV9ET0VTX05PVF9NQVRDSF9BTExfT0ZcIlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBtdXN0IG1hdGNoIGFsbCBzY2hlbWFzIGluIGFsbE9mYCwge1xuICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgY29kZTogXCJWQUxVRV9ET0VTX05PVF9NQVRDSF9BTExfT0ZcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycywgZGF0YTogZmluYWxEYXRhIH07XG4gIH0sXG5cbiAgYW55T2Yoc2NoZW1hLCBkYXRhLCBwb2ludGVyLCBzY2hlbWFTaGllbGRJbnN0YW5jZSkge1xuICAgIGxldCBmaW5hbERhdGEgPSBkYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsaWRhdG9yIH0gPSBzY2hlbWEuYW55T2ZbaV0gYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdG9yKFxuICAgICAgICAgIHNjaGVtYS5hbnlPZltpXSxcbiAgICAgICAgICBmaW5hbERhdGEsXG4gICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICBzY2hlbWFTaGllbGRJbnN0YW5jZVxuICAgICAgICApO1xuICAgICAgICBmaW5hbERhdGEgPSB2YWxpZGF0aW9uUmVzdWx0LmRhdGE7XG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGE6IGZpbmFsRGF0YSB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbnlPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSwgZGF0YTogZmluYWxEYXRhIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCBkYXRhOiBmaW5hbERhdGEgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IFtcbiAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgc2NoZW1hIGluIGFueU9mYCwge1xuICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgY29kZTogXCJWQUxVRV9ET0VTX05PVF9NQVRDSF9BTllfT0ZcIlxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIHBvaW50ZXIsIHNjaGVtYVNoaWVsZEluc3RhbmNlKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIGRhdGEgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZmluYWxEYXRhID0gZGF0YTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoYERlcGVuZGVuY3kgJHtkZXBlbmRlbmN5W2ldfSBpcyBtaXNzaW5nYCwge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogXCJERVBFTkRFTkNZX01JU1NJTkdcIlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICBuZXcgVmFsaWRhdGlvbkVycm9yKGBEZXBlbmRlbmN5ICR7a2V5fSBpcyBtaXNzaW5nYCwge1xuICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgY29kZTogXCJERVBFTkRFTkNZX01JU1NJTkdcIlxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIG5ldyBWYWxpZGF0aW9uRXJyb3IoYERlcGVuZGVuY3kgJHtkZXBlbmRlbmN5fSBpcyBtaXNzaW5nYCwge1xuICAgICAgICAgICAgcG9pbnRlcixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgY29kZTogXCJERVBFTkRFTkNZX01JU1NJTkdcIlxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHZhbGlkYXRvciB9ID0gZGVwZW5kZW5jeSBhcyBDb21waWxlZFNjaGVtYTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWxpZGF0b3JSZXN1bHQgPSB2YWxpZGF0b3IoXG4gICAgICAgIGRlcGVuZGVuY3ksXG4gICAgICAgIGZpbmFsRGF0YSxcbiAgICAgICAgcG9pbnRlcixcbiAgICAgICAgc2NoZW1hU2hpZWxkSW5zdGFuY2VcbiAgICAgICk7XG4gICAgICBpZiAoIXZhbGlkYXRvclJlc3VsdC52YWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0b3JSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRGF0YSA9IHZhbGlkYXRvclJlc3VsdC5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMsIGRhdGE6IGZpbmFsRGF0YSB9O1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBpc09iamVjdCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkVycm9yUHJvcHMge1xuICBwb2ludGVyOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgZGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIHBvaW50ZXI6IHN0cmluZyxcbiAgICBzY2hlbWFTaGllbGRJbnN0YW5jZTogU2NoZW1hU2hpZWxkXG4gICk6IFJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkU2NoZW1hIHtcbiAgcG9pbnRlcjogc3RyaW5nO1xuICB2YWxpZGF0b3I/OiBWYWxpZGF0b3JGdW5jdGlvbjtcbiAgdHlwZT86IHN0cmluZztcbiAgdmFsaWRhdG9ycz86IFZhbGlkYXRvckZ1bmN0aW9uW107XG4gIGtleXdvcmRzPzogUmVjb3JkPHN0cmluZywgVmFsaWRhdG9yRnVuY3Rpb24+O1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IFJlc3VsdDtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgdHlwZXMgPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yRnVuY3Rpb24+KCk7XG4gIGZvcm1hdHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybWF0RnVuY3Rpb24+KCk7XG4gIGtleXdvcmRzID0gbmV3IE1hcDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGZvciAoY29uc3QgdHlwZSBpbiBUeXBlcykge1xuICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIFR5cGVzW3R5cGVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleXdvcmQgaW4ga2V5d29yZHMpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCBrZXl3b3Jkc1trZXl3b3JkXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmb3JtYXQgaW4gRm9ybWF0cykge1xuICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCBGb3JtYXRzW2Zvcm1hdF0pO1xuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFZhbGlkYXRvckZ1bmN0aW9uKSB7XG4gICAgdGhpcy50eXBlcy5zZXQobmFtZSwgdmFsaWRhdG9yKTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24pIHtcbiAgICB0aGlzLmZvcm1hdHMuc2V0KG5hbWUsIHZhbGlkYXRvcik7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBWYWxpZGF0b3JGdW5jdGlvbikge1xuICAgIHRoaXMua2V5d29yZHMuc2V0KG5hbWUsIHZhbGlkYXRvcik7XG4gIH1cblxuICBjb21waWxlKHNjaGVtYTogYW55KTogVmFsaWRhdG9yIHtcbiAgICBjb25zdCBjb21waWxlZFNjaGVtYSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWEsIFwiI1wiKTtcbiAgICBjb25zdCBzY2hlbWFTaGllbGQgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUoZGF0YTogYW55KSB7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEudmFsaWRhdG9yKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBcIiNcIiwgc2NoZW1hU2hpZWxkKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZS5jb21waWxlZFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21waWxlU2NoZW1hKFxuICAgIHNjaGVtYTogUGFydGlhbDxDb21waWxlZFNjaGVtYT4sXG4gICAgcG9pbnRlclxuICApOiBDb21waWxlZFNjaGVtYSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgc2NoZW1hID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiU2NoZW1hIGlzIG5vdCBhbiBvYmplY3RcIiwge1xuICAgICAgICBwb2ludGVyLFxuICAgICAgICB2YWx1ZTogc2NoZW1hLFxuICAgICAgICBjb2RlOiBcIlNDSEVNQV9OT1RfT0JKRUNUXCJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0ge1xuICAgICAgLi4uc2NoZW1hLFxuICAgICAgcG9pbnRlclxuICAgIH07XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gY29tcGlsZWRTY2hlbWEpIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShjb21waWxlZFNjaGVtYS50eXBlKVxuICAgICAgICA/IGNvbXBpbGVkU2NoZW1hLnR5cGVcbiAgICAgICAgOiBjb21waWxlZFNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQpID0+IHQudHJpbSgpKTtcblxuICAgICAgY29tcGlsZWRTY2hlbWEudmFsaWRhdG9ycyA9IHR5cGVzXG4gICAgICAgIC5maWx0ZXIoKHR5cGUpID0+IHRoaXMudHlwZXMuaGFzKHR5cGUpKVxuICAgICAgICAubWFwKCh0eXBlKSA9PiB0aGlzLnR5cGVzLmdldCh0eXBlKSk7XG4gICAgfVxuXG4gICAgLy8gQ29tcGlsZSBzY2hlbWEgdHlwZVxuICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yRnVuY3Rpb24gPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIHBvaW50ZXI6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmIChwb2ludGVyID09PSBcIiNcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25FcnJvcihcIkRhdGEgaXMgdW5kZWZpbmVkXCIsIHtcbiAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiREFUQV9VTkRFRklORURcIlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbERhdGEgPSBkYXRhO1xuICAgICAgY29uc3QgdHlwZUVycm9yc1Jlc3VsdCA9IHRoaXMudmFsaWRhdGVUeXBlcyhzY2hlbWEsIGZpbmFsRGF0YSwgcG9pbnRlcik7XG4gICAgICBpZiAodHlwZUVycm9yc1Jlc3VsdC52YWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVFcnJvcnNSZXN1bHQ7XG4gICAgICB9XG4gICAgICBmaW5hbERhdGEgPSB0eXBlRXJyb3JzUmVzdWx0LmRhdGE7XG5cbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlS2V5d29yZHMoc2NoZW1hLCBmaW5hbERhdGEsIHBvaW50ZXIpO1xuICAgIH07XG5cbiAgICBjb21waWxlZFNjaGVtYS52YWxpZGF0b3IgPSB2YWxpZGF0b3I7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBjb21waWxlIHN1YiBzY2hlbWFzXG4gICAgZm9yIChsZXQga2V5IGluIHNjaGVtYSkge1xuICAgICAgLy8gU2tpcCB0eXBlIGFzIGl0IGlzIGFscmVhZHkgY29tcGlsZWRcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5rZXl3b3Jkcy5oYXMoa2V5KSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLmtleXdvcmRzLmdldChrZXkpO1xuICAgICAgICBjb21waWxlZFNjaGVtYS5rZXl3b3JkcyA9IGNvbXBpbGVkU2NoZW1hLmtleXdvcmRzIHx8IHt9O1xuICAgICAgICBjb21waWxlZFNjaGVtYS5rZXl3b3Jkc1trZXldID0gdmFsaWRhdG9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVBcnJheVNjaGVtYShrZXksIHNjaGVtYSwgcG9pbnRlciwgY29tcGlsZWRTY2hlbWEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVtrZXldKSkge1xuICAgICAgICB0aGlzLmhhbmRsZU9iamVjdFNjaGVtYShrZXksIHNjaGVtYSwgcG9pbnRlciwgY29tcGlsZWRTY2hlbWEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFycmF5U2NoZW1hKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHNjaGVtYTogYW55LFxuICAgIHBvaW50ZXI6IHN0cmluZyxcbiAgICBjb21waWxlZFNjaGVtYTogYW55XG4gICkge1xuICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmIHN1YlNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVNjaGVtYShzdWJTY2hlbWEsIGAke3BvaW50ZXJ9LyR7a2V5fS8ke2luZGV4fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICAgIGlmICh0aGlzLmtleXdvcmRzLmhhcyhzdWJLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlU2NoZW1hKHN1YlNjaGVtYSwgYCR7cG9pbnRlcn0vJHtrZXl9LyR7aW5kZXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3ViU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPYmplY3RTY2hlbWEoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgc2NoZW1hOiBhbnksXG4gICAgcG9pbnRlcjogc3RyaW5nLFxuICAgIGNvbXBpbGVkU2NoZW1hOiBhbnlcbiAgKSB7XG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYVtrZXldKSB7XG4gICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICBzY2hlbWFba2V5XSxcbiAgICAgICAgYCR7cG9pbnRlcn0vJHtrZXl9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBzdWJLZXkgaW4gc2NoZW1hW2tleV0pIHtcbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBjb21waWxlZFNjaGVtYVtrZXldIHx8IHt9O1xuXG4gICAgICBpZiAodGhpcy5rZXl3b3Jkcy5oYXMoc3ViS2V5KSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgc2NoZW1hW2tleV1bc3ViS2V5XSxcbiAgICAgICAgICBgJHtwb2ludGVyfS8ke3N1YktleX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYVtrZXldW3N1YktleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYVtrZXldW3N1YktleV0pIHtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldLFxuICAgICAgICAgICAgYCR7cG9pbnRlcn0vJHtrZXl9LyR7c3ViS2V5fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3ViU3ViS2V5IGluIHNjaGVtYVtrZXldW3N1YktleV0pIHtcbiAgICAgICAgICBpZiAodGhpcy5rZXl3b3Jkcy5oYXMoc3ViU3ViS2V5KSkge1xuICAgICAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XVtzdWJLZXldID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldLFxuICAgICAgICAgICAgICBgJHtwb2ludGVyfS8ke2tleX0vJHtzdWJLZXl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUeXBlcyhzY2hlbWE6IENvbXBpbGVkU2NoZW1hLCBkYXRhLCBwb2ludGVyKTogUmVzdWx0IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLnZhbGlkYXRvcnMpIHx8XG4gICAgICBzY2hlbWEudmFsaWRhdG9ycy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBkYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZmluYWxEYXRhID0gZGF0YTtcblxuICAgIGZvciAobGV0IHNjaGVtYVZhbGlkYXRvciBvZiBzY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgY29uc3Qgc2NoZW1hUmVzdWx0ID0gc2NoZW1hVmFsaWRhdG9yKHNjaGVtYSwgZGF0YSwgcG9pbnRlciwgdGhpcyk7XG5cbiAgICAgIGZpbmFsRGF0YSA9IHNjaGVtYVJlc3VsdC5kYXRhO1xuXG4gICAgICBpZiAoc2NoZW1hUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWFSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGVycm9ycyA9IHNjaGVtYVJlc3VsdC5lcnJvcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzLFxuICAgICAgZGF0YTogZmluYWxEYXRhXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVLZXl3b3JkcyhzY2hlbWE6IENvbXBpbGVkU2NoZW1hLCBkYXRhLCBwb2ludGVyKTogUmVzdWx0IHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZmluYWxEYXRhID0gZGF0YTtcblxuICAgIGlmIChcImtleXdvcmRzXCIgaW4gc2NoZW1hKSB7XG4gICAgICBmb3IgKGxldCBrZXl3b3JkIGluIHNjaGVtYS5rZXl3b3Jkcykge1xuICAgICAgICBjb25zdCBrZXl3b3JkVmFsaWRhdG9yOiBWYWxpZGF0b3JGdW5jdGlvbiA9IHNjaGVtYS5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgICAgICAgY29uc3Qga2V5d29yZFJlc3VsdCA9IGtleXdvcmRWYWxpZGF0b3IoXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIGZpbmFsRGF0YSxcbiAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICAgICAgZmluYWxEYXRhID0ga2V5d29yZFJlc3VsdC5kYXRhO1xuICAgICAgICBpZiAoIWtleXdvcmRSZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCguLi5rZXl3b3JkUmVzdWx0LmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnMsXG4gICAgICBkYXRhOiBmaW5hbERhdGFcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJNQUVPLElBQU1BLEVBQU4sY0FBOEJDLE1BQ25DQyxLQUNBQyxRQUNBQyxRQUNBQyxNQUNBQyxLQUVBQyxZQUNFSCxFQUNBSSxFQUFnQyxDQUM5QkwsUUFBUyxHQUNURSxNQUFPLEtBQ1BDLEtBQU0sS0FHUkcsTUFBTUwsR0FDTk0sS0FBS1IsS0FBTyxrQkFDWlEsS0FBS1AsUUFBVUssRUFBUUwsUUFDdkJPLEtBQUtOLFFBQVVBLEVBQ2ZNLEtBQUtMLE1BQVFHLEVBQVFILE1BQ3JC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