var Temme=function(e){var t={};function s(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,s),r.l=!0,r.exports}return s.m=e,s.c=t,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)s.d(n,r,function(t){return e[t]}.bind(null,r));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";s.r(t),s.d(t,"parse",(function(){return z})),s.d(t,"validate",(function(){return U}));class n{constructor(e,t,s,n,r=!1){this.label=e,this.type=t,this.values=s,this.default=n,this.inherited=r}static validateOptionType(e,t){let s="";return s=Array.isArray(e)?"array":typeof e,{valid:s===t.type,type:s}}static validateOptionValue(e,t){if(null!=t&&t.values.length>0){if("include"!==t.label&&"exclude"!==t.label)return-1!==t.values.indexOf(e);for(const s of e)if(-1===t.values.indexOf(s))return!1}return!0}}n.validateOptionName=e=>null!=e;class r extends n{constructor(){super("ref","string",[],""),this.getKeyFromElement=e=>null}inherit(e,t){}}class o extends n{constructor(){super("value","string",[],""),this.getKeyFromElement=e=>null}inherit(e,t){}}class i extends n{constructor(){super("type","string",["text","html"],"text"),this.getKeyFromElement=e=>null}inherit(e,t){}}class a extends n{constructor(){super("mode","string",["append","override"],"append"),this.getKeyFromElement=e=>null}inherit(e,t){}}class l extends n{constructor(){super("placement","string",["after","before"],"after"),this.getKeyFromElement=e=>null}inherit(e,t){}}class c extends n{constructor(){super("allow","boolean",[],!1),this.getKeyFromElement=e=>null}inherit(e,t){}}class h extends n{constructor(){super("children","object",[],{allow:(new c).default,placement:(new l).default}),this.keys={allow:new c,placement:new l},this.getKeyFromElement=e=>null}inherit(e,t){}}class u extends n{constructor(){super("include","array",["name","id","classes","attributes","dataset","content","childNodes"],["name","id","classes","attributes","dataset","content","childNodes"]),this.getKeyFromElement=e=>null}inherit(e,t){}}class d extends n{constructor(){super("exclude","array",["name","id","classes","attributes","dataset","content","childNodes"],[]),this.getKeyFromElement=e=>null}inherit(e,t){}}const f=[new r,new class extends n{constructor(){super("name","string",[],"div",!0),this.getKeyFromElement=e=>null}inherit(e,t){null!=t&&"override"===e.from.mode&&(e.name=t)}},new class extends n{constructor(){super("id","string",[],"",!0),this.getKeyFromElement=e=>e.id}inherit(e,t){""!==t&&("append"===e.from.mode?""===e.id&&(e.id=t):e.id=t)}parse(e,t){""!=t.id&&(e.id=t.id)}},new class extends n{constructor(){super("content","object",[],{type:(new i).default,value:(new o).default},!0),this.keys={type:new i,value:new o}}inherit(e,t){let s=t.value;""!==t.value&&("append"===e.from.mode?s=`${e.content.value}${s.length>0?" ":""}${s}`:e.content=t,e.content.value=s)}getKeyFromElement(e){return{type:"html",value:e.innerHTML}}parse(e,t){""!=t.content.value&&("text"===t.content.type?e.textContent=t.content.value:e.innerHTML=t.content.value)}},new class extends n{constructor(){super("temmeIds","array",[],[]),this.getKeyFromElement=e=>null}inherit(e,t){}},new class extends n{constructor(){super("templates","array",[],[]),this.getKeyFromElement=e=>null}inherit(e,t){}},new class extends n{constructor(){super("classes","array",[],[],!0)}inherit(e,t){"append"===e.from.mode?e.classes.push(...t):e.classes=t,e.classes=e.classes.filter((t,s)=>e.classes.indexOf(t)===s),e.classes.sort()}getKeyFromElement(e){let t=[];return e.classList.forEach(e=>t.push(e)),t}parse(e,t){t.classes.length>0&&e.classList.add(...t.classes)}},new class extends n{constructor(){super("childNodes","array",[],[],!0),this.getKeyFromElement=e=>e.innerHTML}inherit(e,t){let s=[...e.childNodes];!0===e.from.children.allow&&("append"===e.from.mode?"before"===e.from.children.placement?s.unshift(...t):s.push(...t):s=t),e.childNodes=s}},new class extends n{constructor(){super("attributes","object",[],{},!0)}inherit(e,t){const s=Object.assign({},t);if("append"===e.from.mode)for(const t in e.attributes)s[t]=e.attributes[t];else for(const t in e.attributes)t in s||(s[t]=e.attributes[t]);e.attributes=s}getKeyFromElement(e){let t={};for(const s in e.attributes)isNaN(parseInt(s))||-1!==["id","class"].indexOf(e.attributes[s].nodeName)||"data-"===e.attributes[s].nodeName.substring(0,5)||(t[e.attributes[s].nodeName]=e.attributes[s].nodeValue);return t}parse(e,t){for(const s in t.attributes)e.setAttribute(s,t.attributes[s])}},new class extends n{constructor(){super("dataset","object",[],{},!0)}inherit(e,t){const s=Object.assign({},t);if("append"===e.from.mode)for(const t in e.dataset)s[t]=e.dataset[t];else for(const t in e.dataset)t in s||(s[t]=e.dataset[t]);e.dataset=s}getKeyFromElement(e){let t={};for(const s in e.dataset)t[s]=e.dataset[s];return t}parse(e,t){for(const s in t.dataset)e.dataset[s]=t.dataset[s]}},new class extends n{constructor(){super("from","object",[],{ref:(new r).default,mode:(new a).default,children:(new h).default,include:(new u).default,exclude:(new d).default}),this.keys={ref:new r,mode:new a,children:new h,include:new u,exclude:new d},this.getKeyFromElement=e=>null}inherit(e,t){}}],m=function(){let e=[];return f.forEach(t=>{if(e.push(t),"keys"in t){const s=function e(t){let s=[];for(const n in t.keys){const r=t.keys[n];if(s.push(r),"keys"in r){const t=e(r);s=s.concat(t)}}return s}(t);e=e.concat(s)}}),e}(),p=["name","childNodes","templates"];function g(e){const t=[];return m.forEach(s=>{if("keys"in s&&s.label===e)for(const e in s.keys){const n=s.keys[e];t.push(n)}}),t}class y extends Error{constructor(e){super(),this.name="TemmyError",this.message="Temme isn't feeling good",this.message=e.length>0?e:this.message}}class w extends y{constructor(e){super(""),this.name="InvalidTemplateOptionError",this.message="A template has an invalid option";const t=`“${e}” is not a valid option to use in templates`;this.message=e.length>0?t:this.message}}class b extends y{constructor(e){super(""),this.name="InvalidOptionNameError",this.message="An option is not valid";const t=`“${e}” is not a valid option`;this.message=e.length>0?t:this.message}}class v extends y{constructor(e,t){super(""),this.name="InvalidOptionTypeError",this.message="An option doesn't have a valid value type";const s=`The “${e}” option doesn't accept values of type “${t}”`;this.message=e.length>0?s:this.message}}class E extends y{constructor(e,t){super(""),this.name="InvalidOptionValueError",this.message="An option doesn't have a valid value";const s=`The “${e}” option doesn't accept “${t}” as a value`;this.message=e.length>0?s:this.message}}class x extends y{constructor(e,t){super(""),this.name="InvalidSubOptionNameError",this.message="A sub-option is not valid";const s=`The “${e}” option doesn't not recognize “${t}” as a valid sub-option`;this.message=e.length>0||t.length>0?s:this.message}}class N extends y{constructor(e,t){super(""),this.name="InvalidSubOptionTypeError",this.message="A sub-option doesn't have a valid value type";const s=`The “${e}” sub-option doesn't accept values of type “${t}”`;this.message=e.length>0||t.length>0?s:this.message}}class O extends y{constructor(e,t){super(""),this.name="InvalidSubOptionValueError",this.message="A sub-option doesn't have a valid value";const s=`The “${e}” sub-option doesn't accept “${t}” as a value`;this.message=e.length>0||t.length>0?s:this.message}}class T extends y{constructor(e){super(""),this.name="InvalidReferencingOptionError",this.message="A referencing option is not valid",this.message=e.length>0?e:this.message}}class k extends y{constructor(e){super(""),this.name="InvalidReferenceOptionValueError",this.message="“ref” options must not begin with the “@” symbol",this.message=e.length>0?e:this.message}}class I extends y{constructor(e){super(""),this.name="InvalidReferenceError",this.message="A reference is invalid",this.message=e.length>0?`“${e}” is an invalid reference`:this.message}}class F extends y{constructor(e){super(""),this.name="InvalidTemplateError",this.message="A template does not have a “ref” option",this.message=e.length>0?e:this.message}}function K(e,t=[],s=!1){try{const n=function(e=!1){const t="0123456789abcdefghijklmnopqrstuvwxyz",s=!1===e?6:4;let n="";for(let e=0;e{K(t,e.temmeIds)}),"templates"in e&&e.templates.forEach(t=>{K(t,e.temmeIds,!0)})}catch(e){throw e}}function $(e){return e.temmeIds[e.temmeIds.length-1]}class j extends y{constructor(e,t){super(""),this.name="InvalidTemplateReferencingError",this.message="Templates can only reference other templates.";const s=`The template with the reference “${e}” is trying to reference “${t}” a non-template object`;this.message=e.length>0?s:this.message}}class A extends y{constructor(e){super(""),this.name="ReferenceOutOfScopeError",this.message="An object is referencing an element out of its scope",this.message=e.length>0?e:this.message}}function M(e){try{for(const t in e){const s=f.filter(e=>e.label===t)[0],r=e[t];if(!1===n.validateOptionName(s))throw new b(t);const o=n.validateOptionType(r,s);if(!1===o.valid)throw new v(t,o.type);if(!1===n.validateOptionValue(r,s))throw new E(t,r);if("keys"in s){const e=s.keys;L(t,r,e)}}if(!1===function(e){if("from"in e)return"ref"in e.from;return!0}(e))throw new T("The “from” option must always have a “ref” sub-option");if(!1===function(e){if("from"in e)return!("include"in e.from&&"exclude"in e.from);return!0}(e))throw new T("The “from” option can't have both the “include” and “exclude” sub-options at the same time");"templates"in e&&e.templates.forEach(e=>{!function(e){try{if(!("ref"in e))throw new F("");for(const t in e){if(p.indexOf(t)>-1)throw new w(t);M(e)}}catch(e){throw e}}(e)}),"childNodes"in e&&e.childNodes.forEach(e=>{M(e)})}catch(e){throw e}}const S=(e,t)=>null!=t.filter(t=>t.hierarchy.ref===e.from.ref&&$(e)!==$(t.hierarchy))[0];function L(e,t,s){for(const r in t){const o=g(e).filter(e=>e.label===r)[0],i=t[r];if(!(r in s))throw new x(e,r);{if(!1===n.validateOptionName(o))throw new x(e,r);const s=n.validateOptionType(i,o);if(!1===s.valid)throw new N(r,s.type);if(!1===n.validateOptionValue(i,o))throw new O(r,i);if("keys"in o){const e=t[r];L(r,e,o.keys)}}}}function V(e){try{f.forEach(t=>{if(t.label in e){if("keys"in t)for(const s in t.keys){const n=t.keys[s];H(e[t.label],n)}}else e[t.label]=t.default}),e.classes=e.classes.filter((t,s)=>e.classes.indexOf(t)===s),e.classes.sort(),"childNodes"in e&&e.childNodes.length>0&&e.childNodes.forEach(e=>{V(e)}),"templates"in e&&e.templates.length>0&&e.templates.forEach(e=>{!function(e){try{f.filter(e=>-1===p.indexOf(e.label)).forEach(t=>{if(t.label in e){if("keys"in t)for(const s in t.keys){const n=t.keys[s];H(e[t.label],n)}}else e[t.label]=t.default})}catch(e){throw e}}(e)})}catch(e){throw e}}function H(e,t){try{if(t.label in e?"include"!==t.label&&"exclude"!==t.label||(e[t.label]=e[t.label].filter((s,n)=>e[t.label].indexOf(s)===n),e[t.label].sort()):e[t.label]=t.default,"keys"in t)for(const s in t.keys){const n=e[t.label];H(n,t.keys[s])}}catch(e){throw e}}function _(e){try{const t=function e(t,s=0){const n=[];s++,""!==t.ref&&n.push({depth:s,hierarchy:t});"childNodes"in t&&t.childNodes.length>0&&t.childNodes.forEach(t=>{n.push(...e(t,s))});"templates"in t&&t.templates.length>0&&t.templates.forEach(t=>{n.push(...e(t,s-1))});return n}(e);!function e(t,s){try{if("@"===t.ref[0])throw new k("");if("@"===t.from.ref[0]){const e=t.from.ref.substring(1);if(null==document.querySelector(e))throw new k(`No outer element corresponds to the selector “${e}”`)}else if(!1===S(t,s)&&""!==t.from.ref)throw new I(t.from.ref);"childNodes"in t&&t.childNodes.length>0&&t.childNodes.forEach(t=>{e(t,s)}),"templates"in t&&t.templates.length>0&&t.templates.forEach(t=>{e(t,s)})}catch(e){throw e}}(e,t),function e(t,s){try{const n=t.templates;n.length>0&&n.forEach(e=>{if(e.from.ref.length>0){if(!1===(4===$(s.filter(t=>t.hierarchy.ref===e.from.ref)[0].hierarchy).length))throw new j(e.ref,e.from.ref)}}),t.childNodes.forEach(t=>{e(t,s)})}catch(e){throw e}}(e,t),function e(t,s,n=0){try{const r=t.from.ref;if(n++,""!==r&&"@"!==r[0]){if(null==s.filter(e=>e.hierarchy.ref===r&&n>=e.depth)[0])throw new A("")}"childNodes"in t&&t.childNodes.length>0&&t.childNodes.forEach(t=>{e(t,s,n)}),"templates"in t&&t.templates.length>0&&t.templates.forEach(t=>{e(t,s,n)})}catch(e){throw e}}(e,t),function e(t,s){try{"templates"in t&&t.templates.length>0&&t.templates.forEach(e=>{if(""!==e.from.ref)for(const t in e){const n=f.filter(e=>e.label===t)[0],r=s.filter(t=>t.hierarchy.ref===e.from.ref)[0];n.inherit(e,r.hierarchy[t])}}),"childNodes"in t&&t.childNodes.length>0&&t.childNodes.forEach(t=>{e(t,s)})}catch(e){throw e}}(e,t.filter(e=>P(e.hierarchy))),function e(t,s){try{if("childNodes"in t&&t.childNodes.length>0&&t.childNodes.forEach(t=>{e(t,s)}),""!==t.from.ref)if("@"===t.from.ref[0]){const e=t.from.ref.substring(1),s=document.querySelector(e);for(const e in t){const n=f.filter(t=>t.label===e)[0],r=n.getKeyFromElement(s);null!=r&&n.inherit(t,r)}}else{const e=s.filter(e=>e.hierarchy.ref===t.from.ref)[0];t.from.include.filter(e=>-1===t.from.exclude.indexOf(e)).forEach(s=>{f.filter(e=>e.label===s)[0].inherit(t,e.hierarchy[s])})}}catch(e){throw e}}(e,t)}catch(e){throw e}}const P=e=>4===$(e).length;function R(e,t,s,n=!1){try{const r=function(e,t,s=!1){try{const n=!0===s?t:document.createElement(e.name);return f.forEach(t=>{"function"==typeof t.parse&&t.parse(n,e)}),!1===s&&t.appendChild(n),n}catch(e){throw e}}(e,t,n);s($(e),e),"childNodes"in e&&e.childNodes.length>0&&e.childNodes.forEach(e=>{R(e,r,s)})}catch(e){throw e}}class q extends y{constructor(e){super(""),this.name="InvalidHierarchyError",this.message="The hierarchy object is not valid",this.message=e.length>0?e:this.message}}class C extends y{constructor(e){super(""),this.name="InvalidTargetError",this.message="The target is not a valid HTML element",this.message=e.length>0?e:this.message}}function z(e,t,s=(e=>{}),n=(()=>{})){try{if(!(e=>null!=e&&e instanceof HTMLElement)(t))throw new C("");if(!(e=>null!=e&&"object"==typeof e&&!Array.isArray(e))(e))throw new q("");return M(e),V(e),K(e),_(e),R(e,t,n,!0),s(e),e}catch(e){throw e.message=`[Temme]: ${e.message}.`,e}}function U(e){try{return M(e),{valid:!0,error:null}}catch(e){return{valid:!1,error:e}}}}]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9UZW1tZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9tb2RlbHMvT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvUmVmT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvc3ViLW9wdGlvbnMvVmFsdWVTdWJPcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvb3B0aW9ucy9zdWItb3B0aW9ucy9Db250ZW50VHlwZVN1Yk9wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zL3N1Yi1vcHRpb25zL01vZGVTdWJPcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvb3B0aW9ucy9zdWItb3B0aW9ucy9QbGFjZW1lbnRTdWJPcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvb3B0aW9ucy9zdWItb3B0aW9ucy9DaGlsZHJlbkFsbG93U3ViT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvc3ViLW9wdGlvbnMvQ2hpbGRyZW5TdWJPcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvb3B0aW9ucy9zdWItb3B0aW9ucy9JbmNsdWRlU3ViT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvc3ViLW9wdGlvbnMvRXhjbHVkZVN1Yk9wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvTmFtZU9wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zL0lkT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvQ29udGVudE9wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zL1RlbW1lSWRzT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvVGVtcGxhdGVzT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvQ2xhc3Nlc09wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zL0NoaWxkcmVuTm9kZXNPcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvb3B0aW9ucy9BdHRyaWJ1dGVzT3B0aW9uLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL29wdGlvbnMvRGF0YXNldE9wdGlvbi50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9vcHRpb25zL0Zyb21PcHRpb24udHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvbW9kZWxzL1RlbW15RXJyb3IudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvZXJyb3JzL0ludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkT3B0aW9uTmFtZUVycm9yLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkT3B0aW9uVHlwZUVycm9yLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkT3B0aW9uVmFsdWVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9lcnJvcnMvSW52YWxpZFN1Yk9wdGlvbk5hbWVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9lcnJvcnMvSW52YWxpZFN1Yk9wdGlvblR5cGVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9lcnJvcnMvSW52YWxpZFN1Yk9wdGlvblZhbHVlRXJyb3IudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvZXJyb3JzL0ludmFsaWRSZWZlcmVuY2luZ09wdGlvbkVycm9yLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkUmVmZXJlbmNlT3B0aW9uVmFsdWVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9lcnJvcnMvSW52YWxpZFJlZmVyZW5jZUVycm9yLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkVGVtcGxhdGVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy9pZGZpZXIudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvZXJyb3JzL0ludmFsaWRUZW1wbGF0ZVJlZmVyZW5jaW5nRXJyb3IudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvZXJyb3JzL1JlZmVyZW5jZU91dE9mU2NvcGVFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvbW9kdWxlcy92YWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvc2FuaXRpemVyLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL3JlZmVyZW5jZXIudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvcGFyc2VyLnRzIiwid2VicGFjazovL1RlbW1lL3NyYy9DOi9Vc2Vycy91c2VyIDIyL0RvY3VtZW50cy9Qcm9qZWN0cy9vdGhlci90ZW1tZWpzL3NyYy9tb2R1bGVzL2Vycm9ycy9JbnZhbGlkSGllcmFyY2h5RXJyb3IudHMiLCJ3ZWJwYWNrOi8vVGVtbWUvc3JjL0M6L1VzZXJzL3VzZXIgMjIvRG9jdW1lbnRzL1Byb2plY3RzL290aGVyL3RlbW1lanMvc3JjL21vZHVsZXMvZXJyb3JzL0ludmFsaWRUYXJnZXRFcnJvci50cyIsIndlYnBhY2s6Ly9UZW1tZS9zcmMvQzovVXNlcnMvdXNlciAyMi9Eb2N1bWVudHMvUHJvamVjdHMvb3RoZXIvdGVtbWVqcy9zcmMvdGVtbWUudHMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJPcHRpb24iLCJsYWJlbCIsInR5cGUiLCJ2YWx1ZXMiLCJkZWZhdWx0VmFsdWUiLCJpbmhlcml0ZWQiLCJ0aGlzIiwiZGVmYXVsdCIsIm1hdGNoaW5nT3B0aW9uIiwib3B0aW9uVHlwZSIsIkFycmF5IiwiaXNBcnJheSIsInZhbGlkIiwibGVuZ3RoIiwiaW5kZXhPZiIsInZhbCIsInZhbGlkYXRlT3B0aW9uTmFtZSIsInN1cGVyIiwiZ2V0S2V5RnJvbUVsZW1lbnQiLCJlbGVtZW50IiwiaGllcmFyY2h5IiwicmVmIiwiYWxsb3ciLCJwbGFjZW1lbnQiLCJrZXlzIiwib3B0aW9ucyIsImZyb20iLCJpZCIsImNvbnRlbnQiLCJjdCIsImlubmVySFRNTCIsInRleHRDb250ZW50IiwidGVtbWVJZHMiLCJ0ZW1wbGF0ZXMiLCJjbGFzc2VzIiwicHVzaCIsImZpbHRlciIsImNscyIsImluZGV4Iiwic29ydCIsImNsYXNzTGlzdCIsImZvckVhY2giLCJhZGQiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJ1bnNoaWZ0IiwiYXR0cmlidXRlcyIsImF0dHIiLCJhdHRyS2V5IiwiaXNOYU4iLCJwYXJzZUludCIsIm5vZGVOYW1lIiwic3Vic3RyaW5nIiwibm9kZVZhbHVlIiwiZGF0YUtleSIsInNldEF0dHJpYnV0ZSIsImRhdGFzZXQiLCJkdCIsImluY2x1ZGUiLCJleGNsdWRlIiwiYWxsT3B0aW9ucyIsIm9wdCIsInN1Yk9wdGlvbnMiLCJnZXRBbGxTdWJPcHRpb25zIiwib3B0aW9uIiwiYWxsU3ViT3B0aW9ucyIsInN1Yk9wdGlvbiIsIm9wdHMiLCJjb25jYXQiLCJnZXRBbGxPcHRpb25zIiwiZm9yYmlkZGVuT3B0aW9ucyIsImdldFN1Yk9wdGlvbnMiLCJUZW1teUVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwicmVmZXJlbmNlIiwiaWRmeSIsInRlbW1lSWQiLCJjaGFycyIsIm1heCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInVwcGVyY2FzZSIsInRvVXBwZXJDYXNlIiwiZ2VuZXJhdGVUZW1tZUlkIiwiY2hpbGQiLCJ0ZW1wbGF0ZSIsImUiLCJnZXRUZW1tZUlkIiwidGFyZ2V0IiwidmFsaWRhdGVPcHRpb25zIiwib3B0aW9uVmFsdWUiLCJ0eXBlVmFsaWRhdGlvbiIsInZhbGlkYXRlT3B0aW9uVHlwZSIsInZhbGlkYXRlT3B0aW9uVmFsdWUiLCJ2YWxpZGF0ZVN1Yk9wdGlvbnMiLCJ2YWxpZGF0ZVJlZmVyZW5jaW5nT3B0aW9uIiwidmFsaWRhdGVSZWZlcmVuY2luZ1JhbmdlIiwidmFsaWRhdGVUZW1wbGF0ZXMiLCJ2YWxpZGF0ZVJlZmVyZW5jZSIsInJlZmVyZW5jZXMiLCJvcHRpb25OYW1lIiwibWF0Y2hpbmdTdWJPcHRpb24iLCJzdWJPcHRpb25WYWx1ZSIsInNhbml0aXplIiwic2FuaXRpemVPcHRpb24iLCJzYW5pdGl6ZVRlbXBsYXRlIiwic3ViSGllcmFyY2h5IiwicHJvY2VzcyIsImdldFJlZmVyZW5jZXMiLCJkZXB0aCIsInZhbGlkYXRlUmVmZXJlbmNlcyIsInNlbGVjdG9yIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwidmFsaWRhdGVUZW1wbGF0ZVJlZmVyZW5jZSIsInZhbGlkYXRlUGFyZW50VG9DaGlsZFJlZmVyZW5jZSIsInJlZk9iamVjdCIsInByb2Nlc3NUZW1wbGF0ZXMiLCJyZWZlcmVuY2VkSGllcmFyY2h5IiwiaW5oZXJpdCIsInByb2Nlc3NIaWVyYXJjaGllcyIsIm9wdE5hbWUiLCJwYXJzZSIsInBhcmVudCIsIm5vZGVDYWxsYmFjayIsInRvcFBhcmVudCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsInBhcnNlRWxlbWVudCIsImVuZENhbGxiYWNrIiwiSFRNTEVsZW1lbnQiLCJ2YWxpZGF0ZSIsImVycm9yIiwiZXJyIl0sIm1hcHBpbmdzIjoic0JBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBMERmLE9BckRBRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIsR0FBVyxFQUFQRSxHQUE4QixpQkFBVkYsR0FBc0JBLEdBQVNBLEVBQU1HLFdBQVksT0FBT0gsRUFDaEYsSUFBSUksRUFBS1gsT0FBT1ksT0FBTyxNQUd2QixHQUZBMUIsRUFBb0JrQixFQUFFTyxHQUN0QlgsT0FBT0MsZUFBZVUsRUFBSSxVQUFXLENBQUVULFlBQVksRUFBTUssTUFBT0EsSUFDdEQsRUFBUEUsR0FBNEIsaUJBQVRGLEVBQW1CLElBQUksSUFBSU0sS0FBT04sRUFBT3JCLEVBQW9CVSxFQUFFZSxFQUFJRSxFQUFLLFNBQVNBLEdBQU8sT0FBT04sRUFBTU0sSUFBUUMsS0FBSyxLQUFNRCxJQUM5SSxPQUFPRixHQUlSekIsRUFBb0I2QixFQUFJLFNBQVMxQixHQUNoQyxJQUFJUyxFQUFTVCxHQUFVQSxFQUFPcUIsV0FDN0IsV0FBd0IsT0FBT3JCLEVBQWdCLFNBQy9DLFdBQThCLE9BQU9BLEdBRXRDLE9BREFILEVBQW9CVSxFQUFFRSxFQUFRLElBQUtBLEdBQzVCQSxHQUlSWixFQUFvQmEsRUFBSSxTQUFTaUIsRUFBUUMsR0FBWSxPQUFPakIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLdUIsRUFBUUMsSUFHekcvQixFQUFvQmtDLEVBQUksR0FJakJsQyxFQUFvQkEsRUFBb0JtQyxFQUFJLEcscUhDbER0QyxNQUFlQyxFQW9DMUIsWUFBWUMsRUFBZUMsRUFBY0MsRUFBb0JDLEVBQW1CQyxHQUFxQixHQUVqR0MsS0FBS0wsTUFBUUEsRUFDYkssS0FBS0osS0FBT0EsRUFDWkksS0FBS0gsT0FBU0EsRUFDZEcsS0FBS0MsUUFBVUgsRUFDZkUsS0FBS0QsVUFBWUEsRUFnQ2QsMEJBQTBCcEIsRUFBWXVCLEdBRXpDLElBQUlDLEVBQXFCLEdBU3pCLE9BTElBLEVBREFDLE1BQU1DLFFBQVExQixHQUNELGVBRU9BLEVBR2pCLENBQ0gyQixNQUFPSCxJQUFlRCxFQUFlTixLQUNyQ0EsS0FBTU8sR0FZUCwyQkFBMkJ4QixFQUFZdUIsR0FHMUMsR0FBc0IsTUFBbEJBLEdBQTBCQSxFQUFlTCxPQUFPVSxPQUFTLEVBQUcsQ0FHNUQsR0FBNkIsWUFBekJMLEVBQWVQLE9BQWdELFlBQXpCTyxFQUFlUCxNQVdyRCxPQUFpRCxJQUExQ08sRUFBZUwsT0FBT1csUUFBUTdCLEdBVHJDLElBQUssTUFBTThCLEtBQU85QixFQUVkLElBQTRDLElBQXhDdUIsRUFBZUwsT0FBT1csUUFBUUMsR0FDOUIsT0FBTyxFQVV2QixPQUFPLEdBeERHLEVBQUFDLG1CQUFzQlIsR0FBc0QsTUFBbEJBLEVDeEY3RCxNQUFNLFVBQWtCUixFQUtuQyxjQUVJaUIsTUFBTSxNQUFPLFNBQVUsR0FBSSxJQWtCeEIsS0FBQUMsa0JBQXFCQyxHQUE4QixLQVJuRCxRQUFRQyxFQUFnQkMsS0NqQnBCLE1BQU0sVUFBdUJyQixFQUt4QyxjQUVJaUIsTUFBTSxRQUFTLFNBQVUsR0FBSSxJQWlCMUIsS0FBQUMsa0JBQXFCQyxHQUE4QixLQVJuRCxRQUFRQyxFQUFnQm5DLEtDaEJwQixNQUFNLFVBQTZCZSxFQUs5QyxjQUVJaUIsTUFBTSxPQUFRLFNBQVUsQ0FBQyxPQUFRLFFBQVMsUUFrQnZDLEtBQUFDLGtCQUFxQkMsR0FBOEIsS0FSbkQsUUFBUUMsRUFBZ0JuQyxLQ2pCcEIsTUFBTSxVQUFzQmUsRUFLdkMsY0FFSWlCLE1BQU0sT0FBUSxTQUFVLENBQUMsU0FBVSxZQUFhLFVBaUI3QyxLQUFBQyxrQkFBcUJDLEdBQThCLEtBUm5ELFFBQVFDLEVBQWdCbkMsS0NoQnBCLE1BQU0sVUFBMkJlLEVBSzVDLGNBRUlpQixNQUFNLFlBQWEsU0FBVSxDQUFDLFFBQVMsVUFBVyxTQWlCL0MsS0FBQUMsa0JBQXFCQyxHQUE4QixLQVJuRCxRQUFRQyxFQUFnQm5DLEtDaEJwQixNQUFNLFVBQStCZSxFQUtoRCxjQUVJaUIsTUFBTSxRQUFTLFVBQVcsSUFBSSxHQWtCM0IsS0FBQUMsa0JBQXFCQyxHQUE4QixLQVJuRCxRQUFRQyxFQUFnQm5DLEtDWHBCLE1BQU0sVUFBMEJlLEVBYTNDLGNBRUlpQixNQUFNLFdBQVksU0FBVSxHQUFJLENBQzVCSyxPQUFPLElBQUssR0FBMEJmLFFBQ3RDZ0IsV0FBVyxJQUFLLEdBQXNCaEIsVUFadkMsS0FBQWlCLEtBQXlCLENBQzVCRixNQUFPLElBQUksRUFDWEMsVUFBVyxJQUFJLEdBNEJaLEtBQUFMLGtCQUFxQkMsR0FBOEIsS0FSbkQsUUFBUUMsRUFBZ0JuQyxLQ2pDcEIsTUFBTSxVQUF5QmUsRUFLMUMsY0FFSWlCLE1BQU0sVUFBVyxRQUFTLENBQUMsT0FBUSxLQUFNLFVBQVcsYUFBYyxVQUFXLFVBQVcsY0FBZSxDQUFDLE9BQVEsS0FBTSxVQUFXLGFBQWMsVUFBVyxVQUFXLGVBaUJsSyxLQUFBQyxrQkFBcUJDLEdBQThCLEtBUm5ELFFBQVFDLEVBQWdCbkMsS0NoQnBCLE1BQU0sVUFBeUJlLEVBSzFDLGNBRUlpQixNQUFNLFVBQVcsUUFBUyxDQUFDLE9BQVEsS0FBTSxVQUFXLGFBQWMsVUFBVyxVQUFXLGNBQWUsSUFpQnBHLEtBQUFDLGtCQUFxQkMsR0FBOEIsS0FSbkQsUUFBUUMsRUFBZ0JuQyxLQ0Y1QixNQUFNd0MsRUFBeUIsQ0FDbEMsSUFBSSxFQUNKLElDaEJXLGNBQXlCekIsRUFLcEMsY0FFSWlCLE1BQU0sT0FBUSxTQUFVLEdBQUksT0FBTyxHQTBCaEMsS0FBQUMsa0JBQXFCQyxHQUE4QixLQWpCbkQsUUFBUUMsRUFBZ0I3QyxHQUVmLE1BQVJBLEdBRTRCLGFBQXhCNkMsRUFBVU0sS0FBS3ZDLE9BRWZpQyxFQUFVN0MsS0FBT0EsS0RMN0IsSUVoQlcsY0FBdUJ5QixFQUtsQyxjQUVJaUIsTUFBTSxLQUFNLFNBQVUsR0FBSSxJQUFJLEdBaUMzQixLQUFBQyxrQkFBcUJDLEdBQThCQSxFQUFRUSxHQXZCM0QsUUFBUVAsRUFBZ0JPLEdBRWhCLEtBQVBBLElBRTRCLFdBQXhCUCxFQUFVTSxLQUFLdkMsS0FFTSxLQUFqQmlDLEVBQVVPLEtBRVZQLEVBQVVPLEdBQUtBLEdBSW5CUCxFQUFVTyxHQUFLQSxHQW1CcEIsTUFBTVIsRUFBc0JDLEdBRVgsSUFBaEJBLEVBQVVPLEtBRVZSLEVBQVFRLEdBQUtQLEVBQVVPLE1GbkMvQixJR1pXLGNBQTRCM0IsRUFhdkMsY0FFSWlCLE1BQU0sVUFBVyxTQUFVLEdBQUksQ0FDM0JmLE1BQU0sSUFBSyxHQUF3QkssUUFDbkN0QixPQUFPLElBQUssR0FBa0JzQixVQUMvQixHQWJBLEtBQUFpQixLQUFvQixDQUN2QnRCLEtBQU0sSUFBSSxFQUNWakIsTUFBTyxJQUFJLEdBcUJSLFFBQVFtQyxFQUFnQlEsR0FFM0IsSUFBSUMsRUFBYUQsRUFBUTNDLE1BRUgsS0FBbEIyQyxFQUFRM0MsUUFFb0IsV0FBeEJtQyxFQUFVTSxLQUFLdkMsS0FFZjBDLEVBQUssR0FBR1QsRUFBVVEsUUFBUTNDLFFBQVE0QyxFQUFHaEIsT0FBUyxFQUFJLElBQU0sS0FBS2dCLElBRzdEVCxFQUFVUSxRQUFVQSxFQUd4QlIsRUFBVVEsUUFBUTNDLE1BQVE0QyxHQVUzQixrQkFBa0JWLEdBRXJCLE1BQU8sQ0FDSGpCLEtBQU0sT0FDTmpCLE1BQU9rQyxFQUFRVyxXQVVoQixNQUFPWCxFQUFzQkMsR0FFTSxJQUE1QkEsRUFBV1EsUUFBUTNDLFFBRWEsU0FBNUJtQyxFQUFXUSxRQUFRMUIsS0FFekJpQixFQUFRWSxZQUFvQlgsRUFBV1EsUUFBUTNDLE1BRy9Da0MsRUFBUVcsVUFBa0JWLEVBQVdRLFFBQVEzQyxTSDlEekQsSUluQlcsY0FBNkJlLEVBS3hDLGNBRUlpQixNQUFNLFdBQVksUUFBUyxHQUFJLElBa0I1QixLQUFBQyxrQkFBcUJDLEdBQThCLEtBUm5ELFFBQVFDLEVBQWdCWSxNSkcvQixJS3BCVyxjQUE4QmhDLEVBS3pDLGNBRUlpQixNQUFNLFlBQWEsUUFBUyxHQUFJLElBaUI3QixLQUFBQyxrQkFBcUJDLEdBQThCLEtBUm5ELFFBQVFDLEVBQWdCYSxNTEsvQixJTXBCVyxjQUE0QmpDLEVBS3ZDLGNBRUlpQixNQUFNLFVBQVcsUUFBUyxHQUFJLElBQUksR0FTL0IsUUFBUUcsRUFBZ0JjLEdBRUMsV0FBeEJkLEVBQVVNLEtBQUt2QyxLQUVmaUMsRUFBVWMsUUFBUUMsUUFBUUQsR0FHMUJkLEVBQVVjLFFBQVVBLEVBSXhCZCxFQUFVYyxRQUFVZCxFQUFVYyxRQUFRRSxPQUFPLENBQUNDLEVBQWFDLElBQWtCbEIsRUFBVWMsUUFBUXBCLFFBQVF1QixLQUFTQyxHQUdoSGxCLEVBQVVjLFFBQVFLLE9BU2Ysa0JBQWtCcEIsR0FFckIsSUFBSWUsRUFBeUIsR0FJN0IsT0FGQWYsRUFBUXFCLFVBQVVDLFFBQVNKLEdBQWdCSCxFQUFRQyxLQUFLRSxJQUVqREgsRUFTSixNQUFPZixFQUFzQkMsR0FFNUJBLEVBQVVjLFFBQVFyQixPQUFTLEdBRTNCTSxFQUFRcUIsVUFBVUUsT0FBT3RCLEVBQVVjLFdOckMzQyxJT3RCVyxjQUErQmxDLEVBSzFDLGNBRUlpQixNQUFNLGFBQWMsUUFBUyxHQUFJLElBQUksR0F1Q2xDLEtBQUFDLGtCQUFxQkMsR0FBOEJBLEVBQVFXLFVBOUIzRCxRQUFRVixFQUFnQnVCLEdBRTNCLElBQUlDLEVBQWdCLElBQUt4QixFQUFVdUIsYUFFRyxJQUFsQ3ZCLEVBQVVNLEtBQUtrQixTQUFTdEIsUUFFSSxXQUF4QkYsRUFBVU0sS0FBS3ZDLEtBRTJCLFdBQXRDaUMsRUFBVU0sS0FBS2tCLFNBQVNyQixVQUV4QnFCLEVBQVNDLFdBQVdGLEdBR3BCQyxFQUFTVCxRQUFRUSxHQUlyQkMsRUFBV0QsR0FJbkJ2QixFQUFVdUIsV0FBYUMsSVBkM0IsSVF0QlcsY0FBK0I1QyxFQUsxQyxjQUVJaUIsTUFBTSxhQUFjLFNBQVUsR0FBSSxJQUFJLEdBVW5DLFFBQVFHLEVBQWdCMEIsR0FFM0IsTUFBTUMsRUFBSSxpQkFBYUQsR0FFdkIsR0FBNEIsV0FBeEIxQixFQUFVTSxLQUFLdkMsS0FFZixJQUFLLE1BQU02RCxLQUFXNUIsRUFBVTBCLFdBRTVCQyxFQUFLQyxHQUFXNUIsRUFBVTBCLFdBQVdFLFFBSXpDLElBQUssTUFBTUEsS0FBVzVCLEVBQVUwQixXQUV0QkUsS0FBV0QsSUFFYkEsRUFBS0MsR0FBVzVCLEVBQVUwQixXQUFXRSxJQUtqRDVCLEVBQVUwQixXQUFhQyxFQVNwQixrQkFBa0I1QixHQUVyQixJQUFJMkIsRUFBa0IsR0FFdEIsSUFBSyxNQUFNRSxLQUFXN0IsRUFBUTJCLFdBRXJCRyxNQUFNQyxTQUFTRixNQUFnRixJQUFuRSxDQUFDLEtBQU0sU0FBU2xDLFFBQVFLLEVBQVEyQixXQUFXRSxHQUFTRyxXQUE2RSxVQUF6RGhDLEVBQVEyQixXQUFXRSxHQUFTRyxTQUFTQyxVQUFVLEVBQUcsS0FFdkpOLEVBQVczQixFQUFRMkIsV0FBV0UsR0FBU0csVUFBWWhDLEVBQVEyQixXQUFXRSxHQUFTSyxXQUl2RixPQUFPUCxFQVNKLE1BQU8zQixFQUFzQkMsR0FFaEMsSUFBSyxNQUFNa0MsS0FBV2xDLEVBQVUwQixXQUU1QjNCLEVBQVFvQyxhQUFhRCxFQUFlbEMsRUFBVzBCLFdBQVdRLE1SakRsRSxJU3ZCVyxjQUE0QnRELEVBS3ZDLGNBRUlpQixNQUFNLFVBQVcsU0FBVSxHQUFJLElBQUksR0FTaEMsUUFBUUcsRUFBZ0JvQyxHQUUzQixNQUFNQyxFQUFFLGlCQUFhRCxHQUVyQixHQUE0QixXQUF4QnBDLEVBQVVNLEtBQUt2QyxLQUVmLElBQUssTUFBTW1FLEtBQVdsQyxFQUFVb0MsUUFFNUJDLEVBQUdILEdBQVdsQyxFQUFVb0MsUUFBUUYsUUFJcEMsSUFBSyxNQUFNQSxLQUFXbEMsRUFBVW9DLFFBRXRCRixLQUFXRyxJQUViQSxFQUFHSCxHQUFXbEMsRUFBVW9DLFFBQVFGLElBSzVDbEMsRUFBVW9DLFFBQVVDLEVBU2pCLGtCQUFrQnRDLEdBRXJCLElBQUlxQyxFQUFlLEdBRW5CLElBQUssTUFBTUYsS0FBV25DLEVBQVFxQyxRQUUxQkEsRUFBUUYsR0FBV25DLEVBQVFxQyxRQUFRRixHQUd2QyxPQUFPRSxFQVNKLE1BQU9yQyxFQUFzQkMsR0FFaEMsSUFBSyxNQUFNa0MsS0FBV2xDLEVBQVVvQyxRQUU1QnJDLEVBQVFxQyxRQUFRRixHQUFpQmxDLEVBQVdvQyxRQUFRRixLVDVDNUQsSVVuQlcsY0FBeUJ0RCxFQWdCcEMsY0FFSWlCLE1BQU0sT0FBUSxTQUFVLEdBQUksQ0FDeEJJLEtBQUssSUFBSyxHQUFhZCxRQUN2QnBCLE1BQU0sSUFBSyxHQUFpQm9CLFFBQzVCcUMsVUFBVSxJQUFLLEdBQXFCckMsUUFDcENtRCxTQUFTLElBQUssR0FBb0JuRCxRQUNsQ29ELFNBQVMsSUFBSyxHQUFvQnBELFVBbEJuQyxLQUFBaUIsS0FBaUIsQ0FDcEJILElBQUssSUFBSSxFQUNUbEMsS0FBTSxJQUFJLEVBQ1Z5RCxTQUFVLElBQUksRUFDZGMsUUFBUyxJQUFJLEVBQ2JDLFFBQVMsSUFBSSxHQStCVixLQUFBekMsa0JBQXFCQyxHQUE4QixLQVJuRCxRQUFRQyxFQUFnQk0sT1ZQdEJrQyxFQTBDYixXQUVJLElBQUlBLEVBQTRCLEdBZWhDLE9BYkFuQyxFQUFRZ0IsUUFBU29CLElBSWIsR0FGQUQsRUFBV3pCLEtBQUswQixHQUVaLFNBQVVBLEVBQUssQ0FHZixNQUFNQyxFQWVsQixTQUFTQyxFQUFpQkMsR0FFdEIsSUFBSUMsRUFBK0IsR0FFbkMsSUFBSyxNQUFNMUUsS0FBYXlFLEVBQVF4QyxLQUFNLENBRWxDLE1BQU0wQyxFQUEwQkYsRUFBUXhDLEtBQUtqQyxHQUk3QyxHQUZBMEUsRUFBYzlCLEtBQUsrQixHQUVmLFNBQVVBLEVBQVcsQ0FFckIsTUFBTUMsRUFBc0JKLEVBQWlCRyxHQUU3Q0QsRUFBZ0JBLEVBQWNHLE9BQU9ELElBSTdDLE9BQU9GLEVBakNtQ0YsQ0FBaUJGLEdBRW5ERCxFQUFhQSxFQUFXUSxPQUFPTixNQUloQ0YsRUEzRGVTLEdBTWJDLEVBQWtDLENBQUMsT0FBUSxhQUFjLGFBUS9ELFNBQVNDLEVBQWNQLEdBRTFCLE1BQU1GLEVBQXlCLEdBbUIvQixPQWhCQUYsRUFBV25CLFFBQVNvQixJQUVoQixHQUFJLFNBQVVBLEdBQWdCQSxFQUFLNUQsUUFBVStELEVBRXpDLElBQUssTUFBTXpFLEtBQWVzRSxFQUFLckMsS0FBTSxDQUdqQyxNQUFNMEMsRUFBb0JMLEVBQUtyQyxLQUFLakMsR0FHcEN1RSxFQUFXM0IsS0FBSytCLE1BTXJCSixFV3ZESSxNQUFNVSxVQUFtQkMsTUFpQnBDLFlBQVlDLEdBR1J6RCxRQWZZLEtBQUExQyxLQUFlLGFBS3hCLEtBQUFtRyxRQUFrQiwyQkFhckJwRSxLQUFLb0UsUUFBVUEsRUFBUTdELE9BQVMsRUFBSTZELEVBQVVwRSxLQUFLb0UsU0NsQzVDLE1BQU0sVUFBbUNGLEVBaUJwRCxZQUFZUixHQUdSL0MsTUFBTSxJQWZILEtBQUExQyxLQUFlLDZCQUtmLEtBQUFtRyxRQUFrQixtQ0FhckIsTUFBTUEsRUFBa0IsSUFBSVYsK0NBRzVCMUQsS0FBS29FLFFBQVVWLEVBQU9uRCxPQUFTLEVBQUk2RCxFQUFVcEUsS0FBS29FLFNDMUIzQyxNQUFNLFVBQStCRixFQWlCaEQsWUFBWVIsR0FHUi9DLE1BQU0sSUFmSCxLQUFBMUMsS0FBZSx5QkFLZixLQUFBbUcsUUFBa0IseUJBYXJCLE1BQU1BLEVBQWtCLElBQUlWLDJCQUc1QjFELEtBQUtvRSxRQUFVVixFQUFPbkQsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQzFCM0MsTUFBTSxVQUErQkYsRUFrQmhELFlBQVlSLEVBQWdCOUQsR0FHeEJlLE1BQU0sSUFoQkgsS0FBQTFDLEtBQWUseUJBS2YsS0FBQW1HLFFBQWtCLDRDQWNyQixNQUFNQSxFQUFrQixRQUFRViw0Q0FBaUQ5RCxLQUdqRkksS0FBS29FLFFBQVVWLEVBQU9uRCxPQUFTLEVBQUk2RCxFQUFVcEUsS0FBS29FLFNDM0IzQyxNQUFNLFVBQWdDRixFQWtCakQsWUFBWVIsRUFBZ0IvRSxHQUd4QmdDLE1BQU0sSUFoQkgsS0FBQTFDLEtBQWUsMEJBS2YsS0FBQW1HLFFBQWtCLHVDQWNyQixNQUFNQSxFQUFrQixRQUFRViw2QkFBa0MvRSxnQkFHbEVxQixLQUFLb0UsUUFBVVYsRUFBT25ELE9BQVMsRUFBSTZELEVBQVVwRSxLQUFLb0UsU0MzQjNDLE1BQU0sVUFBa0NGLEVBa0JuRCxZQUFZUixFQUFnQkUsR0FHeEJqRCxNQUFNLElBaEJILEtBQUExQyxLQUFlLDRCQUtmLEtBQUFtRyxRQUFrQiw0QkFjckIsTUFBTUEsRUFBa0IsUUFBUVYsb0NBQXlDRSwyQkFHekU1RCxLQUFLb0UsUUFBVVYsRUFBT25ELE9BQVMsR0FBS3FELEVBQVVyRCxPQUFTLEVBQUk2RCxFQUFVcEUsS0FBS29FLFNDM0JuRSxNQUFNLFVBQWtDRixFQWtCbkQsWUFBWU4sRUFBbUJoRSxHQUczQmUsTUFBTSxJQWhCSCxLQUFBMUMsS0FBZSw0QkFLZixLQUFBbUcsUUFBa0IsK0NBY3JCLE1BQU1BLEVBQWtCLFFBQVFSLGdEQUF3RGhFLEtBR3hGSSxLQUFLb0UsUUFBVVIsRUFBVXJELE9BQVMsR0FBS1gsRUFBS1csT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQzNCakUsTUFBTSxVQUFtQ0YsRUFrQnBELFlBQVlOLEVBQW1CakYsR0FHM0JnQyxNQUFNLElBaEJILEtBQUExQyxLQUFlLDZCQUtmLEtBQUFtRyxRQUFrQiwwQ0FjckIsTUFBTUEsRUFBa0IsUUFBUVIsaUNBQXlDakYsZ0JBR3pFcUIsS0FBS29FLFFBQVVSLEVBQVVyRCxPQUFTLEdBQUs1QixFQUFNNEIsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQzNCbEUsTUFBTSxVQUFzQ0YsRUFpQnZELFlBQVlFLEdBR1J6RCxNQUFNLElBZkgsS0FBQTFDLEtBQWUsZ0NBS2YsS0FBQW1HLFFBQWtCLG9DQWFyQnBFLEtBQUtvRSxRQUFVQSxFQUFRN0QsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQ3ZCNUMsTUFBTSxVQUF5Q0YsRUFpQjFELFlBQVlFLEdBR1J6RCxNQUFNLElBZkgsS0FBQTFDLEtBQWUsbUNBS2YsS0FBQW1HLFFBQWtCLG1EQWFyQnBFLEtBQUtvRSxRQUFVQSxFQUFRN0QsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQ3ZCNUMsTUFBTSxVQUE4QkYsRUFpQi9DLFlBQVlHLEdBR1IxRCxNQUFNLElBZkgsS0FBQTFDLEtBQWUsd0JBS2YsS0FBQW1HLFFBQWtCLHlCQWFyQnBFLEtBQUtvRSxRQUFVQyxFQUFVOUQsT0FBUyxFQUFJLElBQUk4RCw2QkFBdUNyRSxLQUFLb0UsU0N2Qi9FLE1BQU0sVUFBNkJGLEVBaUI5QyxZQUFZRSxHQUdSekQsTUFBTSxJQWZILEtBQUExQyxLQUFlLHVCQUtmLEtBQUFtRyxRQUFrQiwwQ0FhckJwRSxLQUFLb0UsUUFBVUEsRUFBUTdELE9BQVMsRUFBSTZELEVBQVVwRSxLQUFLb0UsU0NicEQsU0FBU0UsRUFBS3hELEVBQWdCWSxFQUEwQixHQUFJN0MsR0FBZ0IsR0FFL0UsSUFHSSxNQUFNMEYsRUEyQ2QsU0FBeUIxRixHQUFnQixHQUVyQyxNQUNJMkYsRUFBUSx1Q0FDUkMsR0FBZ0IsSUFBVDVGLEVBQWtCLEVBQUksRUFFakMsSUFBSUksRUFBTSxHQUVWLElBQUssSUFBSXZCLEVBQUksRUFBR0EsRUFBRStHLEVBQUsvRyxJQUFLLENBRXhCLE1BQ0lzRSxFQUFRMEMsS0FBS0MsTUFBT0QsS0FBS0UsU0FBV0osRUFBTWpFLFFBQzFDc0UsRUFBWUgsS0FBS0MsTUFBc0IsRUFBaEJELEtBQUtFLFVBRWhDM0YsR0FBcUIsSUFBZDRGLEVBQWtCTCxFQUFNeEMsR0FBTzhDLGNBQWdCTixFQUFNeEMsR0FHaEUsT0FBTy9DLEVBNURxQjhGLENBQWdCbEcsR0FHeENpQyxFQUFVWSxTQUFXLElBQUlBLEVBQVU2QyxHQUcvQixlQUFnQnpELEdBRWhCQSxFQUFVdUIsV0FBV0YsUUFBUzZDLElBRTFCVixFQUFLVSxFQUFPbEUsRUFBVVksWUFLMUIsY0FBZVosR0FFZkEsRUFBVWEsVUFBVVEsUUFBUzhDLElBRXpCWCxFQUFLVyxFQUFVbkUsRUFBVVksVUFBVSxLQUkvQyxNQUFNd0QsR0FFRixNQUFNQSxHQVVQLFNBQVNDLEVBQVlyRSxHQUN4QixPQUFPQSxFQUFVWSxTQUFTWixFQUFVWSxTQUFTbkIsT0FBUyxHQ25EM0MsTUFBTSxVQUF3QzJELEVBa0J6RCxZQUFZbkQsRUFBYXFFLEdBR3JCekUsTUFBTSxJQWhCSCxLQUFBMUMsS0FBZSxrQ0FLZixLQUFBbUcsUUFBa0IsZ0RBY3JCLE1BQU1BLEVBQWtCLG9DQUFvQ3JELDhCQUFnQ3FFLDJCQUc1RnBGLEtBQUtvRSxRQUFVckQsRUFBSVIsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQzNCeEMsTUFBTSxVQUFpQ0YsRUFpQmxELFlBQVlFLEdBR1J6RCxNQUFNLElBZkgsS0FBQTFDLEtBQWUsMkJBS2YsS0FBQW1HLFFBQWtCLHVEQWFyQnBFLEtBQUtvRSxRQUFVQSxFQUFRN0QsT0FBUyxFQUFJNkQsRUFBVXBFLEtBQUtvRSxTQ2lCcEQsU0FBU2lCLEVBQWdCdkUsR0FFNUIsSUFHSSxJQUFLLE1BQU00QyxLQUFVNUMsRUFBVyxDQUU1QixNQUNJWixFQUFpQ2lCLEVBQVFXLE9BQVF5QixHQUFnQkEsRUFBSTVELFFBQVUrRCxHQUFRLEdBQ3ZGNEIsRUFBbUJ4RSxFQUFVNEMsR0FHakMsSUFBa0QsSUFBOUNoRSxFQUFPZ0IsbUJBQW1CUixHQUMxQixNQUFNLElBQUksRUFBdUJ3RCxHQUlyQyxNQUFNNkIsRUFBbUQ3RixFQUFPOEYsbUJBQW1CRixFQUFhcEYsR0FFaEcsSUFBNkIsSUFBekJxRixFQUFlakYsTUFDZixNQUFNLElBQUksRUFBdUJvRCxFQUFRNkIsRUFBZTNGLE1BSTVELElBQWdFLElBQTVERixFQUFPK0Ysb0JBQW9CSCxFQUFhcEYsR0FDeEMsTUFBTSxJQUFJLEVBQXdCd0QsRUFBUTRCLEdBSTlDLEdBQUksU0FBVXBGLEVBQWdCLENBRzFCLE1BQU1zRCxFQUFxQnRELEVBQWdCZ0IsS0FHM0N3RSxFQUFtQmhDLEVBQVE0QixFQUFhOUIsSUFLaEQsSUFBNkMsSUFrU3JELFNBQW1DMUMsR0FFL0IsR0FBSSxTQUFVQSxFQUVWLE1BQU8sUUFBU0EsRUFBVU0sS0FHOUIsT0FBTyxFQXpTQ3VFLENBQTBCN0UsR0FDMUIsTUFBTSxJQUFJLEVBQThCLHlEQUc1QyxJQUE0QyxJQThTcEQsU0FBa0NBLEdBRTlCLEdBQUksU0FBVUEsRUFFVixRQUFTLFlBQWFBLEVBQVVNLE1BQVEsWUFBYU4sRUFBVU0sTUFHbkUsT0FBTyxFQXJUQ3dFLENBQXlCOUUsR0FDekIsTUFBTSxJQUFJLEVBQThCLDhGQUl4QyxjQUFlQSxHQUVmQSxFQUFVYSxVQUFVUSxRQUFTOEMsS0EyQmxDLFNBQTJCQSxHQUU5QixJQUVJLEtBQU0sUUFBU0EsR0FDWCxNQUFNLElBQUksRUFBcUIsSUFJbkMsSUFBSyxNQUFNdkIsS0FBVXVCLEVBQVUsQ0FHM0IsR0FBSWpCLEVBQWlCeEQsUUFBUWtELElBQVcsRUFDcEMsTUFBTSxJQUFJLEVBQTJCQSxHQUVyQzJCLEVBQWdCSixJQUk1QixNQUFPQyxHQUVILE1BQU1BLEdBL0NFVyxDQUFrQlosS0FLdEIsZUFBZ0JuRSxHQUVoQkEsRUFBVXVCLFdBQVdGLFFBQVM2QyxJQUMxQkssRUFBZ0JMLEtBSTVCLE1BQU9FLEdBRUgsTUFBTUEsR0F3R2QsTUFBTVksRUFBb0IsQ0FBQ2hGLEVBQWdCaUYsSUFBK0wsTUFBakpBLEVBQVdqRSxPQUFRZixHQUF1QkEsRUFBSUQsVUFBVUMsTUFBUUQsRUFBVU0sS0FBS0wsS0FBT29FLEVBQVdyRSxLQUFlcUUsRUFBV3BFLEVBQUlELFlBQVksR0E4R3BPLFNBQVM0RSxFQUFtQk0sRUFBb0JWLEVBQWtCOUIsR0FHOUQsSUFBSyxNQUFNSSxLQUFhMEIsRUFBYSxDQUVqQyxNQUNJVyxFQUE0QmhDLEVBQWMrQixHQUFZbEUsT0FBUTBCLEdBQXVCQSxFQUFXN0QsUUFBVWlFLEdBQVcsR0FDckhzQyxFQUFzQlosRUFBWTFCLEdBR3RDLEtBQUlBLEtBQWFKLEdBNkJiLE1BQU0sSUFBSSxFQUEwQndDLEVBQVlwQyxHQTdCdkIsQ0FHekIsSUFBcUQsSUFBakRsRSxFQUFPZ0IsbUJBQW1CdUYsR0FDMUIsTUFBTSxJQUFJLEVBQTBCRCxFQUFZcEMsR0FJcEQsTUFBTTJCLEVBQW1EN0YsRUFBTzhGLG1CQUFtQlUsRUFBZ0JELEdBRW5HLElBQTZCLElBQXpCVixFQUFlakYsTUFDZixNQUFNLElBQUksRUFBMEJzRCxFQUFXMkIsRUFBZTNGLE1BSWxFLElBQXNFLElBQWxFRixFQUFPK0Ysb0JBQW9CUyxFQUFnQkQsR0FDM0MsTUFBTSxJQUFJLEVBQTJCckMsRUFBV3NDLEdBR3BELEdBQUksU0FBVUQsRUFBbUIsQ0FHN0IsTUFBTUMsRUFBaUJaLEVBQVkxQixHQUVuQzhCLEVBQW1COUIsRUFBV3NDLEVBQXdCRCxFQUFtQi9FLFNDNVZsRixTQUFTaUYsRUFBU3JGLEdBRXJCLElBR0lLLEVBQVFnQixRQUFTb0IsSUFFYixHQUFNQSxFQUFJNUQsU0FBU21CLEdBT2YsR0FBSSxTQUFVeUMsRUFFVixJQUFLLE1BQU10RSxLQUFlc0UsRUFBS3JDLEtBQU0sQ0FHakMsTUFBTTBDLEVBQTRCTCxFQUFLckMsS0FBS2pDLEdBRzVDbUgsRUFBZXRGLEVBQW1CeUMsRUFBSzVELE9BQVFpRSxTQVp2RDlDLEVBQVV5QyxFQUFJNUQsT0FBUzRELEVBQUl0RCxVQW9CbkNhLEVBQVVjLFFBQVVkLEVBQVVjLFFBQVFFLE9BQU8sQ0FBQ0MsRUFBYUMsSUFBa0JsQixFQUFVYyxRQUFRcEIsUUFBUXVCLEtBQVNDLEdBR2hIbEIsRUFBVWMsUUFBUUssT0FHZCxlQUFnQm5CLEdBQWFBLEVBQVV1QixXQUFXOUIsT0FBUyxHQUUzRE8sRUFBVXVCLFdBQVdGLFFBQVM2QyxJQUUxQm1CLEVBQVNuQixLQUtiLGNBQWVsRSxHQUFhQSxFQUFVYSxVQUFVcEIsT0FBUyxHQUV6RE8sRUFBVWEsVUFBVVEsUUFBUzhDLEtBMkR6QyxTQUEwQkEsR0FFdEIsSUFHSTlELEVBQ0tXLE9BQVF5QixJQUF5RCxJQUF6Q1MsRUFBaUJ4RCxRQUFRK0MsRUFBSTVELFFBQ3JEd0MsUUFBU29CLElBR04sR0FBTUEsRUFBSTVELFNBQVNzRixHQU9mLEdBQUksU0FBVTFCLEVBRVYsSUFBSyxNQUFNdEUsS0FBZXNFLEVBQUtyQyxLQUFNLENBR2pDLE1BQU0wQyxFQUE0QkwsRUFBS3JDLEtBQUtqQyxHQUc1Q21ILEVBQWVuQixFQUFrQjFCLEVBQUs1RCxPQUFRaUUsU0FadERxQixFQUFTMUIsRUFBSTVELE9BQVM0RCxFQUFJdEQsVUFrQjFDLE1BQU9pRixHQUVILE1BQU1BLEdBMUZFbUIsQ0FBaUJwQixLQUk3QixNQUFPQyxHQUVILE1BQU1BLEdBV2QsU0FBU2tCLEVBQWV0RixFQUFnQjRDLEdBRXBDLElBY0ksR0FaTUEsRUFBTy9ELFNBQVNtQixFQUdNLFlBQWpCNEMsRUFBTy9ELE9BQXdDLFlBQWpCK0QsRUFBTy9ELFFBRzVDbUIsRUFBVTRDLEVBQU8vRCxPQUFTbUIsRUFBVTRDLEVBQU8vRCxPQUFPbUMsT0FBTyxDQUFDeUIsRUFBYXZCLElBQWtCbEIsRUFBVTRDLEVBQU8vRCxPQUFPYSxRQUFRK0MsS0FBU3ZCLEdBR2xJbEIsRUFBVTRDLEVBQU8vRCxPQUFPc0MsUUFQeEJuQixFQUFVNEMsRUFBTy9ELE9BQVMrRCxFQUFPekQsUUFVakMsU0FBVXlELEVBRVYsSUFBSyxNQUFNekUsS0FBZXlFLEVBQVF4QyxLQUFNLENBRXBDLE1BQ0lvRixFQUFvQnhGLEVBQW1CNEMsRUFBUS9ELE9BR25EeUcsRUFBZUUsRUFGUzVDLEVBQVF4QyxLQUFLakMsS0FNakQsTUFBT2lHLEdBRUgsTUFBTUEsR0N2RlAsU0FBU3FCLEVBQVF6RixHQUVwQixJQUVJLE1BQU1pRixFQXNKZCxTQUFTUyxFQUFjMUYsRUFBZ0IyRixFQUFnQixHQUVuRCxNQUFNVixFQUFtQyxHQUd6Q1UsSUFHc0IsS0FBbEIzRixFQUFVQyxLQUVWZ0YsRUFBV2xFLEtBQUssQ0FDWjRFLE1BQU9BLEVBQ1AzRixVQUFXQSxJQUtmLGVBQWdCQSxHQUFhQSxFQUFVdUIsV0FBVzlCLE9BQVMsR0FFM0RPLEVBQVV1QixXQUFXRixRQUFTNkMsSUFFMUJlLEVBQVdsRSxRQUFRMkUsRUFBY3hCLEVBQU95QixNQUs1QyxjQUFlM0YsR0FBYUEsRUFBVWEsVUFBVXBCLE9BQVMsR0FFekRPLEVBQVVhLFVBQVVRLFFBQVM4QyxJQUl6QmMsRUFBV2xFLFFBQVEyRSxFQUFjdkIsRUFBVXdCLEVBQVEsTUFLM0QsT0FBT1YsRUEzTHNDUyxDQUFjMUYsSUZxSXhELFNBQVM0RixFQUFtQjVGLEVBQWdCaUYsR0FFL0MsSUFHSSxHQUF5QixNQUFyQmpGLEVBQVVDLElBQUksR0FDZCxNQUFNLElBQUksRUFBaUMsSUFJL0MsR0FBOEIsTUFBMUJELEVBQVVNLEtBQUtMLElBQUksR0FBWSxDQUUvQixNQUNJNEYsRUFBNEI3RixFQUFVTSxLQUFLTCxJQUFLK0IsVUFBVSxHQUc5RCxHQUFlLE1BRm1COEQsU0FBU0MsY0FBY0YsR0FHckQsTUFBTSxJQUFJLEVBQWlDLGlEQUFpREEsV0FLaEcsSUFBaUQsSUFBN0NiLEVBQWtCaEYsRUFBV2lGLElBQWdELEtBQXZCakYsRUFBVU0sS0FBS0wsSUFDckUsTUFBTSxJQUFJLEVBQXNCRCxFQUFVTSxLQUFLTCxLQUtuRCxlQUFnQkQsR0FBYUEsRUFBVXVCLFdBQVc5QixPQUFTLEdBRTNETyxFQUFVdUIsV0FBV0YsUUFBUzZDLElBRTFCMEIsRUFBbUIxQixFQUFPZSxLQUs5QixjQUFlakYsR0FBYUEsRUFBVWEsVUFBVXBCLE9BQVMsR0FFekRPLEVBQVVhLFVBQVVRLFFBQVM4QyxJQUV6QnlCLEVBQW1CekIsRUFBVWMsS0FJekMsTUFBT2IsR0FFSCxNQUFNQSxHRWpMTndCLENBQW1CNUYsRUFBV2lGLEdGd00vQixTQUFTZSxFQUEwQmhHLEVBQWdCaUYsR0FFdEQsSUFHSSxNQUFNcEUsRUFBWWIsRUFBVWEsVUFHeEJBLEVBQVVwQixPQUFTLEdBRW5Cb0IsRUFBVVEsUUFBUzhDLElBR2YsR0FBSUEsRUFBUzdELEtBQUtMLElBQUlSLE9BQVMsRUFBRyxDQU05QixJQUFtQixLQUYwRCxJQUFuRDRFLEVBREdZLEVBQVdqRSxPQUFRZixHQUFtQ0EsRUFBSUQsVUFBV0MsTUFBUWtFLEVBQVM3RCxLQUFLTCxLQUFLLEdBQ3RFRCxXQUFXUCxRQUcvRCxNQUFNLElBQUksRUFBZ0MwRSxFQUFTbEUsSUFBS2tFLEVBQVM3RCxLQUFLTCxRQU1yRkQsRUFBVXVCLFdBQVdGLFFBQVM2QyxJQUUxQjhCLEVBQTBCOUIsRUFBT2UsS0FHekMsTUFBTWIsR0FHRixNQUFNQSxHRXZPTjRCLENBQTBCaEcsRUFBV2lGLEdGbVB0QyxTQUFTZ0IsRUFBK0JqRyxFQUFnQmlGLEVBQWtDVSxFQUFnQixHQUU3RyxJQUVJLE1BQU0xRixFQUFjRCxFQUFVTSxLQUFLTCxJQU1uQyxHQUhBMEYsSUFHWSxLQUFSMUYsR0FBeUIsTUFBWEEsRUFBSSxHQUFZLENBSzlCLEdBQTJCLE1BRmdCZ0YsRUFBV2pFLE9BQVFrRixHQUF5Q0EsRUFBVWxHLFVBQVdDLE1BQVFBLEdBQU8wRixHQUFTTyxFQUFVUCxPQUFPLEdBR2pLLE1BQU0sSUFBSSxFQUF5QixJQUt2QyxlQUFnQjNGLEdBQWFBLEVBQVV1QixXQUFXOUIsT0FBUyxHQUUzRE8sRUFBVXVCLFdBQVdGLFFBQVM2QyxJQUUxQitCLEVBQStCL0IsRUFBT2UsRUFBWVUsS0FLdEQsY0FBZTNGLEdBQWFBLEVBQVVhLFVBQVVwQixPQUFTLEdBRXpETyxFQUFVYSxVQUFVUSxRQUFTOEMsSUFFekI4QixFQUErQjlCLEVBQVVjLEVBQVlVLEtBS2pFLE1BQU12QixHQUVGLE1BQU1BLEdFelJONkIsQ0FBK0JqRyxFQUFXaUYsR0E2QmxELFNBQVNrQixFQUFpQm5HLEVBQWdCaUYsR0FFdEMsSUFHUSxjQUFlakYsR0FBYUEsRUFBVWEsVUFBVXBCLE9BQVMsR0FFekRPLEVBQVVhLFVBQVVRLFFBQVM4QyxJQUV6QixHQUEwQixLQUF0QkEsRUFBUzdELEtBQUtMLElBRWQsSUFBSyxNQUFNOUIsS0FBT2dHLEVBQVUsQ0FHeEIsTUFDSXZCLEVBQWN2QyxFQUFRVyxPQUFReUIsR0FBZ0JBLEVBQUk1RCxRQUFVVixHQUFLLEdBQ2pFaUksRUFBcUNuQixFQUFXakUsT0FBUWYsR0FBdUJBLEVBQUlELFVBQVVDLE1BQVFrRSxFQUFTN0QsS0FBS0wsS0FBSyxHQUc1SDJDLEVBQU95RCxRQUFRbEMsRUFBVWlDLEVBQW9CcEcsVUFBVTdCLE9BT25FLGVBQWdCNkIsR0FBYUEsRUFBVXVCLFdBQVc5QixPQUFTLEdBRTNETyxFQUFVdUIsV0FBV0YsUUFBUzZDLElBRTFCaUMsRUFBaUJqQyxFQUFPZSxLQUlwQyxNQUFPYixHQUVILE1BQU1BLEdBOUROK0IsQ0FBaUJuRyxFQUFXaUYsRUFBV2pFLE9BQVFmLEdBQXVCLEVBQVdBLEVBQUlELGFBeUU3RixTQUFTc0csRUFBbUJ0RyxFQUFnQmlGLEdBRXhDLElBV0ksR0FSSSxlQUFnQmpGLEdBQWFBLEVBQVV1QixXQUFXOUIsT0FBUyxHQUUzRE8sRUFBVXVCLFdBQVdGLFFBQVM2QyxJQUUxQm9DLEVBQW1CcEMsRUFBT2UsS0FJUCxLQUF2QmpGLEVBQVVNLEtBQUtMLElBR2YsR0FBOEIsTUFBMUJELEVBQVVNLEtBQUtMLElBQUksR0FBWSxDQUUvQixNQUNJNEYsRUFBVzdGLEVBQVVNLEtBQUtMLElBQUkrQixVQUFVLEdBQ3hDakMsRUFBVStGLFNBQVNDLGNBQWNGLEdBRXJDLElBQUssTUFBTTFILEtBQU82QixFQUFXLENBR3pCLE1BQ0k0QyxFQUFjdkMsRUFBUVcsT0FBUXlCLEdBQWdCQSxFQUFJNUQsUUFBVVYsR0FBSyxHQUNqRU4sRUFBUStFLEVBQU85QyxrQkFBa0JDLEdBRXhCLE1BQVRsQyxHQUdBK0UsRUFBT3lELFFBQVFyRyxFQUFXbkMsUUFHL0IsQ0FFSCxNQUNJdUksRUFBcUNuQixFQUFXakUsT0FBUWYsR0FBdUJBLEVBQUlELFVBQVVDLE1BQVFELEVBQVVNLEtBQUtMLEtBQUssR0FDOUZELEVBQVVNLEtBQUtnQyxRQUFRdEIsT0FBUXlCLElBQXlELElBQXpDekMsRUFBVU0sS0FBS2lDLFFBQVE3QyxRQUFRK0MsSUFFbkdwQixRQUFTa0YsSUFHUWxHLEVBQVFXLE9BQVF5QixHQUFnQkEsRUFBSTVELFFBQVUwSCxHQUFTLEdBR3ZFRixRQUFRckcsRUFBV29HLEVBQW9CcEcsVUFBVXVHLE9BS3hFLE1BQU9uQyxHQUVILE1BQU1BLEdBNUhOa0MsQ0FBbUJ0RyxFQUFXaUYsR0FFbEMsTUFBT2IsR0FFSCxNQUFNQSxHQVVQLE1BQU0sRUFBY3BFLEdBQTZELElBQWpDcUUsRUFBV3JFLEdBQVdQLE9DdEN0RSxTQUFTK0csRUFBTXhHLEVBQWdCeUcsRUFBcUJDLEVBQWdFQyxHQUFxQixHQUU1SSxJQUdJLE1BQU01RyxFQTRCZCxTQUFzQkMsRUFBc0J5RyxFQUFxQkUsR0FBcUIsR0FFbEYsSUFHSSxNQUFNNUcsR0FBc0MsSUFBZDRHLEVBQXNCRixFQUFTWCxTQUFTYyxjQUFjNUcsRUFBVTdDLE1BaUI5RixPQWRBa0QsRUFBUWdCLFFBQVNvQixJQUV1QixtQkFBZkEsRUFBSytELE9BRVovRCxFQUFLK0QsTUFBTXpHLEVBQVNDLE1BS3BCLElBQWQyRyxHQUNBRixFQUFPSSxZQUFZOUcsR0FJaEJBLEVBRVgsTUFBTXFFLEdBRUYsTUFBTUEsR0F0RHVCMEMsQ0FBYTlHLEVBQVd5RyxFQUFRRSxHQUc3REQsRUFBYXJDLEVBQVdyRSxHQUFZQSxHQUdoQyxlQUFnQkEsR0FBYUEsRUFBVXVCLFdBQVc5QixPQUFTLEdBRTNETyxFQUFVdUIsV0FBV0YsUUFBUzZDLElBRTFCc0MsRUFBTXRDLEVBQU9uRSxFQUFTMkcsS0FJbEMsTUFBT3RDLEdBRUgsTUFBTUEsR0MvQkMsTUFBTSxVQUE4QmhCLEVBaUIvQyxZQUFZRSxHQUdSekQsTUFBTSxJQWZILEtBQUExQyxLQUFlLHdCQUtmLEtBQUFtRyxRQUFrQixvQ0FhckJwRSxLQUFLb0UsUUFBVUEsRUFBUTdELE9BQVMsRUFBSTZELEVBQVVwRSxLQUFLb0UsU0N6QjVDLE1BQU0sVUFBMkJGLEVBaUI1QyxZQUFZRSxHQUdSekQsTUFBTSxJQWZILEtBQUExQyxLQUFlLHFCQUtmLEtBQUFtRyxRQUFrQix5Q0FhckJwRSxLQUFLb0UsUUFBVUEsRUFBUTdELE9BQVMsRUFBSTZELEVBQVVwRSxLQUFLb0UsU0NNcEQsU0FBUyxFQUFNdEQsRUFBbUJzRSxFQUFxQnlDLEVBQWdELENBQUMvRyxPQUFtQjBHLEVBQWlFLFVBRS9MLElBSUksSU5KMEIsQ0FBQ3BDLEdBQTJDLE1BQVZBLEdBQWtCQSxhQUFrQjBDLFlNSTNGLENBQTZCMUMsR0FDOUIsTUFBTSxJQUFJLEVBQW1CLElBS2pDLElObEJ3QixDQUFDdEUsR0FBNEMsTUFBYkEsR0FBMEMsaUJBQWRBLElBQTJCVixNQUFNQyxRQUFRUyxHTWtCeEgsQ0FBMkJBLEdBQzVCLE1BQU0sSUFBSSxFQUFzQixJQXVCcEMsT0FsQkEsRUFBMEJBLEdBRzFCLEVBQW1CQSxHQUduQixFQUFZQSxHQUdaLEVBQW1CQSxHQUduQixFQUFhQSxFQUFXc0UsRUFBUW9DLEdBQWMsR0FHOUNLLEVBQVkvRyxHQUdMQSxFQUVYLE1BQU9vRSxHQU1ILE1BSGFBLEVBQUdkLFFBQVUsWUFBWWMsRUFBRWQsV0FHbENjLEdBVVAsU0FBUzZDLEVBQVNqSCxHQUNyQixJQU1JLE9BSEEsRUFBMEJBLEdBR25CLENBQ0hSLE9BQU8sRUFDUDBILE1BQU8sTUFFYixNQUFPQyxHQUdMLE1BQU8sQ0FDSDNILE9BQU8sRUFDUDBILE1BQU9DIiwiZmlsZSI6InRlbW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiLyoqXHJcbiAqIFRoZSBoaWVyYXJjaHkncyBvcHRpb24gbW9kZWwuXHJcbiAqIFdoYXQgZGVmaW5lcyBhIHZhbGlkIG9wdGlvbi5cclxuICovXHJcblxyXG5cclxuIGltcG9ydCB7IEhpZXJhcmNoeSB9IGZyb20gXCIuL0hpZXJhcmNoeVwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgaW5kaWNhdGVzXHJcbiAqIHN1Yi1vcHRpb25zLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS2V5cyB7XHJcblxyXG4gICAga2V5czogYW55O1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIG9wdGlvbnMgdGhhdCBoYXZlIHRvIHBhcnNlIHRoZWlyXHJcbiAqIHJlc3BlY3RpdmUgdmFsdWVzIGludG8gYSBzcGVjaWZpYyBIVE1MIGVsZW1lbnQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElQYXJzZXIge1xyXG5cclxuICAgIHBhcnNlOiAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhpZXJhcmNoeTogSGllcmFyY2h5KSA9PiB2b2lkXHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVGhlIG9wdGlvbidzIGNsYXNzLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgT3B0aW9uIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcHRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgb3B0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsdWVzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlZmF1bHQ6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgb3Igbm90IGFuIG9wdGlvbiBpcyBpbmhlcml0ZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0ZWQ6IGJvb2xlYW47XHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBuYW1lIG9mIHRoZSBvcHRpb24uXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvcHRpb24uXHJcbiAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIG9wdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobGFiZWw6IHN0cmluZywgdHlwZTogc3RyaW5nLCB2YWx1ZXM6IEFycmF5PGFueT4sIGRlZmF1bHRWYWx1ZTogYW55LCBpbmhlcml0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuICAgICAgICB0aGlzLmRlZmF1bHQgPSBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgdGhpcy5pbmhlcml0ZWQgPSBpbmhlcml0ZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnN0cmFjdCBpbmhlcml0IChoaWVyYXJjaHk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWRcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gYW4gZXhpc3RpbmcgSFRNTCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0S2V5RnJvbUVsZW1lbnQgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoZSBvcHRpb24ncyBuYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdPcHRpb24gVGhlIG9wdGlvbiBvYmplY3Qgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlT3B0aW9uTmFtZSA9IChtYXRjaGluZ09wdGlvbjogT3B0aW9uKTogYm9vbGVhbiA9PiBtYXRjaGluZ09wdGlvbiAhPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvbi5cclxuICAgICAqIEBwYXJhbSBtYXRjaGluZ09wdGlvbiBUaGUgb3B0aW9uIG9iamVjdCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVPcHRpb25UeXBlKHZhbHVlOiBhbnksIG1hdGNoaW5nT3B0aW9uOiBPcHRpb24pOiB7IHZhbGlkOiBib29sZWFuLCB0eXBlOiBzdHJpbmcgfSB7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25UeXBlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICAvLyBHZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHR5cGUuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIG9wdGlvblR5cGUgPSBcImFycmF5XCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9uVHlwZSA9IHR5cGVvZiB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbGlkOiBvcHRpb25UeXBlID09PSBtYXRjaGluZ09wdGlvbi50eXBlLFxyXG4gICAgICAgICAgICB0eXBlOiBvcHRpb25UeXBlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGUgb3B0aW9uJ3MgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdPcHRpb24gVGhlIG9wdGlvbiBvYmplY3Qgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlT3B0aW9uVmFsdWUodmFsdWU6IGFueSwgbWF0Y2hpbmdPcHRpb246IE9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBtYXRjaGluZyBvYmplY3QgaXMgdmFsaWQuXHJcbiAgICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uICE9IG51bGwgJiYgbWF0Y2hpbmdPcHRpb24udmFsdWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdPcHRpb24ubGFiZWwgPT09ICdpbmNsdWRlJyB8fCBtYXRjaGluZ09wdGlvbi5sYWJlbCA9PT0gJ2V4Y2x1ZGUnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdPcHRpb24udmFsdWVzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgb25lLlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nT3B0aW9uLnZhbHVlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgcmVmZXJlbmNlIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZk9wdGlvbiBleHRlbmRzIE9wdGlvbiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ3JlZicsICdzdHJpbmcnLCBbXSwgJycpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSByZWYgdG8gaW5oZXJpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaGVyaXQoaGllcmFyY2h5OiBhbnksIHJlZjogYW55KTogdm9pZCB7IH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG5vdGhpbmcgZnJvbSBhIGdpdmVuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byB0YXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5RnJvbUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkgPT4gbnVsbDtcclxufVxyXG4iLCIvKipcclxuICogVGhlIHZhbHVlIHN1YiBvcHRpb24gbW9kZWwuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24gZnJvbSBcIi4uLy4uL21vZGVscy9PcHRpb25cIjtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWx1ZVN1Yk9wdGlvbiBleHRlbmRzIE9wdGlvbiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ3ZhbHVlJywgJ3N0cmluZycsIFtdLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQgeyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBub3RoaW5nIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IG51bGw7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBjb250ZW50IHR5cGUgc3ViIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRlbnRUeXBlU3ViT3B0aW9uIGV4dGVuZHMgT3B0aW9uIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcigndHlwZScsICdzdHJpbmcnLCBbJ3RleHQnLCAnaHRtbCddLCAndGV4dCcpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7IH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG5vdGhpbmcgZnJvbSBhIGdpdmVuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byB0YXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5RnJvbUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkgPT4gbnVsbDtcclxufVxyXG4iLCIvKipcclxuICogVGhlIG1vZGUgc3ViIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGVTdWJPcHRpb24gZXh0ZW5kcyBPcHRpb24ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdtb2RlJywgJ3N0cmluZycsIFsnYXBwZW5kJywgJ292ZXJyaWRlJ10sICdhcHBlbmQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7IH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG5vdGhpbmcgZnJvbSBhIGdpdmVuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byB0YXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5RnJvbUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkgPT4gbnVsbDtcclxufVxyXG4iLCIvKipcclxuICogVGhlIHBsYWNlbWVudCBzdWIgb3B0aW9uIG1vZGVsLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuLi8uLi9tb2RlbHMvT3B0aW9uXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhY2VtZW50U3ViT3B0aW9uIGV4dGVuZHMgT3B0aW9uIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcigncGxhY2VtZW50JywgJ3N0cmluZycsIFsnYWZ0ZXInLCAnYmVmb3JlJ10sICdhZnRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdGhhdCBpbmhlcml0cy5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5oZXJpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaGVyaXQoaGllcmFyY2h5OiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHsgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgbm90aGluZyBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSA9PiBudWxsO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgYWxsb3cgc3ViIG9wdGlvbiBtb2RlbCBmb3IgdGhlIGZyb20tY2hpbGRyZW4gb3B0aW9uLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuLi8uLi9tb2RlbHMvT3B0aW9uXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hpbGRyZW5BbGxvd1N1Yk9wdGlvbiBleHRlbmRzIE9wdGlvbiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ2FsbG93JywgJ2Jvb2xlYW4nLCBbXSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQgeyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBub3RoaW5nIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IG51bGw7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBjaGlsZHJlbiBzdWIgb3B0aW9uIG1vZGVsLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uLCB7IElLZXlzIH0gZnJvbSBcIi4uLy4uL21vZGVscy9PcHRpb25cIjtcclxuaW1wb3J0IFBsYWNlbWVudFN1Yk9wdGlvbiBmcm9tIFwiLi9QbGFjZW1lbnRTdWJPcHRpb25cIjtcclxuaW1wb3J0IENoaWxkcmVuQWxsb3dTdWJPcHRpb24gZnJvbSBcIi4vQ2hpbGRyZW5BbGxvd1N1Yk9wdGlvblwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgY2hpbGRyZW4gc3ViIG9wdGlvbiBjbGFzc1xyXG4gKiBvZiB0aGUgZnJvbSBvcHRpb24uXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGlsZHJlblN1Yk9wdGlvbiBleHRlbmRzIE9wdGlvbiBpbXBsZW1lbnRzIElLZXlzIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBrZXlzIG9mIHRoZSBgY2hpbGRyZW5gIHN1YiBvcHRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlzOiBGcm9tQ2hpbGRyZW5LZXlzID0ge1xyXG4gICAgICAgIGFsbG93OiBuZXcgQ2hpbGRyZW5BbGxvd1N1Yk9wdGlvbigpLFxyXG4gICAgICAgIHBsYWNlbWVudDogbmV3IFBsYWNlbWVudFN1Yk9wdGlvbigpXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdjaGlsZHJlbicsICdvYmplY3QnLCBbXSwge1xyXG4gICAgICAgICAgICBhbGxvdzogKG5ldyBDaGlsZHJlbkFsbG93U3ViT3B0aW9uKCkpLmRlZmF1bHQsXHJcbiAgICAgICAgICAgIHBsYWNlbWVudDogKG5ldyBQbGFjZW1lbnRTdWJPcHRpb24oKSkuZGVmYXVsdFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdGhhdCBpbmhlcml0cy5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5oZXJpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaGVyaXQoaGllcmFyY2h5OiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHsgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgbm90aGluZyBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSA9PiBudWxsO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoZSBGcm9tQ2hpbGRyZW5LZXlzIHR5cGUuXHJcbiAqL1xyXG50eXBlIEZyb21DaGlsZHJlbktleXMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBjaGlsZHJlbiBpbmhlcml0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWxsb3c6IENoaWxkcmVuQWxsb3dTdWJPcHRpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5oZXJpdGFuY2UgbW9kZS5cclxuICAgICAqL1xyXG4gICAgcGxhY2VtZW50OiBQbGFjZW1lbnRTdWJPcHRpb247XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBpbmNsdWRlIHN1Yi1vcHRpb24uXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24gZnJvbSBcIi4uLy4uL21vZGVscy9PcHRpb25cIjtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmNsdWRlU3ViT3B0aW9uIGV4dGVuZHMgT3B0aW9uIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcignaW5jbHVkZScsICdhcnJheScsIFsnbmFtZScsICdpZCcsICdjbGFzc2VzJywgJ2F0dHJpYnV0ZXMnLCAnZGF0YXNldCcsICdjb250ZW50JywgJ2NoaWxkTm9kZXMnXSwgWyduYW1lJywgJ2lkJywgJ2NsYXNzZXMnLCAnYXR0cmlidXRlcycsICdkYXRhc2V0JywgJ2NvbnRlbnQnLCAnY2hpbGROb2RlcyddKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7IH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG5vdGhpbmcgZnJvbSBhIGdpdmVuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byB0YXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5RnJvbUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkgPT4gbnVsbDtcclxufVxyXG4iLCIvKipcclxuICogVGhlIGV4Y2x1ZGUgc3ViLW9wdGlvbi5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4Y2x1ZGVTdWJPcHRpb24gZXh0ZW5kcyBPcHRpb24ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdleGNsdWRlJywgJ2FycmF5JywgWyduYW1lJywgJ2lkJywgJ2NsYXNzZXMnLCAnYXR0cmlidXRlcycsICdkYXRhc2V0JywgJ2NvbnRlbnQnLCAnY2hpbGROb2RlcyddLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQgeyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBub3RoaW5nIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IG51bGw7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25zLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uLCB7IElLZXlzIH0gZnJvbSBcIi4vbW9kZWxzL09wdGlvblwiO1xyXG5pbXBvcnQgUmVmT3B0aW9uIGZyb20gXCIuL29wdGlvbnMvUmVmT3B0aW9uXCI7XHJcbmltcG9ydCBOYW1lT3B0aW9uIGZyb20gXCIuL29wdGlvbnMvTmFtZU9wdGlvblwiO1xyXG5pbXBvcnQgSWRPcHRpb24gZnJvbSBcIi4vb3B0aW9ucy9JZE9wdGlvblwiO1xyXG5pbXBvcnQgQ29udGVudE9wdGlvbiBmcm9tIFwiLi9vcHRpb25zL0NvbnRlbnRPcHRpb25cIjtcclxuaW1wb3J0IFRlbW1lSWRzT3B0aW9uIGZyb20gXCIuL29wdGlvbnMvVGVtbWVJZHNPcHRpb25cIjtcclxuaW1wb3J0IFRlbXBsYXRlc09wdGlvbiBmcm9tIFwiLi9vcHRpb25zL1RlbXBsYXRlc09wdGlvblwiO1xyXG5pbXBvcnQgQ2xhc3Nlc09wdGlvbiBmcm9tIFwiLi9vcHRpb25zL0NsYXNzZXNPcHRpb25cIjtcclxuaW1wb3J0IENoaWxkTm9kZXNPcHRpb24gZnJvbSBcIi4vb3B0aW9ucy9DaGlsZHJlbk5vZGVzT3B0aW9uXCI7XHJcbmltcG9ydCBBdHRyaWJ1dGVzT3B0aW9uIGZyb20gXCIuL29wdGlvbnMvQXR0cmlidXRlc09wdGlvblwiO1xyXG5pbXBvcnQgRGF0YXNldE9wdGlvbiBmcm9tIFwiLi9vcHRpb25zL0RhdGFzZXRPcHRpb25cIjtcclxuaW1wb3J0IEZyb21PcHRpb24gZnJvbSBcIi4vb3B0aW9ucy9Gcm9tT3B0aW9uXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIEFsbCB0aGUgZ2xvYmFsIG9wdGlvbnMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3B0aW9uczogQXJyYXk8T3B0aW9uPiA9IFtcclxuICAgIG5ldyBSZWZPcHRpb24oKSxcclxuICAgIG5ldyBOYW1lT3B0aW9uKCksXHJcbiAgICBuZXcgSWRPcHRpb24oKSxcclxuICAgIG5ldyBDb250ZW50T3B0aW9uKCksXHJcbiAgICBuZXcgVGVtbWVJZHNPcHRpb24oKSxcclxuICAgIG5ldyBUZW1wbGF0ZXNPcHRpb24oKSxcclxuICAgIG5ldyBDbGFzc2VzT3B0aW9uKCksXHJcbiAgICBuZXcgQ2hpbGROb2Rlc09wdGlvbigpLFxyXG4gICAgbmV3IEF0dHJpYnV0ZXNPcHRpb24oKSxcclxuICAgIG5ldyBEYXRhc2V0T3B0aW9uKCksXHJcbiAgICBuZXcgRnJvbU9wdGlvbigpXHJcbl07XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoZSBvZiB0aGUgb3B0aW9ucyBhdmFpbGFibGUgKGluY2x1ZGluZyBzdWItb3B0aW9ucykuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWxsT3B0aW9ucyA9IGdldEFsbE9wdGlvbnMoKTtcclxuXHJcblxyXG4vKipcclxuICogVGhlIG9wdGlvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgZm9yIHRlbXBsYXRlcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBmb3JiaWRkZW5PcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gWyduYW1lJywgJ2NoaWxkTm9kZXMnLCAndGVtcGxhdGVzJ107XHJcblxyXG5cclxuLyoqXHJcbiAqIEdldHMgYWxsIHRoZSBzdWItb3B0aW9ucyBvZiBhbiBvcHRpb24uXHJcbiAqIFxyXG4gKiBAcGFyYW0gb3B0aW9uIFRoZSBwYXJlbnQgb3B0aW9uJ3MgbmFtZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJPcHRpb25zKG9wdGlvbjogc3RyaW5nKTogQXJyYXk8T3B0aW9uPiB7XHJcblxyXG4gICAgY29uc3Qgc3ViT3B0aW9uczogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAgIC8vIExvb3BpbmcgdGhyb3VnaCBhbGwgb2YgdGhlIG9wdGlvbnMuXHJcbiAgICBhbGxPcHRpb25zLmZvckVhY2goKG9wdDogT3B0aW9uKSA9PiB7XHJcblxyXG4gICAgICAgIGlmICgna2V5cycgaW4gb3B0ICYmICg8T3B0aW9uPm9wdCkubGFiZWwgPT09IG9wdGlvbikge1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gKDxJS2V5cz5vcHQpLmtleXMpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBzdWItb3B0aW9uLlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViT3B0aW9uID0gKDxJS2V5cz5vcHQpLmtleXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBQdXNoaW5nIHRoZSBzdWItb3B0aW9uLlxyXG4gICAgICAgICAgICAgICAgc3ViT3B0aW9ucy5wdXNoKHN1Yk9wdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBSZXR1cm5pbmcgdGhlIGZvdW5kIHN1Yi1vcHRpb25zLlxyXG4gICAgcmV0dXJuIHN1Yk9wdGlvbnM7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogR2V0cyBhbGwgb2YgdGhlIG9wdGlvbnMgYW5kIHN1Yi1vcHRpb25zLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWxsT3B0aW9ucygpOiBBcnJheTxPcHRpb24+IHtcclxuXHJcbiAgICBsZXQgYWxsT3B0aW9uczogQXJyYXk8T3B0aW9uPiA9IFtdO1xyXG5cclxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0OiBPcHRpb24pID0+IHtcclxuXHJcbiAgICAgICAgYWxsT3B0aW9ucy5wdXNoKG9wdCk7XHJcblxyXG4gICAgICAgIGlmICgna2V5cycgaW4gb3B0KSB7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXR0aW5nIGFsbCBvZiB0aGUgc3ViLW9wdGlvbnMuXHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9wdGlvbnM6IEFycmF5PE9wdGlvbj4gPSBnZXRBbGxTdWJPcHRpb25zKG9wdCk7XHJcblxyXG4gICAgICAgICAgICBhbGxPcHRpb25zID0gYWxsT3B0aW9ucy5jb25jYXQoc3ViT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGFsbE9wdGlvbnM7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogR2V0cyBhbGwgdGhlIHN1Yi1vcHRpb25zIG9mIGFuIG9wdGlvbi5cclxuICogXHJcbiAqIEBwYXJhbSBvcHQgVGhlIG9wdGlvbiB0byBnZXQgdGhlIHN1Yi1vcHRpb25zIG9mLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWxsU3ViT3B0aW9ucyhvcHRpb246IE9wdGlvbik6IEFycmF5PE9wdGlvbj4ge1xyXG5cclxuICAgIGxldCBhbGxTdWJPcHRpb25zOiBBcnJheTxPcHRpb24+ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gKDxhbnk+b3B0aW9uKS5rZXlzKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN1Yk9wdGlvbjogT3B0aW9uID0gKDxhbnk+b3B0aW9uKS5rZXlzW2tleV07XHJcblxyXG4gICAgICAgIGFsbFN1Yk9wdGlvbnMucHVzaChzdWJPcHRpb24pO1xyXG5cclxuICAgICAgICBpZiAoJ2tleXMnIGluIHN1Yk9wdGlvbikge1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0czogQXJyYXk8T3B0aW9uPiA9IGdldEFsbFN1Yk9wdGlvbnMoc3ViT3B0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGFsbFN1Yk9wdGlvbnMgPSBhbGxTdWJPcHRpb25zLmNvbmNhdChvcHRzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbFN1Yk9wdGlvbnM7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBuYW1lIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hbWVPcHRpb24gZXh0ZW5kcyBPcHRpb24ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCduYW1lJywgJ3N0cmluZycsIFtdLCAnZGl2JywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gaW5oZXJpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaGVyaXQoaGllcmFyY2h5OiBhbnksIG5hbWU6IGFueSk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20ubW9kZSA9PT0gJ292ZXJyaWRlJykge1xyXG5cclxuICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5uYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBub3RoaW5nIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IG51bGw7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBJRCBvcHRpb24gbW9kZWwuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24sIHsgSVBhcnNlciB9IGZyb20gXCIuLi9tb2RlbHMvT3B0aW9uXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeSB9IGZyb20gXCIuLi9tb2RlbHMvSGllcmFyY2h5XCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWRPcHRpb24gZXh0ZW5kcyBPcHRpb24gaW1wbGVtZW50cyBJUGFyc2VyIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcignaWQnLCAnc3RyaW5nJywgW10sICcnLCB0cnVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgaWQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAoaWQgIT09ICcnKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20ubW9kZSA9PT0gJ2FwcGVuZCcpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGllcmFyY2h5LmlkID09PSAnJykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHkuaWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICBoaWVyYXJjaHkuaWQgPSBpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBpZCBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSA9PiBlbGVtZW50LmlkO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGlkIGZvciBhbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gc2V0IHRoZSBpZCBmb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcnNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBoaWVyYXJjaHk6IEhpZXJhcmNoeSkge1xyXG5cclxuICAgICAgICBpZiAoaGllcmFyY2h5LmlkICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgPSBoaWVyYXJjaHkuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgdGV4dCBvcHRpb24gbW9kZWwuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24sIHsgSUtleXMsIElQYXJzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5pbXBvcnQgeyBIaWVyYXJjaHkgfSBmcm9tICcuLi9tb2RlbHMvSGllcmFyY2h5JztcclxuaW1wb3J0IFZhbHVlU3ViT3B0aW9uIGZyb20gXCIuL3N1Yi1vcHRpb25zL1ZhbHVlU3ViT3B0aW9uXCI7XHJcbmltcG9ydCBDb250ZW50VHlwZVN1Yk9wdGlvbiBmcm9tIFwiLi9zdWItb3B0aW9ucy9Db250ZW50VHlwZVN1Yk9wdGlvblwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudCBvcHRpb24gY2xhc3MuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250ZW50T3B0aW9uIGV4dGVuZHMgT3B0aW9uIGltcGxlbWVudHMgSUtleXMsIElQYXJzZXIge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGtleXMgb2YgdGhlIGBjb250ZW50YCBvcHRpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlzOiBDb250ZW50S2V5cyA9IHtcclxuICAgICAgICB0eXBlOiBuZXcgQ29udGVudFR5cGVTdWJPcHRpb24oKSxcclxuICAgICAgICB2YWx1ZTogbmV3IFZhbHVlU3ViT3B0aW9uKClcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ2NvbnRlbnQnLCAnb2JqZWN0JywgW10sIHtcclxuICAgICAgICAgICAgdHlwZTogKG5ldyBDb250ZW50VHlwZVN1Yk9wdGlvbigpKS5kZWZhdWx0LFxyXG4gICAgICAgICAgICB2YWx1ZTogKG5ldyBWYWx1ZVN1Yk9wdGlvbigpKS5kZWZhdWx0XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdGhhdCBpbmhlcml0cy5cclxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCBjb250ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgY3Q6IHN0cmluZyA9IGNvbnRlbnQudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChjb250ZW50LnZhbHVlICE9PSBcIlwiKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20ubW9kZSA9PT0gJ2FwcGVuZCcpIHtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgY3QgPSBgJHtoaWVyYXJjaHkuY29udGVudC52YWx1ZX0ke2N0Lmxlbmd0aCA+IDAgPyAnICcgOiAnJ30ke2N0fWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGhpZXJhcmNoeS5jb250ZW50ID0gY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS5jb250ZW50LnZhbHVlID0gY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgY29udGVudCBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7IFxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiBcImh0bWxcIixcclxuICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQuaW5uZXJIVE1MXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IGZvciBhbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gc2V0IHRoZSBjb250ZW50IGZvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2UgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBoaWVyYXJjaHk6IEhpZXJhcmNoeSkge1xyXG5cclxuICAgICAgICBpZiAoKDxhbnk+aGllcmFyY2h5KS5jb250ZW50LnZhbHVlICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICgoPGFueT5oaWVyYXJjaHkpLmNvbnRlbnQudHlwZSA9PT0gJ3RleHQnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9ICg8YW55PmhpZXJhcmNoeSkuY29udGVudC52YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICg8YW55PmhpZXJhcmNoeSkuY29udGVudC52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ29udGVudEtleXMgdHlwZS5cclxuICovXHJcbnR5cGUgQ29udGVudEtleXMgPSB7XHJcblxyXG4gICAgdHlwZTogQ29udGVudFR5cGVTdWJPcHRpb247XHJcbiAgICB2YWx1ZTogVmFsdWVTdWJPcHRpb247XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSByZWZlcmVuY2Ugb3B0aW9uIG1vZGVsLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuLi9tb2RlbHMvT3B0aW9uXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtbWVJZHNPcHRpb24gZXh0ZW5kcyBPcHRpb24ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCd0ZW1tZUlkcycsICdhcnJheScsIFtdLCBbXSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdGhhdCBpbmhlcml0cy5cclxuICAgICAqIEBwYXJhbSB0ZW1tZUlkcyBUaGUgdGVtbWVJZHMgdG8gaW5oZXJpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaGVyaXQoaGllcmFyY2h5OiBhbnksIHRlbW1lSWRzOiBhbnkpOiB2b2lkIHsgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgbm90aGluZyBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSA9PiBudWxsO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgdGVtcGxhdGVzIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbXBsYXRlc09wdGlvbiBleHRlbmRzIE9wdGlvbiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ3RlbXBsYXRlcycsICdhcnJheScsIFtdLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbmhlcml0YW5jZSBwcm9jZXNzIG9uIGFuIG9wdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IGluaGVyaXRzLlxyXG4gICAgICogQHBhcmFtIHRlbXBsYXRlcyBUaGUgdGVtcGxhdGVzIHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCB0ZW1wbGF0ZXM6IGFueSk6IHZvaWQgeyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBub3RoaW5nIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IG51bGw7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBjbGFzc2VzIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiwgeyBJUGFyc2VyIH0gZnJvbSBcIi4uL21vZGVscy9PcHRpb25cIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5IH0gZnJvbSAnLi4vbW9kZWxzL0hpZXJhcmNoeSc7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xhc3Nlc09wdGlvbiBleHRlbmRzIE9wdGlvbiBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdjbGFzc2VzJywgJ2FycmF5JywgW10sIFtdLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gY2xhc3NlcyBUaGUgY2xhc3NlcyB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgY2xhc3NlczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGhpZXJhcmNoeS5mcm9tLm1vZGUgPT09ICdhcHBlbmQnKSB7XHJcblxyXG4gICAgICAgICAgICBoaWVyYXJjaHkuY2xhc3Nlcy5wdXNoKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBoaWVyYXJjaHkuY2xhc3NlcyA9IGNsYXNzZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFJlbW92aW5nIGR1cGxpY2F0ZXMuXHJcbiAgICAgICAgaGllcmFyY2h5LmNsYXNzZXMgPSBoaWVyYXJjaHkuY2xhc3Nlcy5maWx0ZXIoKGNsczogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiBoaWVyYXJjaHkuY2xhc3Nlcy5pbmRleE9mKGNscykgPT09IGluZGV4KTtcclxuXHJcbiAgICAgICAgLy8gU29ydGluZyB0aGUgY2xhc3Nlcy5cclxuICAgICAgICBoaWVyYXJjaHkuY2xhc3Nlcy5zb3J0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBjbGFzc2VzIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55IHtcclxuICAgICAgXHJcbiAgICAgICAgbGV0IGNsYXNzZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IGNsYXNzZXMucHVzaChjbHMpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNsYXNzZXMgZm9yIGFuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byBzZXQgdGhlIGNsYXNzZXMgZm9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhpZXJhcmNoeTogSGllcmFyY2h5KSB7XHJcblxyXG4gICAgICAgIGlmIChoaWVyYXJjaHkuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uaGllcmFyY2h5LmNsYXNzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGNoaWxkcmVuIG9wdGlvbiBtb2RlbC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoaWxkTm9kZXNPcHRpb24gZXh0ZW5kcyBPcHRpb24ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdjaGlsZE5vZGVzJywgJ2FycmF5JywgW10sIFtdLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gY2hpbGROb2RlcyBUaGUgY2hpbGROb2RlcyB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgY2hpbGROb2RlczogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZHJlbjogYW55ID0gWyAuLi5oaWVyYXJjaHkuY2hpbGROb2RlcyBdO1xyXG5cclxuICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20uY2hpbGRyZW4uYWxsb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChoaWVyYXJjaHkuZnJvbS5tb2RlID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20uY2hpbGRyZW4ucGxhY2VtZW50ID09PSAnYmVmb3JlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnVuc2hpZnQoLi4uY2hpbGROb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKC4uLmNoaWxkTm9kZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMgPSBjaGlsZHJlbjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGNoaWxkcmVuIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55ID0+IGVsZW1lbnQuaW5uZXJIVE1MO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgYXR0cmlidXRlcyBvcHRpb24gbW9kZWwuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24sIHsgSVBhcnNlciB9IGZyb20gXCIuLi9tb2RlbHMvT3B0aW9uXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeSB9IGZyb20gXCIuLi9tb2RlbHMvSGllcmFyY2h5XCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXR0cmlidXRlc09wdGlvbiBleHRlbmRzIE9wdGlvbiBpbXBsZW1lbnRzIElQYXJzZXIge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYW1ldGVybGVzcyBjb25zdHJ1Y3Rvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKCdhdHRyaWJ1dGVzJywgJ29iamVjdCcsIFtdLCB7fSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5oZXJpdGFuY2UgcHJvY2VzcyBvbiBhbiBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdGhhdCBpbmhlcml0cy5cclxuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmhlcml0KGhpZXJhcmNoeTogYW55LCBhdHRyaWJ1dGVzOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgYXR0cjogYW55ID0geyAuLi5hdHRyaWJ1dGVzIH07XHJcblxyXG4gICAgICAgIGlmIChoaWVyYXJjaHkuZnJvbS5tb2RlID09PSAnYXBwZW5kJykge1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyS2V5IGluIGhpZXJhcmNoeS5hdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgYXR0clthdHRyS2V5XSA9IGhpZXJhcmNoeS5hdHRyaWJ1dGVzW2F0dHJLZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0cktleSBpbiBoaWVyYXJjaHkuYXR0cmlidXRlcykge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghKGF0dHJLZXkgaW4gYXR0cikpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXR0clthdHRyS2V5XSA9IGhpZXJhcmNoeS5hdHRyaWJ1dGVzW2F0dHJLZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoaWVyYXJjaHkuYXR0cmlidXRlcyA9IGF0dHI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhdHRyaWJ1dGVzIGZyb20gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gdGFyZ2V0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEtleUZyb21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55IHtcclxuXHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZXM6IGFueSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGF0dHJLZXkgaW4gZWxlbWVudC5hdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHBhcnNlSW50KGF0dHJLZXkpKSAmJiBbJ2lkJywgJ2NsYXNzJ10uaW5kZXhPZihlbGVtZW50LmF0dHJpYnV0ZXNbYXR0cktleV0ubm9kZU5hbWUpID09PSAtMSAmJiBlbGVtZW50LmF0dHJpYnV0ZXNbYXR0cktleV0ubm9kZU5hbWUuc3Vic3RyaW5nKDAsIDUpICE9PSAnZGF0YS0nKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tlbGVtZW50LmF0dHJpYnV0ZXNbYXR0cktleV0ubm9kZU5hbWVdID0gZWxlbWVudC5hdHRyaWJ1dGVzW2F0dHJLZXldLm5vZGVWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYXR0cmlidXRlcyBmb3IgYW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHNldCB0aGUgYXR0cmlidXRlcyBmb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcnNlIChlbGVtZW50OiBIVE1MRWxlbWVudCwgaGllcmFyY2h5OiBIaWVyYXJjaHkpIHtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBkYXRhS2V5IGluIGhpZXJhcmNoeS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShkYXRhS2V5LCAoPGFueT5oaWVyYXJjaHkpLmF0dHJpYnV0ZXNbZGF0YUtleV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGRhdGFzZXQgb3B0aW9uIG1vZGVsLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uLCB7IElQYXJzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL09wdGlvblwiO1xyXG5pbXBvcnQgeyBIaWVyYXJjaHkgfSBmcm9tICcuLi9tb2RlbHMvSGllcmFyY2h5JztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhc2V0T3B0aW9uIGV4dGVuZHMgT3B0aW9uIGltcGxlbWVudHMgSVBhcnNlciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoJ2RhdGFzZXQnLCAnb2JqZWN0JywgW10sIHt9LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gZGF0YXNldCBUaGUgZGF0YXNldCB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgZGF0YXNldDogYW55KTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGR0OiBhbnkgPSB7IC4uLmRhdGFzZXQgfTtcclxuXHJcbiAgICAgICAgaWYgKGhpZXJhcmNoeS5mcm9tLm1vZGUgPT09ICdhcHBlbmQnKSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFLZXkgaW4gaGllcmFyY2h5LmRhdGFzZXQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBkdFtkYXRhS2V5XSA9IGhpZXJhcmNoeS5kYXRhc2V0W2RhdGFLZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YUtleSBpbiBoaWVyYXJjaHkuZGF0YXNldCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghKGRhdGFLZXkgaW4gZHQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGR0W2RhdGFLZXldID0gaGllcmFyY2h5LmRhdGFzZXRbZGF0YUtleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhpZXJhcmNoeS5kYXRhc2V0ID0gZHQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBkYXRhdHNldCBmcm9tIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHRhcmdldC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRLZXlGcm9tRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhc2V0OiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBkYXRhS2V5IGluIGVsZW1lbnQuZGF0YXNldCkge1xyXG5cclxuICAgICAgICAgICAgZGF0YXNldFtkYXRhS2V5XSA9IGVsZW1lbnQuZGF0YXNldFtkYXRhS2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhc2V0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRhdGFzZXQgZm9yIGFuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byBzZXQgdGhlIGRhdGFzZXQgZm9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhpZXJhcmNoeTogSGllcmFyY2h5KSB7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZGF0YUtleSBpbiBoaWVyYXJjaHkuZGF0YXNldCkge1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0W2RhdGFLZXldID0gKDxhbnk+aGllcmFyY2h5KS5kYXRhc2V0W2RhdGFLZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGZyb20gb3B0aW9uIG1vZGVsLlxyXG4gKi9cclxuXHJcblxyXG5cclxuaW1wb3J0IE9wdGlvbiwgeyBJS2V5cyB9IGZyb20gXCIuLi9tb2RlbHMvT3B0aW9uXCI7XHJcbmltcG9ydCBSZWZPcHRpb24gZnJvbSBcIi4vUmVmT3B0aW9uXCI7XHJcbmltcG9ydCBNb2RlU3ViT3B0aW9uIGZyb20gXCIuL3N1Yi1vcHRpb25zL01vZGVTdWJPcHRpb25cIjtcclxuaW1wb3J0IENoaWxkcmVuU3ViT3B0aW9uIGZyb20gXCIuL3N1Yi1vcHRpb25zL0NoaWxkcmVuU3ViT3B0aW9uXCI7XHJcbmltcG9ydCBJbmNsdWRlU3ViT3B0aW9uIGZyb20gXCIuL3N1Yi1vcHRpb25zL0luY2x1ZGVTdWJPcHRpb25cIjtcclxuaW1wb3J0IEV4Y2x1ZGVTdWJPcHRpb24gZnJvbSBcIi4vc3ViLW9wdGlvbnMvRXhjbHVkZVN1Yk9wdGlvblwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb21PcHRpb24gZXh0ZW5kcyBPcHRpb24gaW1wbGVtZW50cyBJS2V5cyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUga2V5cyBvZiB0aGUgYGZyb21gIG9wdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXM6IEZyb21LZXlzID0ge1xyXG4gICAgICAgIHJlZjogbmV3IFJlZk9wdGlvbigpLFxyXG4gICAgICAgIG1vZGU6IG5ldyBNb2RlU3ViT3B0aW9uKCksXHJcbiAgICAgICAgY2hpbGRyZW46IG5ldyBDaGlsZHJlblN1Yk9wdGlvbigpLFxyXG4gICAgICAgIGluY2x1ZGU6IG5ldyBJbmNsdWRlU3ViT3B0aW9uKCksXHJcbiAgICAgICAgZXhjbHVkZTogbmV3IEV4Y2x1ZGVTdWJPcHRpb24oKVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcignZnJvbScsICdvYmplY3QnLCBbXSwge1xyXG4gICAgICAgICAgICByZWY6IChuZXcgUmVmT3B0aW9uKCkpLmRlZmF1bHQsXHJcbiAgICAgICAgICAgIG1vZGU6IChuZXcgTW9kZVN1Yk9wdGlvbigpKS5kZWZhdWx0LFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogKG5ldyBDaGlsZHJlblN1Yk9wdGlvbigpKS5kZWZhdWx0LFxyXG4gICAgICAgICAgICBpbmNsdWRlOiAobmV3IEluY2x1ZGVTdWJPcHRpb24oKSkuZGVmYXVsdCxcclxuICAgICAgICAgICAgZXhjbHVkZTogKG5ldyBFeGNsdWRlU3ViT3B0aW9uKCkpLmRlZmF1bHRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaGVyaXRhbmNlIHByb2Nlc3Mgb24gYW4gb3B0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgaW5oZXJpdHMuXHJcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgZnJvbSB0byBpbmhlcml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5oZXJpdChoaWVyYXJjaHk6IGFueSwgZnJvbTogYW55KTogdm9pZCB7IH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG5vdGhpbmcgZnJvbSBhIGdpdmVuIEhUTUwgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byB0YXJnZXQuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5RnJvbUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkgPT4gbnVsbDtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGUgRnJvbUtleXMgdHlwZS5cclxuICovXHJcbnR5cGUgRnJvbUtleXMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVmZXJlbmNlIHN1YiBvcHRpb24uXHJcbiAgICAgKi9cclxuICAgIHJlZjogUmVmT3B0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGluaGVyaXRhbmNlIG1vZGUuXHJcbiAgICAgKi9cclxuICAgIG1vZGU6IE1vZGVTdWJPcHRpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5oZXJpdGFuY2UgbW9kZS5cclxuICAgICAqL1xyXG4gICAgY2hpbGRyZW46IENoaWxkcmVuU3ViT3B0aW9uO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoYXQgb3B0aW9ucyB0byBpbmhlcml0ZS5cclxuICAgICAqL1xyXG4gICAgaW5jbHVkZTogSW5jbHVkZVN1Yk9wdGlvbjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGF0IG9wdGlvbnMgbm90IHRvIGluaGVyaXQuXHJcbiAgICAgKi9cclxuICAgIGV4Y2x1ZGU6IEV4Y2x1ZGVTdWJPcHRpb247XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRlbW1lJ3MgZXJyb3IgaW50ZXJmYWNlLlxyXG4gKi9cclxuaW50ZXJmYWNlIElUZW1teUVycm9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBtZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVGVtbWUncyBjdXN0b20gZXJyb3JzLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtbXlFcnJvciBleHRlbmRzIEVycm9yIGltcGxlbWVudHMgSVRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ1RlbW15RXJyb3InO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJUZW1tZSBpc24ndCBmZWVsaW5nIGdvb2RcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIHRlbXBsYXRlXHJcbiAqIGhhcyBhIGZvcmJpZGRlbiBvcHRpb24uXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIkEgdGVtcGxhdGUgaGFzIGFuIGludmFsaWQgb3B0aW9uXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGludmFsaWQgb3B0aW9uJ3MgbmFtZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcihcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gQ29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGDigJwke29wdGlvbn3igJ0gaXMgbm90IGEgdmFsaWQgb3B0aW9uIHRvIHVzZSBpbiB0ZW1wbGF0ZXNgO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbi5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGFuIG9wdGlvblxyXG4gKiBpcyBub3QgdmFsaWQuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRPcHRpb25OYW1lRXJyb3IgZXh0ZW5kcyBUZW1teUVycm9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiSW52YWxpZE9wdGlvbk5hbWVFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBbiBvcHRpb24gaXMgbm90IHZhbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIGludmFsaWQgb3B0aW9uJ3MgbmFtZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcihcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gQ29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGDigJwke29wdGlvbn3igJ0gaXMgbm90IGEgdmFsaWQgb3B0aW9uYDtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRpbmcgdGhlIGVycm9yJ3MgbWVzc2FnZS5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb24ubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhbiBvcHRpb25cclxuICogaXMgbm90IG9mIGEgdmFsaWQgZGF0YSB0eXBlLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgVGVtbXlFcnJvciBmcm9tIFwiLi4vbW9kZWxzL1RlbW15RXJyb3JcIjtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkT3B0aW9uVHlwZUVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkludmFsaWRPcHRpb25UeXBlRXJyb3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9IFwiQW4gb3B0aW9uIGRvZXNuJ3QgaGF2ZSBhIHZhbGlkIHZhbHVlIHR5cGVcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgaW52YWxpZCBvcHRpb24ncyBuYW1lLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnZhbGlkIG9wdGlvbidzIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb246IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIENhbGxpbmcgdGhlIHBhcmVudCBjbGFzcyBgVGVtbXlFcnJvcmAuXHJcbiAgICAgICAgc3VwZXIoXCJcIik7XHJcblxyXG4gICAgICAgIC8vIENvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZS5cclxuICAgICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgVGhlIOKAnCR7b3B0aW9ufeKAnSBvcHRpb24gZG9lc24ndCBhY2NlcHQgdmFsdWVzIG9mIHR5cGUg4oCcJHt0eXBlfeKAnWA7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gb3B0aW9uLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogdGhpcy5tZXNzYWdlO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBUaGUgZXJyb3IgdGhyb3duIHdoZW4gYW4gb3B0aW9uXHJcbiAqIGlzIG5vdCBvZiBhIHZhbGlkIHZhbHVlLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgVGVtbXlFcnJvciBmcm9tIFwiLi4vbW9kZWxzL1RlbW15RXJyb3JcIjtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkT3B0aW9uVmFsdWVFcnJvciBleHRlbmRzIFRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJJbnZhbGlkT3B0aW9uVmFsdWVFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBbiBvcHRpb24gZG9lc24ndCBoYXZlIGEgdmFsaWQgdmFsdWVcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgaW52YWxpZCBvcHRpb24ncyBuYW1lLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnZhbGlkIG9wdGlvbidzIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb246IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgYFRlbW15RXJyb3JgLlxyXG4gICAgICAgIHN1cGVyKFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIGVycm9yIG1lc3NhZ2UuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gYFRoZSDigJwke29wdGlvbn3igJ0gb3B0aW9uIGRvZXNuJ3QgYWNjZXB0IOKAnCR7dmFsdWV94oCdIGFzIGEgdmFsdWVgO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbi5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGEgc3ViLW9wdGlvblxyXG4gKiBpcyBub3QgdmFsaWQuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRTdWJPcHRpb25OYW1lRXJyb3IgZXh0ZW5kcyBUZW1teUVycm9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiSW52YWxpZFN1Yk9wdGlvbk5hbWVFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBIHN1Yi1vcHRpb24gaXMgbm90IHZhbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIHBhcmVudCBvcHRpb24ncyBuYW1lLlxyXG4gICAgICogQHBhcmFtIHN1Yk9wdGlvbiBUaGUgaW52YWxpZCBzdWItb3B0aW9uJ3MgbmFtZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uOiBzdHJpbmcsIHN1Yk9wdGlvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIENhbGxpbmcgdGhlIHBhcmVudCBjbGFzcyBgVGVtbXlFcnJvcmAuXHJcbiAgICAgICAgc3VwZXIoXCJcIik7XHJcblxyXG4gICAgICAgIC8vIENvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZS5cclxuICAgICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgVGhlIOKAnCR7b3B0aW9ufeKAnSBvcHRpb24gZG9lc24ndCBub3QgcmVjb2duaXplIOKAnCR7c3ViT3B0aW9ufeKAnSBhcyBhIHZhbGlkIHN1Yi1vcHRpb25gO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbi5sZW5ndGggPiAwIHx8IHN1Yk9wdGlvbi5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGEgc3ViLXB0aW9uXHJcbiAqIGlzIG5vdCBvZiBhIHZhbGlkIGRhdGEgdHlwZS5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IFRlbW15RXJyb3IgZnJvbSBcIi4uL21vZGVscy9UZW1teUVycm9yXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52YWxpZFN1Yk9wdGlvblR5cGVFcnJvciBleHRlbmRzIFRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJJbnZhbGlkU3ViT3B0aW9uVHlwZUVycm9yXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIkEgc3ViLW9wdGlvbiBkb2Vzbid0IGhhdmUgYSB2YWxpZCB2YWx1ZSB0eXBlXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBzdWJPcHRpb24gVGhlIGludmFsaWQgc3ViLW9wdGlvbidzIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGludmFsaWQgc3ViLW9wdGlvbidzIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihzdWJPcHRpb246IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIENhbGxpbmcgdGhlIHBhcmVudCBjbGFzcyBgVGVtbXlFcnJvcmAuXHJcbiAgICAgICAgc3VwZXIoXCJcIik7XHJcblxyXG4gICAgICAgIC8vIENvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZS5cclxuICAgICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgVGhlIOKAnCR7c3ViT3B0aW9ufeKAnSBzdWItb3B0aW9uIGRvZXNuJ3QgYWNjZXB0IHZhbHVlcyBvZiB0eXBlIOKAnCR7dHlwZX3igJ1gO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHN1Yk9wdGlvbi5sZW5ndGggPiAwIHx8IHR5cGUubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIHN1Yi1vcHRpb25cclxuICogaXMgbm90IG9mIGEgdmFsaWQgdmFsdWUuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRTdWJPcHRpb25WYWx1ZUVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkludmFsaWRTdWJPcHRpb25WYWx1ZUVycm9yXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIkEgc3ViLW9wdGlvbiBkb2Vzbid0IGhhdmUgYSB2YWxpZCB2YWx1ZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gc3ViT3B0aW9uIFRoZSBpbnZhbGlkIHN1Yi1vcHRpb24ncyBuYW1lLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnZhbGlkIHN1Yi1vcHRpb24ncyB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Ioc3ViT3B0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcihcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gQ29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGBUaGUg4oCcJHtzdWJPcHRpb2594oCdIHN1Yi1vcHRpb24gZG9lc24ndCBhY2NlcHQg4oCcJHt2YWx1ZX3igJ0gYXMgYSB2YWx1ZWA7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gc3ViT3B0aW9uLmxlbmd0aCA+IDAgfHwgdmFsdWUubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIFxyXG4gKiBmcm9tIG9wdGlvbiBpcyBub3QgdmFsaWRcclxuICovXHJcblxyXG5cclxuaW1wb3J0IFRlbW15RXJyb3IgZnJvbSBcIi4uL21vZGVscy9UZW1teUVycm9yXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52YWxpZFJlZmVyZW5jaW5nT3B0aW9uRXJyb3IgZXh0ZW5kcyBUZW1teUVycm9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiSW52YWxpZFJlZmVyZW5jaW5nT3B0aW9uRXJyb3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9IFwiQSByZWZlcmVuY2luZyBvcHRpb24gaXMgbm90IHZhbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgYFRlbW15RXJyb3JgLlxyXG4gICAgICAgIHN1cGVyKFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIFxyXG4gKiByZWYgb3B0aW9uIHN0YXJ0cyB3aXRoIHRoZSBzeW1ib2xlIOKAnEDigJ0uXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRSZWZlcmVuY2VPcHRpb25WYWx1ZUVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkludmFsaWRSZWZlcmVuY2VPcHRpb25WYWx1ZUVycm9yXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcgPSBcIuKAnHJlZuKAnSBvcHRpb25zIG11c3Qgbm90IGJlZ2luIHdpdGggdGhlIOKAnEDigJ0gc3ltYm9sXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgYFRlbW15RXJyb3JgLlxyXG4gICAgICAgIHN1cGVyKFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIHJlZiBvcHRpb25cclxuICogcmVmZXJlbmNlcyBhbiBpbnZhbGlkIG9iamVjdC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IFRlbW15RXJyb3IgZnJvbSBcIi4uL21vZGVscy9UZW1teUVycm9yXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52YWxpZFJlZmVyZW5jZUVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIkludmFsaWRSZWZlcmVuY2VFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBIHJlZmVyZW5jZSBpcyBpbnZhbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIGludmFsaWQgcmVmZXJlbmNlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2U6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgYFRlbW15RXJyb3JgLlxyXG4gICAgICAgIHN1cGVyKFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHJlZmVyZW5jZS5sZW5ndGggPiAwID8gYOKAnCR7cmVmZXJlbmNlfeKAnSBpcyBhbiBpbnZhbGlkIHJlZmVyZW5jZWAgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIHRlbXBsYXRlXHJcbiAqIGlzIGludmFsaWQgKGRvZXNuJ3QgaGF2ZSBhIOKAnHJlZuKAnSBvcHRpb24pLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgVGVtbXlFcnJvciBmcm9tIFwiLi4vbW9kZWxzL1RlbW15RXJyb3JcIjtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkVGVtcGxhdGVFcnJvciBleHRlbmRzIFRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJJbnZhbGlkVGVtcGxhdGVFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBIHRlbXBsYXRlIGRvZXMgbm90IGhhdmUgYSDigJxyZWbigJ0gb3B0aW9uXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIENhbGxpbmcgdGhlIHBhcmVudCBjbGFzcyBgVGVtbXlFcnJvcmAuXHJcbiAgICAgICAgc3VwZXIoXCJcIik7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogSGVyZSBnb2VzJ3MgZXZlcnl0aGluZyB0aGF0IElELWZpZXNcclxuICogYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgaGllcmFyY2h5IG9iamVjdC5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IHsgSGllcmFyY2h5IH0gZnJvbSBcIi4vbW9kZWxzL0hpZXJhcmNoeVwiO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuL21vZGVscy9UZW1wbGF0ZVwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBBc3NpZ25zIHRlbW1lSWRzIHRvIGEgaGllcmFyY2h5IG9iamVjdC5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdG8gYXNzaW5nIGEgdGVtbWVJZCB0by5cclxuICogQHBhcmFtIHRlbW1lSWRzIFRoZSBzZXJpZXMgb2YgdGVtbWVJZHMgbGVhZGluZyB0byB0aGUgY3VycmVudCBoaWVyYXJjaHkgb2JqZWN0LlxyXG4gKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSBvZiB0aGUgdGVtbWVJZCwgaWYgaXQncyBmYWxzZSwgdGhlIHRlbW1lSWQgd2lsbCBiZSBvZiA2IGNoYXJhY3RlcnNcclxuICogaW5kaWNhdGluZyBpdCdzIGEgaGllcmFyY2h5IG9iamVjdCwgaWYgaXQncyB0cnVlLCBpdCdsbCBoYXZlIDQgY2hhcmFjdGVycyBpbmRpY2F0aW5nIGl0J3NcclxuICogYSB0ZW1wbGF0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpZGZ5KGhpZXJhcmNoeTogYW55LCB0ZW1tZUlkczogQXJyYXk8c3RyaW5nPiA9IFtdLCBtb2RlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gR2VuZXJhdGluZyBhIHRlbW1lIElkLlxyXG4gICAgICAgIGNvbnN0IHRlbW1lSWQ6IHN0cmluZyA9IGdlbmVyYXRlVGVtbWVJZChtb2RlKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBc3NpZ25pbmcgYSB0ZW1tZUlkLlxyXG4gICAgICAgIGhpZXJhcmNoeS50ZW1tZUlkcyA9IFsuLi50ZW1tZUlkcywgdGVtbWVJZF07XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgb2YgdGhlIGhpZXJhcmNoeSBvYmplY3QgaGFzIGFueSBjaGlsZHJlbi5cclxuICAgICAgICBpZiAoJ2NoaWxkTm9kZXMnIGluIGhpZXJhcmNoeSkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQ6IE9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZGZ5KGNoaWxkLCBoaWVyYXJjaHkudGVtbWVJZHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvLyBDaGVja2luZyBvZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IHRlbXBsYXRlcy5cclxuICAgICAgICBpZiAoJ3RlbXBsYXRlcycgaW4gaGllcmFyY2h5KSB7XHJcbiAgICBcclxuICAgICAgICAgICAgaGllcmFyY2h5LnRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZTogT2JqZWN0KSA9PiB7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlkZnkodGVtcGxhdGUsIGhpZXJhcmNoeS50ZW1tZUlkcywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSB0ZW1tZUlkIG9mIGEgaGllcmFyY2h5IG9yIHRlbXBsYXRlIG9iamVjdC5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIHRlbW1lSWQgb2YuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtbWVJZCAoaGllcmFyY2h5OiBIaWVyYXJjaHkgfCBUZW1wbGF0ZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gaGllcmFyY2h5LnRlbW1lSWRzW2hpZXJhcmNoeS50ZW1tZUlkcy5sZW5ndGggLSAxXTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgdGVtbWVJZC5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVGVtbWVJZChtb2RlOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBjb25zdFxyXG4gICAgICAgIGNoYXJzID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcclxuICAgICAgICBtYXggPSAobW9kZSA9PT0gZmFsc2UpID8gNiA6IDQ7XHJcblxyXG4gICAgbGV0IGtleSA9ICcnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpPG1heDsgaSsrKSB7XHJcblxyXG4gICAgICAgIGNvbnN0XHJcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpLFxyXG4gICAgICAgICAgICB1cHBlcmNhc2UgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKTtcclxuXHJcbiAgICAgICAga2V5ICs9IHVwcGVyY2FzZSA9PT0gMSA/IGNoYXJzW2luZGV4XS50b1VwcGVyQ2FzZSgpIDogY2hhcnNbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBrZXk7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBlcnJvciB0aHJvd24gd2hlbiBhIHRlbXBsYXRlXHJcbiAqIGhhcyBpcyByZWZlcmVuY2luZyBhIG5vbi10ZW1wbGF0ZSBvYmplY3QuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRUZW1wbGF0ZVJlZmVyZW5jaW5nRXJyb3IgZXh0ZW5kcyBUZW1teUVycm9yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyA9IFwiSW52YWxpZFRlbXBsYXRlUmVmZXJlbmNpbmdFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJUZW1wbGF0ZXMgY2FuIG9ubHkgcmVmZXJlbmNlIG90aGVyIHRlbXBsYXRlcy5cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdGVtcGxhdGUncyByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSByZWZlcmVuY2UgdGFyZ2V0LlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihyZWY6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcihcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gQ29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGBUaGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVmZXJlbmNlIOKAnCR7cmVmfeKAnSBpcyB0cnlpbmcgdG8gcmVmZXJlbmNlIOKAnCR7dGFyZ2V0feKAnSBhIG5vbi10ZW1wbGF0ZSBvYmplY3RgO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHJlZi5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGEgYSBoaWVyYXJjaHkgb2JqZWN5XHJcbiAqIGlzIHJlZmVyZW5jaW5nIGFuIGVsZW1lbnQgb3V0IG9mIGl0cyBzY29wZS5cclxuICovXHJcblxyXG5cclxuaW1wb3J0IFRlbW15RXJyb3IgZnJvbSBcIi4uL21vZGVscy9UZW1teUVycm9yXCI7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmZXJlbmNlT3V0T2ZTY29wZUVycm9yIGV4dGVuZHMgVGVtbXlFcnJvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIlJlZmVyZW5jZU91dE9mU2NvcGVFcnJvclwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCJBbiBvYmplY3QgaXMgcmVmZXJlbmNpbmcgYW4gZWxlbWVudCBvdXQgb2YgaXRzIHNjb3BlXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBDYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgYFRlbW15RXJyb3JgLlxyXG4gICAgICAgIHN1cGVyKFwiXCIpO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgZXJyb3IncyBtZXNzYWdlLlxyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UubGVuZ3RoID4gMCA/IG1lc3NhZ2UgOiB0aGlzLm1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIFRoZSBtb2R1bGUgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgdGhlIGlucHV0LlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgT3B0aW9uLCB7IElLZXlzIH0gZnJvbSBcIi4vbW9kZWxzL09wdGlvblwiO1xyXG5pbXBvcnQgeyBvcHRpb25zLCBmb3JiaWRkZW5PcHRpb25zLCBnZXRTdWJPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xyXG5pbXBvcnQgSW52YWxpZFRlbXBsYXRlT3B0aW9uRXJyb3IgZnJvbSBcIi4vZXJyb3JzL0ludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkT3B0aW9uTmFtZUVycm9yIGZyb20gXCIuL2Vycm9ycy9JbnZhbGlkT3B0aW9uTmFtZUVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkT3B0aW9uVHlwZUVycm9yIGZyb20gXCIuL2Vycm9ycy9JbnZhbGlkT3B0aW9uVHlwZUVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkT3B0aW9uVmFsdWVFcnJvciBmcm9tIFwiLi9lcnJvcnMvSW52YWxpZE9wdGlvblZhbHVlRXJyb3JcIjtcclxuaW1wb3J0IEludmFsaWRTdWJPcHRpb25OYW1lRXJyb3IgZnJvbSBcIi4vZXJyb3JzL0ludmFsaWRTdWJPcHRpb25OYW1lRXJyb3JcIjtcclxuaW1wb3J0IEludmFsaWRTdWJPcHRpb25UeXBlRXJyb3IgZnJvbSBcIi4vZXJyb3JzL0ludmFsaWRTdWJPcHRpb25UeXBlRXJyb3JcIjtcclxuaW1wb3J0IEludmFsaWRTdWJPcHRpb25WYWx1ZUVycm9yIGZyb20gXCIuL2Vycm9ycy9JbnZhbGlkU3ViT3B0aW9uVmFsdWVFcnJvclwiO1xyXG5pbXBvcnQgSW52YWxpZFJlZmVyZW5jaW5nT3B0aW9uRXJyb3IgZnJvbSBcIi4vZXJyb3JzL0ludmFsaWRSZWZlcmVuY2luZ09wdGlvbkVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkUmVmZXJlbmNlT3B0aW9uVmFsdWVFcnJvciBmcm9tIFwiLi9lcnJvcnMvSW52YWxpZFJlZmVyZW5jZU9wdGlvblZhbHVlRXJyb3JcIjtcclxuaW1wb3J0IEludmFsaWRSZWZlcmVuY2VFcnJvciBmcm9tIFwiLi9lcnJvcnMvSW52YWxpZFJlZmVyZW5jZUVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkVGVtcGxhdGVFcnJvciBmcm9tIFwiLi9lcnJvcnMvSW52YWxpZFRlbXBsYXRlRXJyb3JcIjtcclxuaW1wb3J0IHsgUmVmZXJlbmNlVHlwZSB9IGZyb20gXCIuL3JlZmVyZW5jZXJcIjtcclxuaW1wb3J0IHsgZ2V0VGVtbWVJZCB9IGZyb20gXCIuL2lkZmllclwiO1xyXG5pbXBvcnQgeyBIaWVyYXJjaHkgfSBmcm9tIFwiLi9tb2RlbHMvSGllcmFyY2h5XCI7XHJcbmltcG9ydCBJbnZhbGlkVGVtcGxhdGVSZWZlcmVuY2luZ0Vycm9yIGZyb20gXCIuL2Vycm9ycy9JbnZhbGlkVGVtcGxhdGVSZWZlcmVuY2luZ0Vycm9yXCI7XHJcbmltcG9ydCBSZWZlcmVuY2VPdXRPZlJhbmdlRXJyb3IgZnJvbSBcIi4vZXJyb3JzL1JlZmVyZW5jZU91dE9mU2NvcGVFcnJvclwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgaGllcmFyY2h5IG9iamVjdC5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIG9iamVjdCB0byBjaGVjay5cclxuICovXHJcbmV4cG9ydCBjb25zdCBpc1ZhbGlkSGllcmFyY2h5ID0gKGhpZXJhcmNoeTogT2JqZWN0KTogYm9vbGVhbiA9PiBoaWVyYXJjaHkgIT0gbnVsbCAmJiB0eXBlb2YgaGllcmFyY2h5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShoaWVyYXJjaHkpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgSFRNTCBlbGVtZW50LlxyXG4gKiBcclxuICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzVmFsaWRIVE1MRWxlbWVudCA9ICh0YXJnZXQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiA9PiB0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcclxuXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHRoZSBvcHRpb25zIGluIGEgaGllcmFyY2h5IG9iamVjdCBmb3IgYW55XHJcbiAqIG9wdGlvbnMgaXQgaGFzIG9yIHZhbHVlcyBpdCBjb250YWlucy5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdG8gdmFsaWRhdGUgdGhlIG9wdGlvbnMgZm9yLlxyXG4gKiBcclxuICogQHRocm93cyBJbnZhbGlkT3B0aW9uTmFtZUVycm9yLCBJbnZhbGlkT3B0aW9uVHlwZUVycm9yLCBJbnZhbGlkT3B0aW9uVmFsdWVFcnJvciwgSW52YWxpZFN1Yk9wdGlvbk5hbWVFcnJvciwgSW52YWxpZFN1Yk9wdGlvblR5cGVFcnJvciwgSW52YWxpZFN1Yk9wdGlvblZhbHVlRXJyb3IsIEludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKGhpZXJhcmNoeTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gTG9vcGluZyB0aHJvdWdoIHRoZSBoaWVyYXJjaHkncyBvcHRpb25zLlxyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIGluIGhpZXJhcmNoeSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3RcclxuICAgICAgICAgICAgICAgIG1hdGNoaW5nT3B0aW9uOiBPcHRpb24gPSA8T3B0aW9uPm9wdGlvbnMuZmlsdGVyKChvcHQ6IE9wdGlvbikgPT4gb3B0LmxhYmVsID09PSBvcHRpb24pWzBdLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU6IGFueSA9IGhpZXJhcmNoeVtvcHRpb25dO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGluZyB0aGUgb3B0aW9uJ3MgbmFtZS5cclxuICAgICAgICAgICAgaWYgKE9wdGlvbi52YWxpZGF0ZU9wdGlvbk5hbWUobWF0Y2hpbmdPcHRpb24pID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25OYW1lRXJyb3Iob3B0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGluZyB0aGUgb3B0aW9uJ3MgdHlwZS5cclxuICAgICAgICAgICAgY29uc3QgdHlwZVZhbGlkYXRpb246IHsgdmFsaWQ6IGJvb2xlYW4sIHR5cGU6IHN0cmluZyB9ID0gT3B0aW9uLnZhbGlkYXRlT3B0aW9uVHlwZShvcHRpb25WYWx1ZSwgbWF0Y2hpbmdPcHRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uLnZhbGlkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25UeXBlRXJyb3Iob3B0aW9uLCB0eXBlVmFsaWRhdGlvbi50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGluZyB0aGUgb3B0aW9uJ3MgdmFsdWUuXHJcbiAgICAgICAgICAgIGlmIChPcHRpb24udmFsaWRhdGVPcHRpb25WYWx1ZShvcHRpb25WYWx1ZSwgbWF0Y2hpbmdPcHRpb24pID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcHRpb25WYWx1ZUVycm9yKG9wdGlvbiwgb3B0aW9uVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBlYXRpbmcgdGhlIHNhbWUgY2hlY2sgZm9yIG9wdGlvbnMgdGhhdCBoYXZlIGtleXMuXHJcbiAgICAgICAgICAgIGlmICgna2V5cycgaW4gbWF0Y2hpbmdPcHRpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBvcHRpb24ncyBzdWItb3B0aW9ucy5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk9wdGlvbnMgPSAoPElLZXlzPm1hdGNoaW5nT3B0aW9uKS5rZXlzO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpbmcgdGhlIHN1Yi1vcHRpb25zLlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVTdWJPcHRpb25zKG9wdGlvbiwgb3B0aW9uVmFsdWUsIHN1Yk9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxpZGF0aW5nIHJlZmVyZW5jZXMuXHJcbiAgICAgICAgaWYgKHZhbGlkYXRlUmVmZXJlbmNpbmdPcHRpb24oaGllcmFyY2h5KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZWZlcmVuY2luZ09wdGlvbkVycm9yKFwiVGhlIOKAnGZyb23igJ0gb3B0aW9uIG11c3QgYWx3YXlzIGhhdmUgYSDigJxyZWbigJ0gc3ViLW9wdGlvblwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWxpZGF0ZVJlZmVyZW5jaW5nUmFuZ2UoaGllcmFyY2h5KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZWZlcmVuY2luZ09wdGlvbkVycm9yKFwiVGhlIOKAnGZyb23igJ0gb3B0aW9uIGNhbid0IGhhdmUgYm90aCB0aGUg4oCcaW5jbHVkZeKAnSBhbmQg4oCcZXhjbHVkZeKAnSBzdWItb3B0aW9ucyBhdCB0aGUgc2FtZSB0aW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIGhpZXJhcmNoeSBvYmplY3QgY29udGFpbnMgYW55IHRlbXBsYXRlcy5cclxuICAgICAgICBpZiAoJ3RlbXBsYXRlcycgaW4gaGllcmFyY2h5KSB7XHJcblxyXG4gICAgICAgICAgICBoaWVyYXJjaHkudGVtcGxhdGVzLmZvckVhY2goKHRlbXBsYXRlOiBPYmplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlVGVtcGxhdGVzKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXBlYXRpbmcgdGhlIHNhbWUgY2hlY2sgZm9yIHRoZSBoaWVyYXJjaHkncyBjaGlsZHJlbi5cclxuICAgICAgICBpZiAoJ2NoaWxkTm9kZXMnIGluIGhpZXJhcmNoeSkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQ6IE9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVPcHRpb25zKGNoaWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhlIHRlbXBsYXRlcyBpbiBhIGhpZXJhcmNoeSBvYmplY3QuXHJcbiAqIFxyXG4gKiBAcGFyYW0gdGVtcGxhdGUgVGhlIHRlbXBsYXRlIG9iamVjdCB0byB2YWxpZGF0ZS5cclxuICogXHJcbiAqIEB0aHJvd3MgSW52YWxpZE9wdGlvbk5hbWVFcnJvciwgSW52YWxpZE9wdGlvblR5cGVFcnJvciwgSW52YWxpZE9wdGlvblZhbHVlRXJyb3IsIEludmFsaWRTdWJPcHRpb25OYW1lRXJyb3IsIEludmFsaWRTdWJPcHRpb25UeXBlRXJyb3IsIEludmFsaWRTdWJPcHRpb25WYWx1ZUVycm9yLCBJbnZhbGlkVGVtcGxhdGVFcnJvciwgSW52YWxpZFRlbXBsYXRlT3B0aW9uRXJyb3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlbXBsYXRlcyh0ZW1wbGF0ZTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKCEoJ3JlZicgaW4gdGVtcGxhdGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGVtcGxhdGVFcnJvcihcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExvb3BpbmcgdGhyb3VnaCB0aGUgb3B0aW9ucyBvZiB0aGUgdGVtcGxhdGUuXHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gaW4gdGVtcGxhdGUpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSB0ZW1wbGF0ZSBjb250YWlucyBhbnkgaW52YWxpZCBvcHRpb25zLlxyXG4gICAgICAgICAgICBpZiAoZm9yYmlkZGVuT3B0aW9ucy5pbmRleE9mKG9wdGlvbikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUZW1wbGF0ZU9wdGlvbkVycm9yKG9wdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZU9wdGlvbnModGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIGhpZXJhcmNoeSBvYmplY3QuXHJcbiAqIFxyXG4gKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRvIHZhbGlkYXRlIHRoZSByZWZlcmVuY2VzIGZvci5cclxuICogQHBhcmFtIHJlZmVyZW5jZXMgVGhlIHZhbGlkIHJlZmVybmNlcy5cclxuICogXHJcbiAqIEB0aHJvd3MgSW52YWxpZFJlZmVyZW5jZUVycm9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZWZlcmVuY2VzKGhpZXJhcmNoeTogYW55LCByZWZlcmVuY2VzOiBBcnJheTxSZWZlcmVuY2VUeXBlPik6IHZvaWQge1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSDigJxyZWbigJ0gb3B0aW9uIHN0YXJ0cyB3aXRoIHRoZSDigJxA4oCdIHN5bWJvbC5cclxuICAgICAgICBpZiAoaGllcmFyY2h5LnJlZlswXSA9PT0gJ0AnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVmZXJlbmNlT3B0aW9uVmFsdWVFcnJvcihcIlwiKTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBvYmplY3QgaXMgcmVmZXJlbmNpbmcgYW4gb3V0ZXIgZWxlbWVudC5cclxuICAgICAgICBpZiAoaGllcmFyY2h5LmZyb20ucmVmWzBdID09PSAnQCcpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc3RyaW5nID0gKDxzdHJpbmc+aGllcmFyY2h5LmZyb20ucmVmKS5zdWJzdHJpbmcoMSksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVmZXJlbmNlT3B0aW9uVmFsdWVFcnJvcihgTm8gb3V0ZXIgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgc2VsZWN0b3Ig4oCcJHtzZWxlY3Rvcn3igJ1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvLyBDaGVja2luZyBvZiB0aGUgcmVmZXJlbmNlIGV4aXN0cy5cclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlUmVmZXJlbmNlKGhpZXJhcmNoeSwgcmVmZXJlbmNlcykgPT09IGZhbHNlICYmIGhpZXJhcmNoeS5mcm9tLnJlZiAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZWZlcmVuY2VFcnJvcihoaWVyYXJjaHkuZnJvbS5yZWYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLlxyXG4gICAgICAgIGlmICgnY2hpbGROb2RlcycgaW4gaGllcmFyY2h5ICYmIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkOiBIaWVyYXJjaHkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZXMoY2hpbGQsIHJlZmVyZW5jZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBoaWVyYXJjaHkgb2JqZWN0IGhhcyBhbnkgdGVtcGxhdGVzLlxyXG4gICAgICAgIGlmICgndGVtcGxhdGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LnRlbXBsYXRlcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBoaWVyYXJjaHkudGVtcGxhdGVzLmZvckVhY2goKHRlbXBsYXRlOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZXModGVtcGxhdGUsIHJlZmVyZW5jZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyBhIHBhc3NlZCByZWZlcmVuY2UuXHJcbiAqIFxyXG4gKiBAcGFyYW0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgdG8gdmFsaWRhdGUuXHJcbiAqIEBwYXJhbSByZWZlcmVuY2VzIFRoZSB2YWxpZCByZWZlcmVuY2VzLlxyXG4gKi9cclxuY29uc3QgdmFsaWRhdGVSZWZlcmVuY2UgPSAoaGllcmFyY2h5OiBhbnksIHJlZmVyZW5jZXM6IEFycmF5PFJlZmVyZW5jZVR5cGU+KTogYm9vbGVhbiA9PiByZWZlcmVuY2VzLmZpbHRlcigocmVmOiBSZWZlcmVuY2VUeXBlKSA9PiByZWYuaGllcmFyY2h5LnJlZiA9PT0gaGllcmFyY2h5LmZyb20ucmVmICYmIGdldFRlbW1lSWQoaGllcmFyY2h5KSAhPT0gZ2V0VGVtbWVJZChyZWYuaGllcmFyY2h5KSlbMF0gIT0gbnVsbDtcclxuXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGVtcGxhdGVzIGFyZSByZWZlcmVuY2luZyBub24tdGVtcGxhdGUgZWxlbWVudFxyXG4gKiBvciBub3QsIGluIHdoaWNoIGNhc2UsIGFuIGVycm9yIGlzIHRocm93bi5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSB0byB2YWxpZGF0ZSB0aGUgdGVtcGxhdGUgaW5oZXJpdGFuY2UgZm9yLlxyXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBUaGVyZSB2YWxpZCByZWZlcmVuY2VzLlxyXG4gKiBcclxuICogQHRocm93cyBJbnZhbGlkVGVtcGxhdGVSZWZlcmVuY2luZ0Vycm9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZVJlZmVyZW5jZShoaWVyYXJjaHk6IGFueSwgcmVmZXJlbmNlczogQXJyYXk8UmVmZXJlbmNlVHlwZT4pOiB2b2lkIHtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgICAvLyBHZXR0aW5nIHRoZSB0ZW1wbGF0ZXMuXHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gaGllcmFyY2h5LnRlbXBsYXRlcztcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSB2YWxpZCB0ZW1wbGF0ZXMuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGU6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSB0ZW1wbGF0ZSdzIHJlZmVyZW5jaW5nIHZhbHVlIGlzIHZhbGlkLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmZyb20ucmVmLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQ6IGFueSA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWY6IFJlZmVyZW5jZVR5cGUpID0+ICg8SGllcmFyY2h5PnJlZi5oaWVyYXJjaHkpLnJlZiA9PT0gdGVtcGxhdGUuZnJvbS5yZWYpWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RlbXBsYXRlOiBib29sZWFuID0gZ2V0VGVtbWVJZChyZWZlcmVuY2VkRWxlbWVudC5oaWVyYXJjaHkpLmxlbmd0aCA9PT0gNDtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RlbXBsYXRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGVtcGxhdGVSZWZlcmVuY2luZ0Vycm9yKHRlbXBsYXRlLnJlZiwgdGVtcGxhdGUuZnJvbS5yZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoaWVyYXJjaHkuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YWxpZGF0ZVRlbXBsYXRlUmVmZXJlbmNlKGNoaWxkLCByZWZlcmVuY2VzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoKGUpXHJcbiAgICB7XHJcblxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHdoZXRoZXIgYSBoaWVyYXJjaHkgb2JqZWN0IGlzIHJlZmVyZW5jaW5nIGl0cyBjaGlsZC5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSB0byB2YWxpZGF0ZS5cclxuICogQHBhcmFtIHJlZmVyZW5jZXMgVGhlcmUgdmFsaWQgcmVmZXJlbmNlcy5cclxuICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgdmFsaWRhdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcmVudFRvQ2hpbGRSZWZlcmVuY2UoaGllcmFyY2h5OiBhbnksIHJlZmVyZW5jZXM6IEFycmF5PFJlZmVyZW5jZVR5cGU+LCBkZXB0aDogbnVtYmVyID0gMCk6IHZvaWQge1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZjogc3RyaW5nID0gaGllcmFyY2h5LmZyb20ucmVmO1xyXG5cclxuICAgICAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIGRlcHRoXHJcbiAgICAgICAgZGVwdGgrKztcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHJlZmVyZW5jZSBpcyB2YWxpZC5cclxuICAgICAgICBpZiAocmVmICE9PSBcIlwiICYmIHJlZlswXSAhPT0gJ0AnKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSByZWZlcmVuY2VkIGhpZXJhcmNoeS5cclxuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlZEhpZXJhcmNoeTogUmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZPYmplY3Q6IFJlZmVyZW5jZVR5cGUpID0+ICg8SGllcmFyY2h5PnJlZk9iamVjdC5oaWVyYXJjaHkpLnJlZiA9PT0gcmVmICYmIGRlcHRoID49IHJlZk9iamVjdC5kZXB0aClbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlZEhpZXJhcmNoeSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlT3V0T2ZSYW5nZUVycm9yKFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLlxyXG4gICAgICAgIGlmICgnY2hpbGROb2RlcycgaW4gaGllcmFyY2h5ICYmIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkOiBIaWVyYXJjaHkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhcmVudFRvQ2hpbGRSZWZlcmVuY2UoY2hpbGQsIHJlZmVyZW5jZXMsIGRlcHRoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IHRlbXBsYXRlcy5cclxuICAgICAgICBpZiAoJ3RlbXBsYXRlcycgaW4gaGllcmFyY2h5ICYmIGhpZXJhcmNoeS50ZW1wbGF0ZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5LnRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZTogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVQYXJlbnRUb0NoaWxkUmVmZXJlbmNlKHRlbXBsYXRlLCByZWZlcmVuY2VzLCBkZXB0aCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxuICAgIGNhdGNoKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhlIHN1Yi1vcHRpb25zIG9mIGFub3RoZXIgb3B0aW9uLlxyXG4gKiBAcGFyYW0gb3B0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIHZhbGlkYXRlIHRoZSBzdWItb3B0aW9ucyBmb3IuIFxyXG4gKiBAcGFyYW0gb3B0aW9uVmFsdWUgVGhlIHN1Yi1vcHRpb25zIHRvIHZhbGlkYXRlLlxyXG4gKiBAcGFyYW0gc3ViT3B0aW9ucyBUaGUgZXhwZWN0ZWQgc3ViLW9wdGlvbnMuXHJcbiAqL1xyXG5mdW5jdGlvbiB2YWxpZGF0ZVN1Yk9wdGlvbnMob3B0aW9uTmFtZTogc3RyaW5nLCBvcHRpb25WYWx1ZTogYW55LCBzdWJPcHRpb25zOiBJS2V5cyk6IHZvaWQge1xyXG5cclxuICAgIC8vIExvb3BpbmcgdGhyb3VnaCB0aGUgZXhwZWN0ZWQgc3ViLW9wdGlvbnMuXHJcbiAgICBmb3IgKGNvbnN0IHN1Yk9wdGlvbiBpbiBvcHRpb25WYWx1ZSkge1xyXG5cclxuICAgICAgICBjb25zdFxyXG4gICAgICAgICAgICBtYXRjaGluZ1N1Yk9wdGlvbjogT3B0aW9uID0gZ2V0U3ViT3B0aW9ucyhvcHRpb25OYW1lKS5maWx0ZXIoKHN1Yk9wdGlvbnM6IE9wdGlvbikgPT4gc3ViT3B0aW9ucy5sYWJlbCA9PT0gc3ViT3B0aW9uKVswXSxcclxuICAgICAgICAgICAgc3ViT3B0aW9uVmFsdWU6IGFueSA9IG9wdGlvblZhbHVlW3N1Yk9wdGlvbl07XHJcblxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIGEgc3ViLW9wdGlvbiBpcyBpbiB0aGUgcGFyZW50IG9wdGlvbi5cclxuICAgICAgICBpZiAoc3ViT3B0aW9uIGluIHN1Yk9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIFZhbGlkYXRpbmcgdGhlIHN1Yi1vcHRpb24ncyBuYW1lLlxyXG4gICAgICAgICAgICBpZiAoT3B0aW9uLnZhbGlkYXRlT3B0aW9uTmFtZShtYXRjaGluZ1N1Yk9wdGlvbikgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFN1Yk9wdGlvbk5hbWVFcnJvcihvcHRpb25OYW1lLCBzdWJPcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBWYWxpZGF0aW5nIHRoZSBzdWItb3B0aW9ucydzIGRhdGEgdHlwZS5cclxuICAgICAgICAgICAgY29uc3QgdHlwZVZhbGlkYXRpb246IHsgdmFsaWQ6IGJvb2xlYW4sIHR5cGU6IHN0cmluZyB9ID0gT3B0aW9uLnZhbGlkYXRlT3B0aW9uVHlwZShzdWJPcHRpb25WYWx1ZSwgbWF0Y2hpbmdTdWJPcHRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uLnZhbGlkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdWJPcHRpb25UeXBlRXJyb3Ioc3ViT3B0aW9uLCB0eXBlVmFsaWRhdGlvbi50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGluZyB0aGUgc3ViLW9wdGlvbidzIHZhbHVlLlxyXG4gICAgICAgICAgICBpZiAoT3B0aW9uLnZhbGlkYXRlT3B0aW9uVmFsdWUoc3ViT3B0aW9uVmFsdWUsIG1hdGNoaW5nU3ViT3B0aW9uKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkU3ViT3B0aW9uVmFsdWVFcnJvcihzdWJPcHRpb24sIHN1Yk9wdGlvblZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCdrZXlzJyBpbiBtYXRjaGluZ1N1Yk9wdGlvbikge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG9wdGlvbidzIHN1Yi1vcHRpb25zLlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViT3B0aW9uVmFsdWUgPSBvcHRpb25WYWx1ZVtzdWJPcHRpb25dO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlU3ViT3B0aW9ucyhzdWJPcHRpb24sIHN1Yk9wdGlvblZhbHVlLCAoPElLZXlzPm1hdGNoaW5nU3ViT3B0aW9uKS5rZXlzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTdWJPcHRpb25OYW1lRXJyb3Iob3B0aW9uTmFtZSwgc3ViT3B0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHRoZSByZWZlcmVuY2VzIGluIGEgaGllcmFyY2h5IG9iamVjdC5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdG8gdmFsaWRhdGUgdGhlIHJlZmVyZW5jZXMgZm9yLlxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVSZWZlcmVuY2luZ09wdGlvbihoaWVyYXJjaHk6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICgnZnJvbScgaW4gaGllcmFyY2h5KSB7XHJcblxyXG4gICAgICAgIHJldHVybiAncmVmJyBpbiBoaWVyYXJjaHkuZnJvbTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhlIHJlZmVyZW5jZXMgaW4gYSBoaWVyYXJjaHkgb2JqZWN0LlxyXG4gKiBcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0byB2YWxpZGF0ZSB0aGUgcmVmZXJlbmNlcyBmb3IuXHJcbiAqL1xyXG5mdW5jdGlvbiB2YWxpZGF0ZVJlZmVyZW5jaW5nUmFuZ2UoaGllcmFyY2h5OiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoJ2Zyb20nIGluIGhpZXJhcmNoeSkge1xyXG5cclxuICAgICAgICByZXR1cm4gISgnaW5jbHVkZScgaW4gaGllcmFyY2h5LmZyb20gJiYgJ2V4Y2x1ZGUnIGluIGhpZXJhcmNoeS5mcm9tKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCIvKipcclxuICogV2hhdCdzIHJlc3BvbnNpYmxlIGZvciBzYW5pdGl6aW5nIHRoZSBpbnB1dFxyXG4gKiBhbmQgcG9wdWxhdGluZyB0aGUgZGVmYXVsdHMuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBPcHRpb24sIHsgSUtleXMgfSBmcm9tIFwiLi9tb2RlbHMvT3B0aW9uXCI7XHJcbmltcG9ydCB7IG9wdGlvbnMsIGZvcmJpZGRlbk9wdGlvbnMgfSBmcm9tIFwiLi9vcHRpb25zXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIFNhbml0aXplcyBhIGhpZXJhcmNoeSBvYmplY3QgaW50byBhbiBhcHJvcHJpYXRlIG9uZS5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoeSBvYmplY3QgdG8gc2FuaXRpemUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemUoaGllcmFyY2h5OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgICAvLyBMb29waW5nIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxyXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0OiBPcHRpb24pID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICghKG9wdC5sYWJlbCBpbiBoaWVyYXJjaHkpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUG9wdWxhdGluZyBhIGRlZmF1bHQuXHJcbiAgICAgICAgICAgICAgICBoaWVyYXJjaHlbb3B0LmxhYmVsXSA9IG9wdC5kZWZhdWx0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNhbml0aXppbmcgdGhlIHN1Yi1vcHRpb24uXHJcbiAgICAgICAgICAgICAgICBpZiAoJ2tleXMnIGluIG9wdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiAoPElLZXlzPm9wdCkua2V5cykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgc3ViLW9wdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViT3B0aW9uOiBPcHRpb24gPSAoPElLZXlzPm9wdCkua2V5c1trZXldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FuaXRpemluZyB0aGUgc3ViLW9wdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemVPcHRpb24oaGllcmFyY2h5Wyg8T3B0aW9uPm9wdCkubGFiZWxdLCBzdWJPcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUmVtb3ZpbmcgZHVwbGljYXRlcy5cclxuICAgICAgICBoaWVyYXJjaHkuY2xhc3NlcyA9IGhpZXJhcmNoeS5jbGFzc2VzLmZpbHRlcigoY2xzOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IGhpZXJhcmNoeS5jbGFzc2VzLmluZGV4T2YoY2xzKSA9PT0gaW5kZXgpO1xyXG5cclxuICAgICAgICAvLyBTb3J0aW5nIHRoZSBjbGFzc2VzLlxyXG4gICAgICAgIGhpZXJhcmNoeS5jbGFzc2VzLnNvcnQoKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIGhpZXJhcmNoeSBoYXMgY2hpbGRyZW4uXHJcbiAgICAgICAgaWYgKCdjaGlsZE5vZGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIHNhbml0aXplKGNoaWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IGhhcyB0ZW1wbGF0ZXMuXHJcbiAgICAgICAgaWYgKCd0ZW1wbGF0ZXMnIGluIGhpZXJhcmNoeSAmJiBoaWVyYXJjaHkudGVtcGxhdGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS50ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGU6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIHNhbml0aXplVGVtcGxhdGUodGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFNhbml0aXplcyBhbiBvcHRpb24uXHJcbiAqIFxyXG4gKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRvIHNhbml0aXplIHRoZSBvcHRpb24gZm9yLlxyXG4gKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdG8gc2FuaXRpemUuXHJcbiAqL1xyXG5mdW5jdGlvbiBzYW5pdGl6ZU9wdGlvbihoaWVyYXJjaHk6IGFueSwgb3B0aW9uOiBPcHRpb24pOiB2b2lkIHtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgICBpZiAoIShvcHRpb24ubGFiZWwgaW4gaGllcmFyY2h5KSkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5W29wdGlvbi5sYWJlbF0gPSBvcHRpb24uZGVmYXVsdDtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5sYWJlbCA9PT0gJ2luY2x1ZGUnIHx8IG9wdGlvbi5sYWJlbCA9PT0gJ2V4Y2x1ZGUnKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBSZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gdGhlIOKAnGluY2x1ZGXigJ0gYW5kIOKAnGV4Y2x1ZGXigJ0gc3ViLW9wdGlvbi5cclxuICAgICAgICAgICAgaGllcmFyY2h5W29wdGlvbi5sYWJlbF0gPSBoaWVyYXJjaHlbb3B0aW9uLmxhYmVsXS5maWx0ZXIoKG9wdDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiBoaWVyYXJjaHlbb3B0aW9uLmxhYmVsXS5pbmRleE9mKG9wdCkgPT09IGluZGV4KTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgLy8gU29ydGluZyB0aGUgdmFsdWVzLlxyXG4gICAgICAgICAgICBoaWVyYXJjaHlbb3B0aW9uLmxhYmVsXS5zb3J0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoJ2tleXMnIGluIG9wdGlvbikge1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gKDxJS2V5cz5vcHRpb24pLmtleXMpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdFxyXG4gICAgICAgICAgICAgICAgICAgIHN1YkhpZXJhcmNoeTogYW55ID0gaGllcmFyY2h5Wyg8T3B0aW9uPm9wdGlvbikubGFiZWxdLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Yk9wdGlvbiA9ICg8SUtleXM+b3B0aW9uKS5rZXlzW2tleV07XHJcblxyXG4gICAgICAgICAgICAgICAgc2FuaXRpemVPcHRpb24oc3ViSGllcmFyY2h5LCBzdWJPcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTYW5pdGl6ZXMgdGVtcGxhdGVzLlxyXG4gKiBcclxuICogQHBhcmFtIHRlbXBsYXRlIFRoZSB0ZW1wbGF0ZSB0byBzYW5pdGl6ZS5cclxuICovXHJcbmZ1bmN0aW9uIHNhbml0aXplVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAgIC8vIExvb3BpbmcgdGhyb3VnaCB0aGUgYWxsb3dlZCBvcHRpb25zIGluIHRlbXBsYXRlcy5cclxuICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uKSA9PiBmb3JiaWRkZW5PcHRpb25zLmluZGV4T2Yob3B0LmxhYmVsKSA9PT0gLTEpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChvcHQ6IE9wdGlvbikgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIG9mIHRoZSB0ZW1wbGF0ZSBkb2Vzbid0IGhhdmUgYSBzYWlkIG9wdGlvbi5cclxuICAgICAgICAgICAgICAgIGlmICghKG9wdC5sYWJlbCBpbiB0ZW1wbGF0ZSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGluZyBhIGRlZmF1bHQuXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVbb3B0LmxhYmVsXSA9IG9wdC5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FuaXRpemluZyB0aGUgc3ViLW9wdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoJ2tleXMnIGluIG9wdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gKDxJS2V5cz5vcHQpLmtleXMpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBzdWItb3B0aW9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViT3B0aW9uOiBPcHRpb24gPSAoPElLZXlzPm9wdCkua2V5c1trZXldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbml0aXppbmcgdGhlIHN1Yi1vcHRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZU9wdGlvbih0ZW1wbGF0ZVsoPE9wdGlvbj5vcHQpLmxhYmVsXSwgc3ViT3B0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBXaGF0IHByb2Nlc3NlcyBhbGwgb2YgdGhlIHJlZmVyZW5jZXMuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCB7IEhpZXJhcmNoeSB9IGZyb20gXCIuL21vZGVscy9IaWVyYXJjaHlcIjtcclxuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi9tb2RlbHMvVGVtcGxhdGVcIjtcclxuaW1wb3J0IHsgdmFsaWRhdGVSZWZlcmVuY2VzLCB2YWxpZGF0ZVRlbXBsYXRlUmVmZXJlbmNlLCB2YWxpZGF0ZVBhcmVudFRvQ2hpbGRSZWZlcmVuY2UgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgZ2V0VGVtbWVJZCB9IGZyb20gXCIuL2lkZmllclwiO1xyXG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xyXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL21vZGVscy9PcHRpb25cIjtcclxuXHJcblxyXG4vKipcclxuICogVGhlIHJlZmVyZW5jZSB0eXBlLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgUmVmZXJlbmNlVHlwZSA9IHsgZGVwdGg6IG51bWJlciwgaGllcmFyY2h5OiBhbnkgfTtcclxuXHJcblxyXG4vKipcclxuICogVGFrZXMgY2FyZSBvZiBhbGwgdGhlIGluaGVyaXRhbmNlIGFuZCByZWZlcmVuY2VzIHN0dWZmLlxyXG4gKiBcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IHRvIHByb2Nlc3MgdGhlIHJlZmVyZW5jZXMgZm9yLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3MoaGllcmFyY2h5OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgICBjb25zdCByZWZlcmVuY2VzOiBBcnJheTxSZWZlcmVuY2VUeXBlPiA9IGdldFJlZmVyZW5jZXMoaGllcmFyY2h5KTtcclxuXHJcbiAgICAgICAgLy8gVmFsaWRhdGluZyBhbGwgb2YgdGhlIHJlZmVyZWNlcy5cclxuICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZXMoaGllcmFyY2h5LCByZWZlcmVuY2VzKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGVtcGxhdGVzIGFyZSBpbmhlcml0aW5nIGhpZXJhcmNoeSBvYmplY3RzLlxyXG4gICAgICAgIHZhbGlkYXRlVGVtcGxhdGVSZWZlcmVuY2UoaGllcmFyY2h5LCByZWZlcmVuY2VzKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgYSBwYXJlbnQgaXMgdHJ5aW5nIHRvIHJlZmVyZW5jZSB0aGVpciBjaGlsZGVybi5cclxuICAgICAgICB2YWxpZGF0ZVBhcmVudFRvQ2hpbGRSZWZlcmVuY2UoaGllcmFyY2h5LCByZWZlcmVuY2VzKTtcclxuXHJcbiAgICAgICAgLy8gUHJvY2Vzc2luZyB0ZW1wbGF0ZSByZWZlcmVuY2VzLlxyXG4gICAgICAgIHByb2Nlc3NUZW1wbGF0ZXMoaGllcmFyY2h5LCByZWZlcmVuY2VzLmZpbHRlcigocmVmOiBSZWZlcmVuY2VUeXBlKSA9PiBpc1RlbXBsYXRlKHJlZi5oaWVyYXJjaHkpKSk7XHJcblxyXG4gICAgICAgIC8vIFByb2Nlc3NpbmcgaGllcmFyY2hpZXMgKG5vbi10ZW1wbGF0ZSkgcmVmZXJlbmNlcy5cclxuICAgICAgICBwcm9jZXNzSGllcmFyY2hpZXMoaGllcmFyY2h5LCByZWZlcmVuY2VzKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgaGllcmFyY2h5IGlzIGEgdGVtcGxhdGUgb3Igbm90LlxyXG4gKiBcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IHRvIGNoZWNrLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGUgPSAoaGllcmFyY2h5OiBhbnkpOiBib29sZWFuID0+IGdldFRlbW1lSWQoaGllcmFyY2h5KS5sZW5ndGggPT09IDQ7XHJcblxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3NlcyBhbGwgb2YgdGhlIHJlZmVyZW5jZXMgZm9yIHRlbXBsYXRlIGhpZXJhcmNoaWVzLlxyXG4gKiBcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IHRoYXQgY29udGFpbiB0ZW1wbGF0ZXMgdG8gcmVmZXJlbmNlLlxyXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBUaGUgdmFsaWQgcmVmZXJlbmNlcy5cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NUZW1wbGF0ZXMoaGllcmFyY2h5OiBhbnksIHJlZmVyZW5jZXM6IEFycmF5PFJlZmVyZW5jZVR5cGU+KTogdm9pZCB7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIGhpZXJhcmNoeSBvYmplY3QgaGFzIGFueSB0ZW1wbGF0ZXMuXHJcbiAgICAgICAgaWYgKCd0ZW1wbGF0ZXMnIGluIGhpZXJhcmNoeSAmJiBoaWVyYXJjaHkudGVtcGxhdGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS50ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGU6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5mcm9tLnJlZiAhPT0gXCJcIikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0ZW1wbGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgcHJvcGVyIG9wdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjogYW55ID0gb3B0aW9ucy5maWx0ZXIoKG9wdDogT3B0aW9uKSA9PiBvcHQubGFiZWwgPT09IGtleSlbMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkSGllcmFyY2h5OiBSZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZjogUmVmZXJlbmNlVHlwZSkgPT4gcmVmLmhpZXJhcmNoeS5yZWYgPT09IHRlbXBsYXRlLmZyb20ucmVmKVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaGVyaXRpbmcgdGhlIHZhbHVlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uaW5oZXJpdCh0ZW1wbGF0ZSwgcmVmZXJlbmNlZEhpZXJhcmNoeS5oaWVyYXJjaHlba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBoaWVyYXJjaHkgb2JqZWN0IGhhcyBhbnkgY2hpbGRyZW4uXHJcbiAgICAgICAgaWYgKCdjaGlsZE5vZGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQ6IEhpZXJhcmNoeSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIHByb2Nlc3NUZW1wbGF0ZXMoY2hpbGQsIHJlZmVyZW5jZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFByb2Nlc3NlcyBhbGwgb2YgdGhlIHJlZmVyZW5jZXMgZm9yIGhpZXJhcmNoeSBvYmplY3RzIChub24tdGVtcGxhdGVzKS5cclxuICogXHJcbiAqIEBwYXJhbSBoaWVyYXJjaHkgVGhlIGhpZXJhcmNoaWVzIHRvIHJlZmVyZW5jZS5cclxuICogQHBhcmFtIHJlZmVyZW5jZSBUaGUgdmFsaWQgcmVmZXJlbmNlcy5cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NIaWVyYXJjaGllcyhoaWVyYXJjaHk6IGFueSwgcmVmZXJlbmNlczogQXJyYXk8UmVmZXJlbmNlVHlwZT4pOiB2b2lkIHtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLlxyXG4gICAgICAgIGlmICgnY2hpbGROb2RlcycgaW4gaGllcmFyY2h5ICYmIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIGhpZXJhcmNoeS5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkOiBIaWVyYXJjaHkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzSGllcmFyY2hpZXMoY2hpbGQsIHJlZmVyZW5jZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoaWVyYXJjaHkuZnJvbS5yZWYgIT09IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIGFuIG91dGVyIGVsZW1lbnQgaXMgcmVmZXJlbmNlZC5cclxuICAgICAgICAgICAgaWYgKGhpZXJhcmNoeS5mcm9tLnJlZlswXSA9PT0gXCJAXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gaGllcmFyY2h5LmZyb20ucmVmLnN1YnN0cmluZygxKSxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaGllcmFyY2h5KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIHByb3BlciBvcHRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiBhbnkgPSBvcHRpb25zLmZpbHRlcigob3B0OiBPcHRpb24pID0+IG9wdC5sYWJlbCA9PT0ga2V5KVswXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvcHRpb24uZ2V0S2V5RnJvbUVsZW1lbnQoZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmhlcml0aW5nIHRoZSB2YWx1ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmluaGVyaXQoaGllcmFyY2h5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0XHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZEhpZXJhcmNoeTogUmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWY6IFJlZmVyZW5jZVR5cGUpID0+IHJlZi5oaWVyYXJjaHkucmVmID09PSBoaWVyYXJjaHkuZnJvbS5yZWYpWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvSW5oZXJpdDogQXJyYXk8c3RyaW5nPiA9IGhpZXJhcmNoeS5mcm9tLmluY2x1ZGUuZmlsdGVyKChvcHQ6IHN0cmluZykgPT4gaGllcmFyY2h5LmZyb20uZXhjbHVkZS5pbmRleE9mKG9wdCkgPT09IC0xKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b0luaGVyaXQuZm9yRWFjaCgob3B0TmFtZTogc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIHByb3BlciBvcHRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uOiBPcHRpb24gPSBvcHRpb25zLmZpbHRlcigob3B0OiBPcHRpb24pID0+IG9wdC5sYWJlbCA9PT0gb3B0TmFtZSlbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluaGVyaXRpbmcgdGhlIHZhbHVlLlxyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5pbmhlcml0KGhpZXJhcmNoeSwgcmVmZXJlbmNlZEhpZXJhcmNoeS5oaWVyYXJjaHlbb3B0TmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdldHRpbmcgYWxsIHRoZSByZWZlcmVuY2VzIGluIGEgc2FpZCBoaWVyYXJjaHkuXHJcbiAqIFxyXG4gKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRvIGdldCB0aGUgcmVmZXJlbmNlcyBmcm9tLlxyXG4gKiBAcGFyYW0gZGVwdGggVGhlIGN1cnJlbnQgZGVwdGggaW4gdGhlIHNhaWQgaGllcmFyY2h5IG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGdldFJlZmVyZW5jZXMoaGllcmFyY2h5OiBhbnksIGRlcHRoOiBudW1iZXIgPSAwKTogQXJyYXk8UmVmZXJlbmNlVHlwZT4ge1xyXG5cclxuICAgIGNvbnN0IHJlZmVyZW5jZXM6IEFycmF5PFJlZmVyZW5jZVR5cGU+ID0gW107XHJcblxyXG4gICAgLy8gSW5jcmVtZW50aW5nIHRoZSBkZXB0aC5cclxuICAgIGRlcHRoKys7XHJcblxyXG4gICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHJlZmVyZW5jZSBpcyB2YWxpZC5cclxuICAgIGlmIChoaWVyYXJjaHkucmVmICE9PSBcIlwiKSB7XHJcblxyXG4gICAgICAgIHJlZmVyZW5jZXMucHVzaCh7XHJcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcclxuICAgICAgICAgICAgaGllcmFyY2h5OiBoaWVyYXJjaHlcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IGNoaWxkcmVuLlxyXG4gICAgaWYgKCdjaGlsZE5vZGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICBoaWVyYXJjaHkuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZDogSGllcmFyY2h5KSA9PiB7XHJcblxyXG4gICAgICAgICAgICByZWZlcmVuY2VzLnB1c2goLi4uZ2V0UmVmZXJlbmNlcyhjaGlsZCwgZGVwdGgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBoYXMgYW55IHRlbXBsYXRlcy5cclxuICAgIGlmICgndGVtcGxhdGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LnRlbXBsYXRlcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgIGhpZXJhcmNoeS50ZW1wbGF0ZXMuZm9yRWFjaCgodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBTdWJzdHJhY3RpbmcgMSB0byBtYWtlIHRlbXBsYXRlcyBvbiB0aGUgc2FtZSBkZXB0aCBsZXZlbFxyXG4gICAgICAgICAgICAvLyBhcyB0aGVpciBoaWVyYXJjaHkgcGFyZW50LlxyXG4gICAgICAgICAgICByZWZlcmVuY2VzLnB1c2goLi4uZ2V0UmVmZXJlbmNlcyh0ZW1wbGF0ZSwgZGVwdGggLSAxKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuaW5nIGFsbCBmb3VuZCByZWZlcmVuY2VzLlxyXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFdoYXQgcGFyc2VzIHRoZSBoaWVyYXJjaHkgdG8gYW4gSFRNTCB0cmVlLlxyXG4gKi9cclxuXHJcblxyXG5pbXBvcnQgeyBIaWVyYXJjaHkgfSBmcm9tICcuL21vZGVscy9IaWVyYXJjaHknXHJcbmltcG9ydCB7IGdldFRlbW1lSWQgfSBmcm9tICcuL2lkZmllcic7XHJcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xyXG5pbXBvcnQgT3B0aW9uLCB7IElQYXJzZXIgfSBmcm9tICcuL21vZGVscy9PcHRpb24nO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgdGhlIGhpZXJhcmNoeSBvYmplY3QgaW50byBhbiBIVE1MIGVsZW1lbnQuXHJcbiAqIFxyXG4gKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRvIHBhcnNlLlxyXG4gKiBAcGFyYW0gcGFyZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gaG9zdCB0aGUgcGFyc2VkIGVsZW1lbnQuXHJcbiAqIEBwYXJhbSBub2RlQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgZXhlY3V0ZXMgd2hlbmV2ZXIgYW4gSFRNTCBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB0b3BQYXJlbnQgV2hldGhlciBvciBub3Qgd2UncmUgcGFyc2luZyB0aGUgdG9wIHBhcmVudC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShoaWVyYXJjaHk6IGFueSwgcGFyZW50OiBIVE1MRWxlbWVudCwgbm9kZUNhbGxiYWNrOiAodGVtbWVJZDogc3RyaW5nLCBjdXJyZW50SGllcmFyY2h5OiBhbnkpID0+IHZvaWQsIHRvcFBhcmVudDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gUGFyc2luZyB0aGUgZWxlbWVudC5cclxuICAgICAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IHBhcnNlRWxlbWVudChoaWVyYXJjaHksIHBhcmVudCwgdG9wUGFyZW50KTtcclxuXHJcbiAgICAgICAgLy8gRXhlY3V0aW5nIHRoZSBub2RlIGNhbGxiYWNrLlxyXG4gICAgICAgIG5vZGVDYWxsYmFjayhnZXRUZW1tZUlkKGhpZXJhcmNoeSksIGhpZXJhcmNoeSk7XHJcblxyXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoZSBoaWVyYXJjaHkgb2JqZWN0IGhhcyBhbnkgY2hpbGRyZW4uXHJcbiAgICAgICAgaWYgKCdjaGlsZE5vZGVzJyBpbiBoaWVyYXJjaHkgJiYgaGllcmFyY2h5LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgaGllcmFyY2h5LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQ6IEhpZXJhcmNoeSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcnNlKGNoaWxkLCBlbGVtZW50LCBub2RlQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgaGllcmFyY2h5IGludG8gYW4gSFRNTCBlbGVtZW50LlxyXG4gKiBcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IHRvIHBhcnNlLlxyXG4gKiBAcGFyYW0gcGFyZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gaG9zdCB0aGUgcGFyc2VkIGhpZXJhcmNoeS5cclxuICogQHBhcmFtIHRvcFBhcmVudCBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyc2VkIGVsZW1lbnQgaXMgdGhlIHRvcCBwYXJlbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBwYXJzZUVsZW1lbnQoaGllcmFyY2h5OiBIaWVyYXJjaHksIHBhcmVudDogSFRNTEVsZW1lbnQsIHRvcFBhcmVudDogYm9vbGVhbiA9IGZhbHNlKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAgIC8vIENyZWF0aW5nIGFuIEhUTUwgdGFnIG91dCBvZiB0aGUgaGllcmFyY2h5LlxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gKHRvcFBhcmVudCA9PT0gdHJ1ZSkgPyBwYXJlbnQgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGhpZXJhcmNoeS5uYW1lKTtcclxuXHJcbiAgICAgICAgLy8gQXBwZW5kaW5nIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMuXHJcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHQ6IE9wdGlvbiB8IElQYXJzZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKDxJUGFyc2VyPm9wdCkucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAoPElQYXJzZXI+b3B0KS5wYXJzZShlbGVtZW50LCBoaWVyYXJjaHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuXHJcbiAgICAgICAgLy8gQXBwZW5kaW5nIHRoZSBjcmVhdGVkIGVsZW1lbnQuXHJcbiAgICAgICAgaWYgKHRvcFBhcmVudCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmV0dXJuaW5nIHRoZSBwYXJzZWQgZWxlbWVudC5cclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuICAgIGNhdGNoKGUpIHtcclxuXHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGEgaGllcmFyY2h5IG9iamVjdFxyXG4gKiBpcyBub3QgdmFsaWQuXHJcbiAqL1xyXG5cclxuXHJcbmltcG9ydCBUZW1teUVycm9yIGZyb20gXCIuLi9tb2RlbHMvVGVtbXlFcnJvclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRIaWVyYXJjaHlFcnJvciBleHRlbmRzIFRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJJbnZhbGlkSGllcmFyY2h5RXJyb3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9IFwiVGhlIGhpZXJhcmNoeSBvYmplY3QgaXMgbm90IHZhbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIENhbGxpbmcgdGhlIHBhcmVudCBjbGFzcyBgVGVtbXlFcnJvcmAuXHJcbiAgICAgICAgc3VwZXIoXCJcIik7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSBlcnJvcidzIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IHRoaXMubWVzc2FnZTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVGhlIGVycm9yIHRocm93biB3aGVuIGEgdGFyZ2V0IGlzIG5vdCBhIHZhbGlkXHJcbiAqIEhUTUwgZWxlbWVudC5cclxuICovXHJcblxyXG5pbXBvcnQgVGVtbXlFcnJvciBmcm9tIFwiLi4vbW9kZWxzL1RlbW15RXJyb3JcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRUYXJnZXRFcnJvciBleHRlbmRzIFRlbW15RXJyb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJJbnZhbGlkVGFyZ2V0RXJyb3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9IFwiVGhlIHRhcmdldCBpcyBub3QgYSB2YWxpZCBIVE1MIGVsZW1lbnRcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgcGFyZW50IGNsYXNzIGBUZW1teUVycm9yYC5cclxuICAgICAgICBzdXBlcihcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRpbmcgdGhlIGVycm9yJ3MgbWVzc2FnZS5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogdGhpcy5tZXNzYWdlO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBcclxuICogQG5hbWU6ICAgICAgIHRlbW1lanNcclxuICogQHZlcnNpb246ICAgIDEuMC4xXHJcbiAqIEBhdXRob3I6ICAgICBFT3Vzc2FtYVxyXG4gKiBAbGljZW5zZSAgICAgTUlUXHJcbiAqIEBzb3VyY2U6ICAgICBodHRwczovL2dpdGh1Yi5jb20vRU91c3NhbWEvdGVtbWVqc1xyXG4gKiBcclxuICogVGVtbWUgKG9yIEVtbWV0IGluIHJldmVyc2UpIGlzIHRvIGphdmFzY3JpcHQgd2hhdCBFbW1ldCBpcyB0byBIVE1MIGFuZCBDU1MsXHJcbiAqIHdpdGggbm8gZG91YnRzLCBFbW1ldCBzYXZlZCB1cyBmcm9tIHRoZSBoZWFkYWNoZSBvZiB3b3JraW5nIHdpdGggSFRNTCBhbmQgQ1NTLCBcclxuICogYW5kIG5vdywgVGVtbWUgaXMgZG9pbmcgSmF2YXNjcmlwdCB0aGUgc2FtZSBmYXZvdXIgdG9vLlxyXG4gKiBcclxuICovXHJcblxyXG5cclxuaW1wb3J0ICogYXMgVmFsaWRhdG9yIGZyb20gXCIuL21vZHVsZXMvdmFsaWRhdG9yXCI7XHJcbmltcG9ydCAqIGFzIFNhbml0aXplciBmcm9tIFwiLi9tb2R1bGVzL3Nhbml0aXplclwiO1xyXG5pbXBvcnQgKiBhcyBSZWZlcmVuY2VyIGZyb20gXCIuL21vZHVsZXMvcmVmZXJlbmNlclwiO1xyXG5pbXBvcnQgKiBhcyBQYXJzZXIgZnJvbSAnLi9tb2R1bGVzL3BhcnNlcic7XHJcbmltcG9ydCAqIGFzIElkZmllciBmcm9tIFwiLi9tb2R1bGVzL2lkZmllclwiO1xyXG5pbXBvcnQgVGVtbXlFcnJvciBmcm9tIFwiLi9tb2R1bGVzL21vZGVscy9UZW1teUVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkSGllcmFyY2h5RXJyb3IgZnJvbSBcIi4vbW9kdWxlcy9lcnJvcnMvSW52YWxpZEhpZXJhcmNoeUVycm9yXCI7XHJcbmltcG9ydCBJbnZhbGlkVGFyZ2V0RXJyb3IgZnJvbSBcIi4vbW9kdWxlcy9lcnJvcnMvSW52YWxpZFRhcmdldEVycm9yXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoZSBlbnRyeSBwb2ludCBvZiBUZW1tZSwgaXQncyB3aGF0IGluaXRpYXRlcyBldmVyeXRoaW5nXHJcbiAqIGZyb20gc2FuaXRpemluZywgdG8gcGFyc2luZywgbGlrZSBhIGJvc3MuXHJcbiAqIFxyXG4gKiBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgb2JqZWN0IHRoYXQgbWFwcyB0aGUgSFRNTCBza2VsZXRvbi5cclxuICogQHBhcmFtIHRhcmdldCBUaGUgSFRNTCBlbGVtZW50IHRoYXQgd2lsbCBob3N0IHRoZSBwYXJzZWQgc2tlbGV0b24uXHJcbiAqIEBwYXJhbSBlbmRDYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBleGVjdXRlIHdoZW4gdGhlIHNrZWxldG9uIGhhcyBiZWVuIHBhcnNlZC5cclxuICogQHBhcmFtIG5vZGVDYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB3aGVuZXZlciBhbiBlbGVtZW50IGhhcyBiZWVuIHBhcnNlZC5cclxuICogXHJcbiAqIEB0aHJvd3MgSW52YWxpZFRhcmdldEVycm9yLCBJbnZhbGlkSGllcmFyY2h5RXJyb3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShoaWVyYXJjaHk6IE9iamVjdCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZW5kQ2FsbGJhY2s6IChyZXN1bHRlZEhpZXJhcmNoeTogYW55KSA9PiB2b2lkID0gKGhpZXJhcmNoeSkgPT4geyB9LCBub2RlQ2FsbGJhY2s6ICh0ZW1tZUlkOiBzdHJpbmcsIGN1cnJlbnRIaWVyYXJjaHk6IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfSk6IE9iamVjdCB7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIHRhcmdldCBpcyBhIHZhbGlkIEhUTUwgZWxlbWVudCBhbmQgdGhyb3dpbmdcclxuICAgICAgICAvLyBhbiBlcnJvciBpZiBpdCdzIG5vdC5cclxuICAgICAgICBpZiAoIVZhbGlkYXRvci5pc1ZhbGlkSFRNTEVsZW1lbnQodGFyZ2V0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRhcmdldEVycm9yKFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhlIGhpZXJhcmNoeSBvYmplY3QgaXMgYW5kIHRocm93aW5nXHJcbiAgICAgICAgLy8gYW4gZXJyb3IgaWYgaXQncyBub3QuXHJcbiAgICAgICAgaWYgKCFWYWxpZGF0b3IuaXNWYWxpZEhpZXJhcmNoeShoaWVyYXJjaHkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSGllcmFyY2h5RXJyb3IoXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGUgaGllcmFyY2h5IG9iamVjdCBjb250YWluc1xyXG4gICAgICAgIC8vIHZhbGlkIG9wdGlvbnMuXHJcbiAgICAgICAgVmFsaWRhdG9yLnZhbGlkYXRlT3B0aW9ucyhoaWVyYXJjaHkpO1xyXG5cclxuICAgICAgICAvLyBTYW5pdGl6aW5nIHRoZSBoaWVyYXJjaHkuXHJcbiAgICAgICAgU2FuaXRpemVyLnNhbml0aXplKGhpZXJhcmNoeSk7XHJcblxyXG4gICAgICAgIC8vIEFzc2lnbmluZyB0ZW1tZUlkcyB0byB0aGUgaGllcmFyY2h5IG9iamVjdC5cclxuICAgICAgICBJZGZpZXIuaWRmeShoaWVyYXJjaHkpO1xyXG5cclxuICAgICAgICAvLyBQcm9jZXNzaW5nIGFsbCBvZiB0aGUgcmVmZXJlbmNlcy5cclxuICAgICAgICBSZWZlcmVuY2VyLnByb2Nlc3MoaGllcmFyY2h5KTtcclxuXHJcbiAgICAgICAgLy8gUGFyc2luZyB0aGUgaGllcmFyY2h5IGludG8gYW4gSFRNTCB0cmVlLlxyXG4gICAgICAgIFBhcnNlci5wYXJzZShoaWVyYXJjaHksIHRhcmdldCwgbm9kZUNhbGxiYWNrLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gRXhlY3V0aW5nIHRoZSBlbmQgY2FsbGJhY2suXHJcbiAgICAgICAgZW5kQ2FsbGJhY2soaGllcmFyY2h5KTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuaW5nIHRoZSByZXN1bHRlZCBoaWVyYXJjaHkgb2JqZWN0LlxyXG4gICAgICAgIHJldHVybiBoaWVyYXJjaHk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICAvLyBBcHBlbmRpbmcgYSB0YWcgaW4gZnJvbnQgb2YgdGhlIGVycm9yJ3MgbWVzc2FnZS5cclxuICAgICAgICAoPFRlbW15RXJyb3I+ZSkubWVzc2FnZSA9IGBbVGVtbWVdOiAke2UubWVzc2FnZX0uYDtcclxuXHJcbiAgICAgICAgLy8gVGhyb3dpbmcgdGhlIGVycm9yLlxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhlIGhpZXJhcmNoeSBvYmplY3RcclxuICpcclxuICogQHBhcmFtIGhpZXJhcmNoeSBUaGUgaGllcmFyY2h5IG9iamVjdCB0aGF0IG1hcHMgdGhlIEhUTUwgc2tlbGV0b24uXHJcbiAqIEB0aHJvd3MgSW52YWxpZEhpZXJhcmNoeUVycm9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUoaGllcmFyY2h5OiBPYmplY3QpOiBPYmplY3Qge1xyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gVmFsaWRhdGUgb3B0aW9uc1xyXG4gICAgICAgIFZhbGlkYXRvci52YWxpZGF0ZU9wdGlvbnMoaGllcmFyY2h5KTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJucyBhIHZhbGlkIG9iamVjdFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxyXG4gICAgICAgICAgICBlcnJvcjogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJucyBhbiBpbnZhbGlkIG9iamVjdFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgZXJyb3I6IGVyclxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXSwic291cmNlUm9vdCI6IiJ9