@jahands/dagger-helpers 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,SAAS;IACrB,qCAAqC;;QAEpC,iCAAiC;;;CAiBzB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,SAAS;IACrB,qCAAqC;;QAEpC,iCAAiC;;;CAgBzB,CAAA"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var M={workersMonorepo:{ignore:["**/node_modules/","**/.env","**/.secret","**/Earthfile","**/.wrangler","**/.dev.vars","**/.turbo/","**/dist/","**/dist2/","**/.DS_Store","**/.astro/","**/.next/","*.env"]}};import{AsyncLocalStorage as N}from"node:async_hooks";var E=new N;function B(e){let t=e.toString().replace(/(\r\n|\n|\r)/gm,""),n=t.match(/(?:async\s*)?(?:function\s*[\w\s]*)?\(([^)]*)\)/)??t.match(/^\s*(?:async\s*)?\(([^)]*)\)/);if(!n||typeof n[1]>"u")return console.warn("Could not extract parameter names from function string:",t),[];let s=n[1].replace(/\/\*.*?\*\//g,"").replace(/\/\/.*?$/gm,"");return s.trim()?s.split(",").map(o=>o.split(/[:=]/)[0]?.trim()??"").filter(o=>o.length>0):[]}function D(){return function(e,t,n){if(typeof n>"u"||typeof n.value!="function")throw new Error(`@ParamsToEnv decorator can only be applied to methods, not: ${String(t)}`);let r=n.value,s=null;n.value=function(...o){let c=E.getStore();s===null&&(s=B(r),s.length,o.length);let l={},w=new Set;s?.forEach((k,U)=>{/^[A-Z0-9_]+$/.test(k)&&(w.add(k),U<o.length&&(l[k]=o[U]))});let C={...c?.mergedEnv??{},...l},z={currentParams:w,mergedEnv:C};return E.run(z,()=>r.apply(this,o))}}}var m=Symbol.for("@ts-pattern/matcher"),Z=Symbol.for("@ts-pattern/isVariadic"),b="@ts-pattern/anonymous-select-key",F=e=>!!(e&&typeof e=="object"),T=e=>e&&!!e[m],f=(e,t,n)=>{if(T(e)){let r=e[m](),{matched:s,selections:o}=r.match(t);return s&&o&&Object.keys(o).forEach(c=>n(c,o[c])),s}if(F(e)){if(!F(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let r=[],s=[],o=[];for(let c of e.keys()){let l=e[c];T(l)&&l[Z]?o.push(l):o.length?s.push(l):r.push(l)}if(o.length){if(o.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<r.length+s.length)return!1;let c=t.slice(0,r.length),l=s.length===0?[]:t.slice(-s.length),w=t.slice(r.length,s.length===0?1/0:-s.length);return r.every((g,C)=>f(g,c[C],n))&&s.every((g,C)=>f(g,l[C],n))&&(o.length===0||f(o[0],w,n))}return e.length===t.length&&e.every((c,l)=>f(c,t[l],n))}return Reflect.ownKeys(e).every(r=>{let s=e[r];return(r in t||T(o=s)&&o[m]().matcherType==="optional")&&f(s,t[r],n);var o})}return Object.is(t,e)},S=e=>{var t,n,r;return F(e)?T(e)?(t=(n=(r=e[m]()).getSelectionKeys)==null?void 0:n.call(r))!=null?t:[]:Array.isArray(e)?$(e,S):$(Object.values(e),S):[]},$=(e,t)=>e.reduce((n,r)=>n.concat(t(r)),[]);function u(e){return Object.assign(e,{optional:()=>W(e),and:t=>a(e,t),or:t=>J(e,t),select:t=>t===void 0?L(e):L(t,e)})}function W(e){return u({[m]:()=>({match:t=>{let n={},r=(s,o)=>{n[s]=o};return t===void 0?(S(e).forEach(s=>r(s,void 0)),{matched:!0,selections:n}):{matched:f(e,t,r),selections:n}},getSelectionKeys:()=>S(e),matcherType:"optional"})})}function a(...e){return u({[m]:()=>({match:t=>{let n={},r=(s,o)=>{n[s]=o};return{matched:e.every(s=>f(s,t,r)),selections:n}},getSelectionKeys:()=>$(e,S),matcherType:"and"})})}function J(...e){return u({[m]:()=>({match:t=>{let n={},r=(s,o)=>{n[s]=o};return $(e,S).forEach(s=>r(s,void 0)),{matched:e.some(s=>f(s,t,r)),selections:n}},getSelectionKeys:()=>$(e,S),matcherType:"or"})})}function i(e){return{[m]:()=>({match:t=>({matched:!!e(t)})})}}function L(...e){let t=typeof e[0]=="string"?e[0]:void 0,n=e.length===2?e[1]:typeof e[0]=="string"?void 0:e[0];return u({[m]:()=>({match:r=>{let s={[t??b]:r};return{matched:n===void 0||f(n,r,(o,c)=>{s[o]=c}),selections:s}},getSelectionKeys:()=>[t??b].concat(n===void 0?[]:S(n))})})}function p(e){return typeof e=="number"}function d(e){return typeof e=="string"}function y(e){return typeof e=="bigint"}var ce=u(i(function(e){return!0}));var v=e=>Object.assign(u(e),{startsWith:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.startsWith(n)))));var n},endsWith:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.endsWith(n)))));var n},minLength:t=>v(a(e,(n=>i(r=>d(r)&&r.length>=n))(t))),length:t=>v(a(e,(n=>i(r=>d(r)&&r.length===n))(t))),maxLength:t=>v(a(e,(n=>i(r=>d(r)&&r.length<=n))(t))),includes:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.includes(n)))));var n},regex:t=>{return v(a(e,(n=t,i(r=>d(r)&&!!r.match(n)))));var n}}),le=v(i(d)),h=e=>Object.assign(u(e),{between:(t,n)=>h(a(e,((r,s)=>i(o=>p(o)&&r<=o&&s>=o))(t,n))),lt:t=>h(a(e,(n=>i(r=>p(r)&&r<n))(t))),gt:t=>h(a(e,(n=>i(r=>p(r)&&r>n))(t))),lte:t=>h(a(e,(n=>i(r=>p(r)&&r<=n))(t))),gte:t=>h(a(e,(n=>i(r=>p(r)&&r>=n))(t))),int:()=>h(a(e,i(t=>p(t)&&Number.isInteger(t)))),finite:()=>h(a(e,i(t=>p(t)&&Number.isFinite(t)))),positive:()=>h(a(e,i(t=>p(t)&&t>0))),negative:()=>h(a(e,i(t=>p(t)&&t<0)))}),ue=h(i(p)),x=e=>Object.assign(u(e),{between:(t,n)=>x(a(e,((r,s)=>i(o=>y(o)&&r<=o&&s>=o))(t,n))),lt:t=>x(a(e,(n=>i(r=>y(r)&&r<n))(t))),gt:t=>x(a(e,(n=>i(r=>y(r)&&r>n))(t))),lte:t=>x(a(e,(n=>i(r=>y(r)&&r<=n))(t))),gte:t=>x(a(e,(n=>i(r=>y(r)&&r>=n))(t))),positive:()=>x(a(e,i(t=>y(t)&&t>0))),negative:()=>x(a(e,i(t=>y(t)&&t<0)))}),pe=x(i(y)),he=u(i(function(e){return typeof e=="boolean"})),fe=u(i(function(e){return typeof e=="symbol"})),me=u(i(function(e){return e==null})),ge=u(i(function(e){return e!=null}));var P=class extends Error{constructor(t){let n;try{n=JSON.stringify(t)}catch{n=t}super(`Pattern matching error: no pattern matches value ${n}`),this.input=void 0,this.input=t}},R={matched:!1,value:void 0};function _(e){return new j(e,R)}var j=class e{constructor(t,n){this.input=void 0,this.state=void 0,this.input=t,this.state=n}with(...t){if(this.state.matched)return this;let n=t[t.length-1],r=[t[0]],s;t.length===3&&typeof t[1]=="function"?s=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let o=!1,c={},l=(g,C)=>{o=!0,c[g]=C},w=!r.some(g=>f(g,this.input,l))||s&&!s(this.input)?R:{matched:!0,value:n(o?b in c?c[b]:c:this.input,this.input)};return new e(this.input,w)}when(t,n){if(this.state.matched)return this;let r=!!t(this.input);return new e(this.input,r?{matched:!0,value:n(this.input,this.input)}:R)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(){if(this.state.matched)return this.state.value;throw new P(this.input)}run(){return this.exhaustive()}returnType(){return this}};function q(e){return t=>{let r=(Array.isArray(t)?t:[t]).map(s=>s.trim().split(`
2
- `).map(o=>o.trim()).join(`
3
- `));return _(e).with("sh",()=>["sh","-c",`set -eu; ${r}`]).with("bash",()=>["bash","-c",`set -euo pipefail; ${r}`]).with("zsh",()=>["zsh","-c",`set -euo pipefail; ${r}`]).exhaustive()}}import I from"node:path";import{join as X}from"node:path";import{existsSync as Y}from"node:fs";import{dirname as H}from"node:path";import{isAbsolute as V,join as Se,resolve as G}from"node:path";function K(e,t){return V(e)?e:G(t||".",e)}function O(e,t){let{stop:n,cwd:r}=t||{},s=K(e,r),o=!n,c,l=[];for(n&&(n=K(n,r));(o||s!==n)&&(l.push(s),s=H(c=s),s!==c););return l}function A(e,t){let n,r,s=t&&t.cwd||"";for(n of O(s,t))if(r=X(n,e),Y(r))return r}function ee(e){e=e??process.cwd();let t=A("pnpm-lock.yaml",{cwd:e});if(!t)throw new Error("could not determine repo root path: unable to find pnpm-lock.yaml");let n=I.dirname(t),r=A("dagger.json",{cwd:e,stop:n});if(!r)throw new Error("could not determine dagger.json path: unable to find dagger.json");return I.relative(n,I.dirname(r))}function te(e){if(!e)return"";if(e.includes("_")){let n="",r=e.split("_");for(let s=0;s<r.length;s++){let o=r[s];o&&(n.length===0?n+=o.toLowerCase():n+=o[0].toUpperCase()+o.slice(1).toLowerCase())}return n}return/^[A-Z0-9]+$/.test(e)?e.toLowerCase():e[0]===e[0].toLowerCase()?e:e[0].toLowerCase()+e.slice(1)}function ne(e){let t={};for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=te(n);t[r]=e[n]}return t}function re(e){return e?e.replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([a-z])(\d)/g,"$1_$2").toUpperCase():""}function se(e){let t={};for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=re(n);t[r]=e[n]}return t}export{D as ParamsToEnv,M as constants,ne as convertToCamel,se as convertToSnake,E as envStorage,ee as getModulePath,q as shell};
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZW52LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNi4yL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9pbnRlcm5hbHMvc3ltYm9scy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHMtcGF0dGVybkA1LjYuMi9ub2RlX21vZHVsZXMvdHMtcGF0dGVybi9zcmMvaW50ZXJuYWxzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzLXBhdHRlcm5ANS42LjIvbm9kZV9tb2R1bGVzL3RzLXBhdHRlcm4vc3JjL2lzLW1hdGNoaW5nLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNi4yL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9wYXR0ZXJucy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHMtcGF0dGVybkA1LjYuMi9ub2RlX21vZHVsZXMvdHMtcGF0dGVybi9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNi4yL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9tYXRjaC50cyIsICIuLi9zcmMvc2hlbGwudHMiLCAiLi4vc3JjL3BhdGgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2VtcGF0aGljQDEuMC4wL25vZGVfbW9kdWxlcy9lbXBhdGhpYy9maW5kLm1qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZW1wYXRoaWNAMS4wLjAvbm9kZV9tb2R1bGVzL2VtcGF0aGljL3dhbGsubWpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9lbXBhdGhpY0AxLjAuMC9ub2RlX21vZHVsZXMvZW1wYXRoaWMvcmVzb2x2ZS5tanMiLCAiLi4vc3JjL2NvbnZlcnQvc25ha2UtdG8tY2FtZWwudHMiLCAiLi4vc3JjL2NvbnZlcnQvY2FtZWwtdG8tc25ha2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKiB2YXJpb3VzIGNvbnN0YW50cyBmb3IgZGFnZ2VyIG1vZHVsZXMgaW4gbXkgcmVwb3MgKi9cbmV4cG9ydCBjb25zdCBjb25zdGFudHMgPSB7XG5cdC8qKiBjb25zdGFudHMgZm9yIHdvcmtlcnMtbW9ub3JlcG8gKi9cblx0d29ya2Vyc01vbm9yZXBvOiB7XG5cdFx0LyoqIGRlZmF1bHQgc291cmNlIGlnbm9yZSBsaXN0ICovXG5cdFx0aWdub3JlOiBbXG5cdFx0XHQnKiovbm9kZV9tb2R1bGVzLycsXG5cdFx0XHQnKiovLmVudicsXG5cdFx0XHQnKiovLnNlY3JldCcsXG5cdFx0XHQnKiovRWFydGhmaWxlJyxcblx0XHRcdCcqKi8ud3JhbmdsZXInLFxuXHRcdFx0JyoqLy5kZXYudmFycycsXG5cdFx0XHQnKiovLnR1cmJvLycsXG5cdFx0XHQnKiovZGlzdC8nLFxuXHRcdFx0JyoqL2Rpc3QyLycsXG5cdFx0XHQnKiovLkRTX1N0b3JlJyxcblx0XHRcdCcqKi8uYXN0cm8vJyxcblx0XHRcdCcqKi8ubmV4dC8nLFxuXHRcdFx0JyouZW52Jyxcblx0XHRdIHNhdGlzZmllcyBzdHJpbmdbXSxcblx0fSxcbn0gYXMgY29uc3RcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnXG5cbmltcG9ydCB0eXBlIHsgU2VjcmV0IH0gZnJvbSAnQGRhZ2dlci5pby9kYWdnZXInXG5cbi8qKlxuICogU3RydWN0dXJlIHN0b3JlZCBpbiBBc3luY0xvY2FsU3RvcmFnZSwgY29udGFpbmluZyBib3RoIHRoZSBmdWxseSBtZXJnZWRcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdGhlIHNldCBvZiB2YXJpYWJsZXMgZXhwbGljaXRseSBwYXNzZWQgdG8gdGhlXG4gKiBjdXJyZW50IGRlY29yYXRlZCBmdW5jdGlvbiBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudkNvbnRleHQge1xuXHRjdXJyZW50UGFyYW1zOiBTZXQ8c3RyaW5nPlxuXHRtZXJnZWRFbnY6IFJlY29yZDxzdHJpbmcsIFNlY3JldCB8IHN0cmluZyB8IHVuZGVmaW5lZD5cbn1cblxuLyoqXG4gKiBTdG9yZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFjY2Vzc2libGUgdmlhIEFzeW5jTG9jYWxTdG9yYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBlbnZTdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPEVudkNvbnRleHQ+KClcblxuLyoqXG4gKiBIZWxwZXIgdG8gZXh0cmFjdCBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBhIGZ1bmN0aW9uJ3Mgc291cmNlIGNvZGUuXG4gKiBOb3RlOiBUaGlzIGFwcHJvYWNoIHVzaW5nIEZ1bmN0aW9uLnRvU3RyaW5nKCkgY2FuIGJlIGZyYWdpbGUgYW5kIG1pZ2h0XG4gKiBicmVhayB3aXRoIGNvZGUgbWluaWZpY2F0aW9uIG9yIGNvbXBsZXggZnVuY3Rpb24gZGVmaW5pdGlvbnMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBhcmFtTmFtZXMoZnVuYzogRnVuY3Rpb24pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZ1bmNTdHIgPSBmdW5jLnRvU3RyaW5nKCkucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJycpXG5cdC8vIFJlZ2V4IHRvIGZpbmQgcGFyYW1ldGVyIGxpc3Qgd2l0aGluIHBhcmVudGhlc2VzLCBoYW5kbGVzIHZhcmlvdXMgZnVuY3Rpb24gZGVmaW5pdGlvbiBzdHlsZXNcblx0Y29uc3QgcGFyYW1zTWF0Y2ggPVxuXHRcdGZ1bmNTdHIubWF0Y2goLyg/OmFzeW5jXFxzKik/KD86ZnVuY3Rpb25cXHMqW1xcd1xcc10qKT9cXCgoW14pXSopXFwpLykgPz9cblx0XHRmdW5jU3RyLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKik/XFwoKFteKV0qKVxcKS8pIC8vIEFycm93IGZ1bmN0aW9uIHN1cHBvcnRcblxuXHRpZiAoIXBhcmFtc01hdGNoIHx8IHR5cGVvZiBwYXJhbXNNYXRjaFsxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBleHRyYWN0IHBhcmFtZXRlciBuYW1lcyBmcm9tIGZ1bmN0aW9uIHN0cmluZzonLCBmdW5jU3RyKVxuXHRcdHJldHVybiBbXVxuXHR9XG5cdGNvbnN0IHBhcmFtc1N0ciA9IHBhcmFtc01hdGNoWzFdXG5cblx0Ly8gUmVtb3ZlIGNvbW1lbnRzLCBkZWZhdWx0IHZhbHVlcywgYW5kIHR5cGUgYW5ub3RhdGlvbnMgdG8gaXNvbGF0ZSBuYW1lc1xuXHRjb25zdCBjbGVhbmVkUGFyYW1zU3RyID0gcGFyYW1zU3RyXG5cdFx0LnJlcGxhY2UoL1xcL1xcKi4qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGJsb2NrIGNvbW1lbnRzXG5cdFx0LnJlcGxhY2UoL1xcL1xcLy4qPyQvZ20sICcnKSAvLyBSZW1vdmUgbGluZSBjb21tZW50c1xuXG5cdGlmICghY2xlYW5lZFBhcmFtc1N0ci50cmltKCkpIHtcblx0XHRyZXR1cm4gW10gLy8gTm8gcGFyYW1ldGVyc1xuXHR9XG5cblx0cmV0dXJuIGNsZWFuZWRQYXJhbXNTdHJcblx0XHQuc3BsaXQoJywnKVxuXHRcdC5tYXAoKHBhcmFtKSA9PiB7XG5cdFx0XHQvLyBSZW1vdmUgdHlwZSBhbm5vdGF0aW9ucyAoZS5nLiwgXCI6IFNlY3JldFwiKSBhbmQgZGVmYXVsdCBpbml0aWFsaXplcnMgKGUuZy4sIFwiPSAnZGVmYXVsdCdcIilcblx0XHRcdGNvbnN0IG5hbWVQYXJ0ID0gcGFyYW0uc3BsaXQoL1s6PV0vKVswXVxuXHRcdFx0cmV0dXJuIG5hbWVQYXJ0Py50cmltKCkgPz8gJydcblx0XHR9KVxuXHRcdC5maWx0ZXIoKG5hbWUpID0+IG5hbWUubGVuZ3RoID4gMCkgLy8gRmlsdGVyIG91dCBlbXB0eSBzdHJpbmdzIGZyb20gdHJhaWxpbmcgY29tbWFzIGV0Yy5cbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHdyYXBzIGEgbWV0aG9kIHRvIGNhcHR1cmUgaXRzIGFyZ3VtZW50cyBiYXNlZCBvblxuICogZXh0cmFjdGVkIHBhcmFtZXRlciBuYW1lcyBhbmQgc3RvcmUgdGhlbSBpbiBBc3luY0xvY2FsU3RvcmFnZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGZ1bmN0aW9uIFBhcmFtc1RvRW52KCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoX3RhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBAUGFyYW1zVG9FbnYgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbWV0aG9kcywgbm90OiAke1N0cmluZyhwcm9wZXJ0eUtleSl9YFxuXHRcdFx0KVxuXHRcdH1cblx0XHRjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWVcblxuXHRcdGxldCBwYXJhbU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsIC8vIENhY2hlIHBhcmFtZXRlciBuYW1lcyBsYXppbHlcblxuXHRcdGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pOiBhbnkge1xuXHRcdFx0Y29uc3QgcGFyZW50Q29udGV4dCA9IGVudlN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG5cdFx0XHRpZiAocGFyYW1OYW1lcyA9PT0gbnVsbCkge1xuXHRcdFx0XHRwYXJhbU5hbWVzID0gZXh0cmFjdFBhcmFtTmFtZXMob3JpZ2luYWxNZXRob2QpXG5cdFx0XHRcdC8vIEJhc2ljIHZhbGlkYXRpb246IENoZWNrIGlmIHRoZSBudW1iZXIgb2YgZXh0cmFjdGVkIG5hbWVzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQuXG5cdFx0XHRcdC8vIFRoaXMgbWlnaHQgYmUgaW5hY2N1cmF0ZSBpZiBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZW4ndCBwYXNzZWQuXG5cdFx0XHRcdGlmIChwYXJhbU5hbWVzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGggJiYgdHlwZW9mIHByb3BlcnR5S2V5ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdC8vIExvZyBhIHdhcm5pbmcgYnV0IGF0dGVtcHQgdG8gcHJvY2VlZC4gVGhlIGNvbnRleHQgbWlnaHQgYmUgaW5jb21wbGV0ZS5cblx0XHRcdFx0XHQvLyBOb3RlOiBEaXNhYmxpbmcgdGhpcyBmb3Igbm93IGJlY2F1c2Ugb3B0aW9uYWwgcGFyYW1ldGVycyB0cmlnZ2VyIHRoaXMgd2FybmluZy5cblx0XHRcdFx0XHQvLyBjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0Ly8gXHRgUGFyYW1ldGVyIG5hbWUgZXh0cmFjdGlvbi9hcmd1bWVudCBjb3VudCBtaXNtYXRjaCBmb3IgJHtwcm9wZXJ0eUtleX06IGAgK1xuXHRcdFx0XHRcdC8vIFx0XHRgRXh0cmFjdGVkICR7cGFyYW1OYW1lcy5sZW5ndGh9IG5hbWVzICgke3BhcmFtTmFtZXMuam9pbignLCAnKX0pLCByZWNlaXZlZCAke2FyZ3MubGVuZ3RofSBhcmdzLiBgICtcblx0XHRcdFx0XHQvLyBcdFx0YENvbnRleHQgaW4gQXN5bmNMb2NhbFN0b3JhZ2UgbWF5IGJlIGluY29tcGxldGUgb3IgaW5jb3JyZWN0LmBcblx0XHRcdFx0XHQvLyApXG5cdFx0XHRcdFx0Ly8gT3B0aW9uYWxseSwgeW91IGNvdWxkIHRyeSB0byBwYWQgcGFyYW1OYW1lcyBvciB0cnVuY2F0ZSBhcmdzLCBidXQgaXQncyByaXNreS5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBuZXdFbnY6IFJlY29yZDxzdHJpbmcsIFNlY3JldCB8IHN0cmluZyB8IHVuZGVmaW5lZD4gPSB7fVxuXHRcdFx0Y29uc3QgY3VycmVudFBhcmFtcyA9IG5ldyBTZXQ8c3RyaW5nPigpIC8vIFRyYWNrIHBhcmFtcyBmb3IgY3VycmVudCBtZXRob2Rcblx0XHRcdHBhcmFtTmFtZXM/LmZvckVhY2goKG5hbWUsIGluZGV4KSA9PiB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBwYXJhbSBuYW1lIG1hdGNoZXMgdGhlIEVOVl9WQVIgcGF0dGVyblxuXHRcdFx0XHRpZiAoL15bQS1aMC05X10rJC8udGVzdChuYW1lKSkge1xuXHRcdFx0XHRcdC8vIEFkZCBhbGwgbWF0Y2hpbmcgZGVmaW5lZCBwYXJhbWV0ZXIgbmFtZXMgdG8gY3VycmVudFBhcmFtc1xuXHRcdFx0XHRcdGN1cnJlbnRQYXJhbXMuYWRkKG5hbWUpXG5cdFx0XHRcdFx0Ly8gT25seSBhZGQgdG8gbmV3RW52IGlmIGFyZ3VtZW50IHdhcyBhY3R1YWxseSBwYXNzZWRcblx0XHRcdFx0XHRpZiAoaW5kZXggPCBhcmdzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0bmV3RW52W25hbWVdID0gYXJnc1tpbmRleF1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gSWYgcGFyYW1OYW1lcy5sZW5ndGggPiBhcmdzLmxlbmd0aCwgc29tZSBuYW1lcyB3b24ndCBnZXQgYSB2YWx1ZSwgd2hpY2ggaXMgZXhwZWN0ZWQgZm9yIG9wdGlvbmFsIHBhcmFtcy5cblx0XHRcdH0pXG5cblx0XHRcdC8vIG1lcmdlIHBhcmVudCBjb250ZXh0IHdpdGggbmV3IGNvbnRleHQgKG5ldyB0YWtlcyBwcmVjZWRlbmNlKVxuXHRcdFx0Y29uc3QgcGFyZW50TWVyZ2VkRW52ID0gcGFyZW50Q29udGV4dD8ubWVyZ2VkRW52ID8/IHt9XG5cdFx0XHRjb25zdCBtZXJnZWRFbnYgPSB7IC4uLnBhcmVudE1lcmdlZEVudiwgLi4ubmV3RW52IH1cblxuXHRcdFx0Ly8gUHJlcGFyZSBjb250ZXh0IG9iamVjdCBmb3Igc3RvcmFnZVxuXHRcdFx0Y29uc3QgY29udGV4dFRvU3RvcmU6IEVudkNvbnRleHQgPSB7XG5cdFx0XHRcdGN1cnJlbnRQYXJhbXMsXG5cdFx0XHRcdG1lcmdlZEVudixcblx0XHRcdH1cblxuXHRcdFx0Ly8gcnVuIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aGluIHRoZSBBc3luY0xvY2FsU3RvcmFnZSBjb250ZXh0IHVzaW5nIHRoZSBtZXJnZWQgZW52XG5cdFx0XHRyZXR1cm4gZW52U3RvcmFnZS5ydW4oY29udGV4dFRvU3RvcmUsICgpID0+IHtcblx0XHRcdFx0Ly8gVGhlIG9yaWdpbmFsIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBpdHMgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHRcdHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKVxuXHRcdFx0fSlcblx0XHR9XG5cdH1cbn1cbiIsICIvKipcbiAqIFN5bWJvbHMgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0cy1wYXR0ZXJuIHRvIGNvbnN0cnVjdCBhbmQgZGlzY3JpbWluYXRlXG4gKiBHdWFyZCwgTm90LCBhbmQgU2VsZWN0LCBhbmQgQW5vbnltb3VzU2VsZWN0IHBhdHRlcm5zXG4gKlxuICogU3ltYm9scyBoYXZlIHRoZSBhZHZhbnRhZ2Ugb2Ygbm90IGFwcGVhcmluZyBpbiBhdXRvLWNvbXBsZXRlIHN1Z2dlc3Rpb25zIGluXG4gKiB1c2VyIGRlZmluZWQgcGF0dGVybnMsIGFuZCBlbGltaW5hdGUgdGhlIHJpc2sgb2YgcHJvcGVydHlcbiAqIG92ZXJsYXAgYmV0d2VlbiB0cy1wYXR0ZXJuIGludGVybmFscyBhbmQgdXNlciBkZWZpbmVkIHBhdHRlcm5zLlxuICpcbiAqIFRoZXNlIHN5bWJvbHMgaGF2ZSB0byBiZSB2aXNpYmxlIHRvIHRzYyBmb3IgdHlwZSBpbmZlcmVuY2UgdG8gd29yaywgYnV0XG4gKiB1c2VycyBzaG91bGQgbm90IGltcG9ydCB0aGVtXG4gKiBAbW9kdWxlXG4gKiBAcHJpdmF0ZVxuICogQGludGVybmFsXG4gKi9cblxuZXhwb3J0IGNvbnN0IG1hdGNoZXIgPSBTeW1ib2wuZm9yKCdAdHMtcGF0dGVybi9tYXRjaGVyJyk7XG5leHBvcnQgdHlwZSBtYXRjaGVyID0gdHlwZW9mIG1hdGNoZXI7XG5cbmV4cG9ydCBjb25zdCB1bnNldCA9IFN5bWJvbC5mb3IoJ0B0cy1wYXR0ZXJuL3Vuc2V0Jyk7XG5leHBvcnQgdHlwZSB1bnNldCA9IHR5cGVvZiB1bnNldDtcblxuZXhwb3J0IGNvbnN0IGlzVmFyaWFkaWMgPSBTeW1ib2wuZm9yKCdAdHMtcGF0dGVybi9pc1ZhcmlhZGljJyk7XG5leHBvcnQgdHlwZSBpc1ZhcmlhZGljID0gdHlwZW9mIGlzVmFyaWFkaWM7XG5cbi8vIGNhbid0IGJlIGEgc3ltYm9sIGJlY2F1c2UgdGhpcyBrZXkgaGFzIHRvIGJlIGVudW1lcmFibGUuXG5leHBvcnQgY29uc3QgYW5vbnltb3VzU2VsZWN0S2V5ID0gJ0B0cy1wYXR0ZXJuL2Fub255bW91cy1zZWxlY3Qta2V5JztcbmV4cG9ydCB0eXBlIGFub255bW91c1NlbGVjdEtleSA9IHR5cGVvZiBhbm9ueW1vdXNTZWxlY3RLZXk7XG5cbmV4cG9ydCBjb25zdCBvdmVycmlkZSA9IFN5bWJvbC5mb3IoJ0B0cy1wYXR0ZXJuL292ZXJyaWRlJyk7XG5leHBvcnQgdHlwZSBvdmVycmlkZSA9IHR5cGVvZiBvdmVycmlkZTtcbiIsICIvKipcbiAqIEBtb2R1bGVcbiAqIEBwcml2YXRlXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5pbXBvcnQgKiBhcyBzeW1ib2xzIGZyb20gJy4vc3ltYm9scyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi4vdHlwZXMvRmluZFNlbGVjdGVkJztcbmltcG9ydCB7IFBhdHRlcm4sIE1hdGNoZXIsIE1hdGNoZXJUeXBlLCBBbnlNYXRjaGVyIH0gZnJvbSAnLi4vdHlwZXMvUGF0dGVybic7XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgT2JqZWN0ID0+XG4gIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyk7XG5cbi8vICAgQGludGVybmFsXG5leHBvcnQgY29uc3QgaXNNYXRjaGVyID0gKFxuICB4OiB1bmtub3duXG4pOiB4IGlzIE1hdGNoZXI8dW5rbm93biwgdW5rbm93biwgTWF0Y2hlclR5cGUsIFNlbGVjdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgcGF0dGVybiA9IHggYXMgTWF0Y2hlcjx1bmtub3duLCB1bmtub3duLCBNYXRjaGVyVHlwZSwgU2VsZWN0aW9uVHlwZT47XG4gIHJldHVybiBwYXR0ZXJuICYmICEhcGF0dGVybltzeW1ib2xzLm1hdGNoZXJdO1xufTtcblxuLy8gQGludGVybmFsXG5jb25zdCBpc09wdGlvbmFsUGF0dGVybiA9IChcbiAgeDogdW5rbm93blxuKTogeCBpcyBNYXRjaGVyPHVua25vd24sIHVua25vd24sICdvcHRpb25hbCcsIFNlbGVjdGlvblR5cGU+ID0+IHtcbiAgcmV0dXJuIGlzTWF0Y2hlcih4KSAmJiB4W3N5bWJvbHMubWF0Y2hlcl0oKS5tYXRjaGVyVHlwZSA9PT0gJ29wdGlvbmFsJztcbn07XG5cbi8vIHRlbGxzIHVzIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybi5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IG1hdGNoUGF0dGVybiA9IChcbiAgcGF0dGVybjogYW55LFxuICB2YWx1ZTogYW55LFxuICBzZWxlY3Q6IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWRcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoaXNNYXRjaGVyKHBhdHRlcm4pKSB7XG4gICAgY29uc3QgbWF0Y2hlciA9IHBhdHRlcm5bc3ltYm9scy5tYXRjaGVyXSgpO1xuICAgIGNvbnN0IHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9ID0gbWF0Y2hlci5tYXRjaCh2YWx1ZSk7XG4gICAgaWYgKG1hdGNoZWQgJiYgc2VsZWN0aW9ucykge1xuICAgICAgT2JqZWN0LmtleXMoc2VsZWN0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiBzZWxlY3Qoa2V5LCBzZWxlY3Rpb25zW2tleV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZWQ7XG4gIH1cblxuICBpZiAoaXNPYmplY3QocGF0dGVybikpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVHVwbGUgcGF0dGVyblxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBsZXQgc3RhcnRQYXR0ZXJucyA9IFtdO1xuICAgICAgbGV0IGVuZFBhdHRlcm5zID0gW107XG4gICAgICBsZXQgdmFyaWFkaWNQYXR0ZXJuczogQW55TWF0Y2hlcltdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgaSBvZiBwYXR0ZXJuLmtleXMoKSkge1xuICAgICAgICBjb25zdCBzdWJwYXR0ZXJuID0gcGF0dGVybltpXTtcbiAgICAgICAgaWYgKGlzTWF0Y2hlcihzdWJwYXR0ZXJuKSAmJiBzdWJwYXR0ZXJuW3N5bWJvbHMuaXNWYXJpYWRpY10pIHtcbiAgICAgICAgICB2YXJpYWRpY1BhdHRlcm5zLnB1c2goc3VicGF0dGVybik7XG4gICAgICAgIH0gZWxzZSBpZiAodmFyaWFkaWNQYXR0ZXJucy5sZW5ndGgpIHtcbiAgICAgICAgICBlbmRQYXR0ZXJucy5wdXNoKHN1YnBhdHRlcm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXJ0UGF0dGVybnMucHVzaChzdWJwYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFkaWNQYXR0ZXJucy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHZhcmlhZGljUGF0dGVybnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBQYXR0ZXJuIGVycm9yOiBVc2luZyBcXGAuLi5QLmFycmF5KC4uLilcXGAgc2V2ZXJhbCB0aW1lcyBpbiBhIHNpbmdsZSBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHN0YXJ0UGF0dGVybnMubGVuZ3RoICsgZW5kUGF0dGVybnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZXMgPSB2YWx1ZS5zbGljZSgwLCBzdGFydFBhdHRlcm5zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlcyA9XG4gICAgICAgICAgZW5kUGF0dGVybnMubGVuZ3RoID09PSAwID8gW10gOiB2YWx1ZS5zbGljZSgtZW5kUGF0dGVybnMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbWlkZGxlVmFsdWVzID0gdmFsdWUuc2xpY2UoXG4gICAgICAgICAgc3RhcnRQYXR0ZXJucy5sZW5ndGgsXG4gICAgICAgICAgZW5kUGF0dGVybnMubGVuZ3RoID09PSAwID8gSW5maW5pdHkgOiAtZW5kUGF0dGVybnMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzdGFydFBhdHRlcm5zLmV2ZXJ5KChzdWJQYXR0ZXJuLCBpKSA9PlxuICAgICAgICAgICAgbWF0Y2hQYXR0ZXJuKHN1YlBhdHRlcm4sIHN0YXJ0VmFsdWVzW2ldLCBzZWxlY3QpXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIGVuZFBhdHRlcm5zLmV2ZXJ5KChzdWJQYXR0ZXJuLCBpKSA9PlxuICAgICAgICAgICAgbWF0Y2hQYXR0ZXJuKHN1YlBhdHRlcm4sIGVuZFZhbHVlc1tpXSwgc2VsZWN0KVxuICAgICAgICAgICkgJiZcbiAgICAgICAgICAodmFyaWFkaWNQYXR0ZXJucy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBtYXRjaFBhdHRlcm4odmFyaWFkaWNQYXR0ZXJuc1swXSwgbWlkZGxlVmFsdWVzLCBzZWxlY3QpKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGF0dGVybi5sZW5ndGggPT09IHZhbHVlLmxlbmd0aFxuICAgICAgICA/IHBhdHRlcm4uZXZlcnkoKHN1YlBhdHRlcm4sIGkpID0+XG4gICAgICAgICAgICBtYXRjaFBhdHRlcm4oc3ViUGF0dGVybiwgdmFsdWVbaV0sIHNlbGVjdClcbiAgICAgICAgICApXG4gICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhwYXR0ZXJuKS5ldmVyeSgoayk6IGJvb2xlYW4gPT4ge1xuICAgICAgY29uc3Qgc3ViUGF0dGVybiA9IHBhdHRlcm5ba107XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIChrIGluIHZhbHVlIHx8IGlzT3B0aW9uYWxQYXR0ZXJuKHN1YlBhdHRlcm4pKSAmJlxuICAgICAgICBtYXRjaFBhdHRlcm4oc3ViUGF0dGVybiwgdmFsdWVba10sIHNlbGVjdClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlLCBwYXR0ZXJuKTtcbn07XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGdldFNlbGVjdGlvbktleXMgPSAocGF0dGVybjogYW55KTogc3RyaW5nW10gPT4ge1xuICBpZiAoaXNPYmplY3QocGF0dGVybikpIHtcbiAgICBpZiAoaXNNYXRjaGVyKHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gcGF0dGVybltzeW1ib2xzLm1hdGNoZXJdKCkuZ2V0U2VsZWN0aW9uS2V5cz8uKCkgPz8gW107XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSByZXR1cm4gZmxhdE1hcChwYXR0ZXJuLCBnZXRTZWxlY3Rpb25LZXlzKTtcbiAgICByZXR1cm4gZmxhdE1hcChPYmplY3QudmFsdWVzKHBhdHRlcm4pLCBnZXRTZWxlY3Rpb25LZXlzKTtcbiAgfVxuICByZXR1cm4gW107XG59O1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBmbGF0TWFwID0gPGEsIGI+KFxuICB4czogcmVhZG9ubHkgYVtdLFxuICBmOiAodjogYSkgPT4gcmVhZG9ubHkgYltdXG4pOiBiW10gPT4geHMucmVkdWNlPGJbXT4oKGFjYywgeCkgPT4gYWNjLmNvbmNhdChmKHgpKSwgW10pO1xuIiwgImltcG9ydCB7IE1hdGNoZWRWYWx1ZSwgUGF0dGVybiwgVW5rbm93blByb3BlcnRpZXMgfSBmcm9tICcuL3R5cGVzL1BhdHRlcm4nO1xuaW1wb3J0ICogYXMgUCBmcm9tICcuL3BhdHRlcm5zJztcbmltcG9ydCB7IG1hdGNoUGF0dGVybiB9IGZyb20gJy4vaW50ZXJuYWxzL2hlbHBlcnMnO1xuXG4vKipcbiAqIFRoaXMgY29uc3RyYWludCBhbGxvd3MgdXNpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKiBpbiBvYmplY3QgcGF0dGVybnMuIFNlZSBcInNob3VsZCBhbGxvdyB0YXJnZXR0aW5nIHVua25vd24gcHJvcGVydGllc1wiXG4gKiB1bml0IHRlc3QgaW4gYGlzLW1hdGNoaW5nLnRlc3QudHNgLlxuICovXG50eXBlIFBhdHRlcm5Db25zdHJhaW50PFQ+ID0gVCBleHRlbmRzIHJlYWRvbmx5IGFueVtdXG4gID8gUC5QYXR0ZXJuPFQ+XG4gIDogVCBleHRlbmRzIG9iamVjdFxuICA/IFAuUGF0dGVybjxUPiAmIFVua25vd25Qcm9wZXJ0aWVzXG4gIDogUC5QYXR0ZXJuPFQ+O1xuXG4vKipcbiAqIGBpc01hdGNoaW5nYCB0YWtlcyBwYXR0ZXJuIGFuZCByZXR1cm5zIGEgKip0eXBlIGd1YXJkKiogZnVuY3Rpb24sIGNoZWNoaW5nIGlmIGEgdmFsdWUgbWF0Y2hlcyB0aGlzIHBhdHRlcm4uXG4gKlxuICogW1JlYWQgIGRvY3VtZW50YXRpb24gZm9yIGBpc01hdGNoaW5nYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNpc21hdGNoaW5nKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgY29uc3QgaGFzTmFtZSA9IGlzTWF0Y2hpbmcoeyBuYW1lOiBQLnN0cmluZyB9KVxuICpcbiAqICBkZWNsYXJlIGxldCBpbnB1dDogdW5rbm93blxuICpcbiAqICBpZiAoaGFzTmFtZShpbnB1dCkpIHtcbiAqICAgIC8vIGBpbnB1dGAgaW5mZXJyZWQgYXMgeyBuYW1lOiBzdHJpbmcgfVxuICogICAgcmV0dXJuIGlucHV0Lm5hbWVcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nPGNvbnN0IHAgZXh0ZW5kcyBQYXR0ZXJuPHVua25vd24+PihcbiAgcGF0dGVybjogcFxuKTogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBQLmluZmVyPHA+O1xuLyoqXG4gKiBgaXNNYXRjaGluZ2AgdGFrZXMgcGF0dGVybiBhbmQgYSB2YWx1ZSBhbmQgY2hlY2tzIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoaXMgcGF0dGVybi5cbiAqXG4gKiBbUmVhZCAgZG9jdW1lbnRhdGlvbiBmb3IgYGlzTWF0Y2hpbmdgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI2lzbWF0Y2hpbmcpXG4gKlxuICogQGV4YW1wbGVcbiAqICBkZWNsYXJlIGxldCBpbnB1dDogdW5rbm93blxuICpcbiAqICBpZiAoaXNNYXRjaGluZyh7IG5hbWU6IFAuc3RyaW5nIH0sIGlucHV0KSkge1xuICogICAgLy8gYGlucHV0YCBpbmZlcnJlZCBhcyB7IG5hbWU6IHN0cmluZyB9XG4gKiAgICByZXR1cm4gaW5wdXQubmFtZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmc8Y29uc3QgVCwgY29uc3QgUCBleHRlbmRzIFBhdHRlcm5Db25zdHJhaW50PFQ+PihcbiAgcGF0dGVybjogUCxcbiAgdmFsdWU6IFRcbik6IHZhbHVlIGlzIFAuaW5mZXI8UD47XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nPGNvbnN0IHAgZXh0ZW5kcyBQYXR0ZXJuPGFueT4+KFxuICAuLi5hcmdzOiBbcGF0dGVybjogcCwgdmFsdWU/OiBhbnldXG4pOiBib29sZWFuIHwgKCh2YWxlOiBhbnkpID0+IGJvb2xlYW4pIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgW3BhdHRlcm5dID0gYXJncztcbiAgICByZXR1cm4gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBNYXRjaGVkVmFsdWU8YW55LCBQLmluZmVyPHA+PiA9PlxuICAgICAgbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHZhbHVlLCAoKSA9PiB7fSk7XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgW3BhdHRlcm4sIHZhbHVlXSA9IGFyZ3M7XG4gICAgcmV0dXJuIG1hdGNoUGF0dGVybihwYXR0ZXJuLCB2YWx1ZSwgKCkgPT4ge30pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBpc01hdGNoaW5nIHdhc24ndCBnaXZlbiB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50czogZXhwZWN0ZWQgMSBvciAyLCByZWNlaXZlZCAke2FyZ3MubGVuZ3RofS5gXG4gICk7XG59XG4iLCAiLyoqXG4gKiBUaGUgYFBgIG1vZHVsZSBjb250YWlucyBwYXR0ZXJucyBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aWxkY2FyZHMgYW5kXG4gKiBvdGhlciBwYXR0ZXJuLW1hdGNoaW5nIHV0aWxpdGllcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWF0Y2hQYXR0ZXJuLCBnZXRTZWxlY3Rpb25LZXlzLCBmbGF0TWFwIH0gZnJvbSAnLi9pbnRlcm5hbHMvaGVscGVycyc7XG5pbXBvcnQgKiBhcyBzeW1ib2xzIGZyb20gJy4vaW50ZXJuYWxzL3N5bWJvbHMnO1xuaW1wb3J0IHsgbWF0Y2hlciB9IGZyb20gJy4vaW50ZXJuYWxzL3N5bWJvbHMnO1xuaW1wb3J0IHsgaXNNYXRjaGluZyB9IGZyb20gJy4vaXMtbWF0Y2hpbmcnO1xuaW1wb3J0IHsgRXh0cmFjdFByZWNpc2VWYWx1ZSB9IGZyb20gJy4vdHlwZXMvRXh0cmFjdFByZWNpc2VWYWx1ZSc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJy4vdHlwZXMvaGVscGVycyc7XG5pbXBvcnQgeyBJbnZlcnRQYXR0ZXJuIH0gZnJvbSAnLi90eXBlcy9JbnZlcnRQYXR0ZXJuJztcbmltcG9ydCB7XG4gIFBhdHRlcm4sXG4gIFVua25vd25QYXR0ZXJuLFxuICBPcHRpb25hbFAsXG4gIEFycmF5UCxcbiAgTWFwUCxcbiAgU2V0UCxcbiAgQW5kUCxcbiAgT3JQLFxuICBOb3RQLFxuICBHdWFyZFAsXG4gIFNlbGVjdFAsXG4gIEFub255bW91c1NlbGVjdFAsXG4gIEd1YXJkRXhjbHVkZVAsXG4gIEN1c3RvbVAsXG4gIE1hdGNoZXIsXG4gIFN0cmluZ1BhdHRlcm4sXG4gIEFueVBhdHRlcm4sXG4gIE51bWJlclBhdHRlcm4sXG4gIEJvb2xlYW5QYXR0ZXJuLFxuICBCaWdJbnRQYXR0ZXJuLFxuICBOdWxsaXNoUGF0dGVybixcbiAgU3ltYm9sUGF0dGVybixcbiAgQ2hhaW5hYmxlLFxuICBCaWdJbnRDaGFpbmFibGUsXG4gIE51bWJlckNoYWluYWJsZSxcbiAgU3RyaW5nQ2hhaW5hYmxlLFxuICBBcnJheUNoYWluYWJsZSxcbiAgVmFyaWFkaWMsXG4gIE5vbk51bGxhYmxlUGF0dGVybixcbn0gZnJvbSAnLi90eXBlcy9QYXR0ZXJuJztcblxuZXhwb3J0IHR5cGUge1xuICAvKipcbiAgICogYFBhdHRlcm48VD5gIGlzIHRoZSB0eXBlIG9mIGFsbCBwYXR0ZXJuc1xuICAgKiB0aGF0IGNhbiBtYXRjaCBhIHZhbHVlIG9mIHR5cGUgYFRgLlxuICAgKi9cbiAgUGF0dGVybixcblxuICAvKipcbiAgICogYHVuc3RhYmxlX0ZuYCBjYW4gYmUgdXNlZCB0byBjcmVhdGVkIGFcbiAgICogYSBNYXRjaGFibGUgaW5zdGFuY2Ug4oCTIGEgY3VzdG9tIHR5cGUgdGhhdFxuICAgKiBjYW4gYmUgdXNlZCBhcyBhIHBhdHRlcm4uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVGhpcyBmZWF0dXJlIGlzIHVuc3RhYmxlLlxuICAgKi9cbiAgRm4gYXMgdW5zdGFibGVfRm4sXG59O1xuXG5leHBvcnQgeyBtYXRjaGVyIH07XG5cbi8qKlxuICogQSBgTWF0Y2hhYmxlYCBpcyBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4gKiB0aGUgTWF0Y2hlciBQcm90b2NvbC4gSXQgbXVzdCBoYXZlIGEgYFtQLm1hdGNoZXJdOiBQLk1hdGNoZXI8TmFycm93Rm4+YFxuICoga2V5LCB3aGljaCBkZWZpbmVzIGhvdyB0aGlzIG9iamVjdCBzaG91bGQgYmUgbWF0Y2hlZCBieSBUUy1QYXR0ZXJuLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBmZWF0dXJlIGlzIHVuc3RhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY2xhc3MgU29tZTxUPiBpbXBsZW1lbnRzIFAudW5zdGFibGVfTWF0Y2hhYmxlIHtcbiAqICBbUC5tYXRjaGVyXSgpOiBQLnVuc3RhYmxlX01hdGNoZXI8U29tZTxUPj5cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSB1bnN0YWJsZV9NYXRjaGFibGU8XG4gIG5hcnJvd2VkT3JGbixcbiAgaW5wdXQgPSB1bmtub3duLFxuICBwYXR0ZXJuID0gbmV2ZXJcbj4gPSBDdXN0b21QPGlucHV0LCBwYXR0ZXJuLCBuYXJyb3dlZE9yRm4+O1xuXG4vKipcbiAqIEEgYE1hdGNoZXJgIGlzIGFuIG9iamVjdCB3aXRoIGBtYXRjaGAgZnVuY3Rpb24sIHdoaWNoXG4gKiBkZWZpbmVzIGhvdyB0aGlzIG9iamVjdCBzaG91bGQgYmUgbWF0Y2hlZCBieSBUUy1QYXR0ZXJuLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBmZWF0dXJlIGlzIHVuc3RhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY2xhc3MgU29tZTxUPiBpbXBsZW1lbnRzIFAudW5zdGFibGVfTWF0Y2hhYmxlIHtcbiAqICBbUC5tYXRjaGVyXSgpOiBQLnVuc3RhYmxlX01hdGNoZXI8U29tZTxUPj5cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSB1bnN0YWJsZV9NYXRjaGVyPFxuICBuYXJyb3dlZE9yRm4sXG4gIGlucHV0ID0gdW5rbm93bixcbiAgcGF0dGVybiA9IG5ldmVyXG4+ID0gUmV0dXJuVHlwZTxDdXN0b21QPGlucHV0LCBwYXR0ZXJuLCBuYXJyb3dlZE9yRm4+W21hdGNoZXJdPjtcblxuLyoqXG4gKiBgUC5pbmZlcjx0eXBlb2Ygc29tZVBhdHRlcm4+YCB3aWxsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgdmFsdWVcbiAqIG1hdGNoZWQgYnkgdGhpcyBwYXR0ZXJuLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5pbmZlcmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGluZmVyKVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB1c2VyUGF0dGVybiA9IHsgbmFtZTogUC5zdHJpbmfCoH1cbiAqIHR5cGUgVXNlciA9IFAuaW5mZXI8dHlwZW9mIHVzZXJQYXR0ZXJuPlxuICovXG5leHBvcnQgdHlwZSBpbmZlcjxwYXR0ZXJuPiA9IEludmVydFBhdHRlcm48Tm9JbmZlcjxwYXR0ZXJuPiwgdW5rbm93bj47XG5cbi8qKlxuICogYFAubmFycm93PElucHV0LCBQYXR0ZXJuPmAgd2lsbCBuYXJyb3cgdGhlIGlucHV0IHR5cGUgdG8gb25seSBrZWVwXG4gKiB0aGUgc2V0IG9mIHZhbHVlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIHByb3ZpZGVkIHBhdHRlcm4gdHlwZS5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubmFycm93YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbmFycm93KVxuICpcbiAqIEBleGFtcGxlXG4gKiB0eXBlIElucHV0ID0gWydhJyB8ICdiJyB8ICdjJywgJ2EnIHwgJ2InIHwgJ2MnXVxuICogY29uc3QgUGF0dGVybiA9IFsnYScsIFAudW5pb24oJ2EnLCAnYicpXSBhcyBjb25zdFxuICpcbiAqIHR5cGUgTmFycm93ZWQgPSBQLm5hcnJvdzxJbnB1dCwgdHlwZW9mIFBhdHRlcm4+XG4gKiAvLyAgICAgXj8gWydhJywgJ2EnIHwgJ2InXVxuICovXG5leHBvcnQgdHlwZSBuYXJyb3c8aW5wdXQsIHBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuPGFueT4+ID0gRXh0cmFjdFByZWNpc2VWYWx1ZTxcbiAgaW5wdXQsXG4gIEludmVydFBhdHRlcm48cGF0dGVybiwgaW5wdXQ+XG4+O1xuXG5mdW5jdGlvbiBjaGFpbmFibGU8cGF0dGVybiBleHRlbmRzIE1hdGNoZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PihcbiAgcGF0dGVybjogcGF0dGVyblxuKTogQ2hhaW5hYmxlPHBhdHRlcm4+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGF0dGVybiwge1xuICAgIG9wdGlvbmFsOiAoKSA9PiBvcHRpb25hbChwYXR0ZXJuKSxcbiAgICBhbmQ6IChwMjogYW55KSA9PiBpbnRlcnNlY3Rpb24ocGF0dGVybiwgcDIpLFxuICAgIG9yOiAocDI6IGFueSkgPT4gdW5pb24ocGF0dGVybiwgcDIpLFxuICAgIHNlbGVjdDogKGtleTogYW55KSA9PlxuICAgICAga2V5ID09PSB1bmRlZmluZWQgPyBzZWxlY3QocGF0dGVybikgOiBzZWxlY3Qoa2V5LCBwYXR0ZXJuKSxcbiAgfSkgYXMgQ2hhaW5hYmxlPHBhdHRlcm4+O1xufVxuXG5jb25zdCB2YXJpYWRpYyA9IDxwYXR0ZXJuIGV4dGVuZHMge30+KHBhdHRlcm46IHBhdHRlcm4pOiBWYXJpYWRpYzxwYXR0ZXJuPiA9PlxuICBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxwYXR0ZXJuLCB2b2lkLCB1bmRlZmluZWQ+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGNvbnN0IHZhcmlhZGljUGF0dGVybiA9IE9iamVjdC5hc3NpZ24ocGF0dGVybiwge1xuICAgICAgICBbc3ltYm9scy5pc1ZhcmlhZGljXTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsdWVzOiBJdGVyYXRvclJlc3VsdDxwYXR0ZXJuLCB2b2lkPltdID0gW1xuICAgICAgICB7IHZhbHVlOiB2YXJpYWRpY1BhdHRlcm4sIGRvbmU6IGZhbHNlIH0sXG4gICAgICAgIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuICAgICAgXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6ICgpID0+IHZhbHVlc1tpKytdID8/IHZhbHVlcy5hdCgtMSkhLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcblxuZnVuY3Rpb24gYXJyYXlDaGFpbmFibGU8cGF0dGVybiBleHRlbmRzIE1hdGNoZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PihcbiAgcGF0dGVybjogcGF0dGVyblxuKTogQXJyYXlDaGFpbmFibGU8cGF0dGVybj4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih2YXJpYWRpYyhwYXR0ZXJuKSwge1xuICAgIG9wdGlvbmFsOiAoKSA9PiBhcnJheUNoYWluYWJsZShvcHRpb25hbChwYXR0ZXJuKSksXG4gICAgc2VsZWN0OiAoa2V5OiBhbnkpID0+XG4gICAgICBhcnJheUNoYWluYWJsZShcbiAgICAgICAga2V5ID09PSB1bmRlZmluZWQgPyBzZWxlY3QocGF0dGVybikgOiBzZWxlY3Qoa2V5LCBwYXR0ZXJuKVxuICAgICAgKSxcbiAgfSkgYXMgYW55O1xufVxuXG4vKipcbiAqIGBQLm9wdGlvbmFsKHN1YnBhdHRlcm4pYCB0YWtlcyBhIHN1YiBwYXR0ZXJuIGFuZCByZXR1cm5zIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzIGlmIHRoZVxuICoga2V5IGlzIHVuZGVmaW5lZCBvciBpZiBpdCBpcyBkZWZpbmVkIGFuZCB0aGUgc3ViIHBhdHRlcm4gbWF0Y2hlcyBpdHMgdmFsdWUuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm9wdGlvbmFsYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwb3B0aW9uYWwtcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoeyBncmVldGluZzogUC5vcHRpb25hbCgnSGVsbG8nKSB9LCAoKSA9PiAnd2lsbCBtYXRjaCB7IGdyZWV0aW5nPzogXCJIZWxsb1wiwqB9JylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsPFxuICBpbnB1dCxcbiAgY29uc3QgcGF0dGVybiBleHRlbmRzIHVua25vd24gZXh0ZW5kcyBpbnB1dCA/IFVua25vd25QYXR0ZXJuIDogUGF0dGVybjxpbnB1dD5cbj4ocGF0dGVybjogcGF0dGVybik6IENoYWluYWJsZTxPcHRpb25hbFA8aW5wdXQsIHBhdHRlcm4+LCAnb3B0aW9uYWwnPiB7XG4gIHJldHVybiBjaGFpbmFibGUoe1xuICAgIFttYXRjaGVyXSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoOiA8VW5rbm93bklucHV0Pih2YWx1ZTogVW5rbm93bklucHV0IHwgaW5wdXQpID0+IHtcbiAgICAgICAgICBsZXQgc2VsZWN0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHt9O1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBnZXRTZWxlY3Rpb25LZXlzKHBhdHRlcm4pLmZvckVhY2goKGtleSkgPT5cbiAgICAgICAgICAgICAgc2VsZWN0b3Ioa2V5LCB1bmRlZmluZWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgc2VsZWN0aW9ucyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHZhbHVlLCBzZWxlY3Rvcik7XG4gICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9O1xuICAgICAgICB9LFxuICAgICAgICBnZXRTZWxlY3Rpb25LZXlzOiAoKSA9PiBnZXRTZWxlY3Rpb25LZXlzKHBhdHRlcm4pLFxuICAgICAgICBtYXRjaGVyVHlwZTogJ29wdGlvbmFsJyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbnR5cGUgVW53cmFwQXJyYXk8eHM+ID0geHMgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgeClbXSA/IHggOiBuZXZlcjtcblxudHlwZSBVbndyYXBTZXQ8eHM+ID0geHMgZXh0ZW5kcyBTZXQ8aW5mZXIgeD4gPyB4IDogbmV2ZXI7XG5cbnR5cGUgVW53cmFwTWFwS2V5PHhzPiA9IHhzIGV4dGVuZHMgTWFwPGluZmVyIGssIGFueT4gPyBrIDogbmV2ZXI7XG5cbnR5cGUgVW53cmFwTWFwVmFsdWU8eHM+ID0geHMgZXh0ZW5kcyBNYXA8YW55LCBpbmZlciB2PiA/IHYgOiBuZXZlcjtcblxudHlwZSBXaXRoRGVmYXVsdDxhLCBiPiA9IFthXSBleHRlbmRzIFtuZXZlcl0gPyBiIDogYTtcblxuLyoqXG4gKiBgUC5hcnJheShzdWJwYXR0ZXJuKWAgdGFrZXMgYSBzdWIgcGF0dGVybiBhbmQgcmV0dXJucyBhIHBhdHRlcm4sIHdoaWNoIG1hdGNoZXNcbiAqIGFycmF5cyBpZiBhbGwgdGhlaXIgZWxlbWVudHMgbWF0Y2ggdGhlIHN1YiBwYXR0ZXJuLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5hcnJheWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGFycmF5LXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKHsgdXNlcnM6IFAuYXJyYXkoeyBuYW1lOiBQLnN0cmluZyB9KSB9LCAoKSA9PiAnd2lsbCBtYXRjaCB7IG5hbWU6IHN0cmluZ8KgfVtdJylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5PGlucHV0PigpOiBBcnJheUNoYWluYWJsZTxBcnJheVA8aW5wdXQsIHVua25vd24+PjtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheTxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcEFycmF5PGlucHV0PiwgdW5rbm93bj4+XG4+KHBhdHRlcm46IHBhdHRlcm4pOiBBcnJheUNoYWluYWJsZTxBcnJheVA8aW5wdXQsIHBhdHRlcm4+PjtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheShcbiAgLi4uYXJnczogW3BhdHRlcm4/OiBhbnldXG4pOiBBcnJheUNoYWluYWJsZTxBcnJheVA8YW55LCBhbnk+PiB7XG4gIHJldHVybiBhcnJheUNoYWluYWJsZSh7XG4gICAgW21hdGNoZXJdKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2g6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHsgbWF0Y2hlZDogZmFsc2UgfTtcblxuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSB9O1xuXG4gICAgICAgICAgY29uc3QgcGF0dGVybiA9IGFyZ3NbMF07XG4gICAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcblxuICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFNlbGVjdGlvbktleXMocGF0dGVybikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIHNlbGVjdGlvbnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBtYXRjaGVkOiB0cnVlLCBzZWxlY3Rpb25zIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSAoc2VsZWN0aW9uc1trZXldIHx8IFtdKS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSB2YWx1ZS5ldmVyeSgodikgPT5cbiAgICAgICAgICAgIG1hdGNoUGF0dGVybihwYXR0ZXJuLCB2LCBzZWxlY3RvcilcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9O1xuICAgICAgICB9LFxuICAgICAgICBnZXRTZWxlY3Rpb25LZXlzOiAoKSA9PlxuICAgICAgICAgIGFyZ3MubGVuZ3RoID09PSAwID8gW10gOiBnZXRTZWxlY3Rpb25LZXlzKGFyZ3NbMF0pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBgUC5zZXQoc3VicGF0dGVybilgIHRha2VzIGEgc3ViIHBhdHRlcm4gYW5kIHJldHVybnMgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlc1xuICogc2V0cyBpZiBhbGwgdGhlaXIgZWxlbWVudHMgbWF0Y2ggdGhlIHN1YiBwYXR0ZXJuLlxuICpcbiAqIFtSZWFkIGBQLnNldGAgZG9jdW1lbnRhdGlvbiBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwc2V0LXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKHsgdXNlcnM6IFAuc2V0KFAuc3RyaW5nKSB9LCAoKSA9PiAnd2lsbCBtYXRjaCBTZXQ8c3RyaW5nPicpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQ8aW5wdXQ+KCk6IENoYWluYWJsZTxTZXRQPGlucHV0LCB1bmtub3duPj47XG5leHBvcnQgZnVuY3Rpb24gc2V0PFxuICBpbnB1dCxcbiAgY29uc3QgcGF0dGVybiBleHRlbmRzIFBhdHRlcm48V2l0aERlZmF1bHQ8VW53cmFwU2V0PGlucHV0PiwgdW5rbm93bj4+XG4+KHBhdHRlcm46IHBhdHRlcm4pOiBDaGFpbmFibGU8U2V0UDxpbnB1dCwgcGF0dGVybj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNldDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcFNldDxpbnB1dD4sIHVua25vd24+PlxuPiguLi5hcmdzOiBbcGF0dGVybj86IHBhdHRlcm5dKTogQ2hhaW5hYmxlPFNldFA8aW5wdXQsIHBhdHRlcm4+PiB7XG4gIHJldHVybiBjaGFpbmFibGUoe1xuICAgIFttYXRjaGVyXSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoOiA8VW5rbm93bklucHV0Pih2YWx1ZTogVW5rbm93bklucHV0IHwgaW5wdXQpID0+IHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFNldCkpIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlIH07XG5cbiAgICAgICAgICBsZXQgc2VsZWN0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHt9O1xuXG4gICAgICAgICAgaWYgKHZhbHVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQ6IHRydWUsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hdGNoZWQ6IHRydWUgfTtcblxuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gKHNlbGVjdGlvbnNba2V5XSB8fCBbXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gYXJnc1swXTtcblxuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBzZXRFdmVyeSh2YWx1ZSwgKHYpID0+XG4gICAgICAgICAgICBtYXRjaFBhdHRlcm4ocGF0dGVybiwgdiwgc2VsZWN0b3IpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT5cbiAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMCA/IFtdIDogZ2V0U2VsZWN0aW9uS2V5cyhhcmdzWzBdKSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmNvbnN0IHNldEV2ZXJ5ID0gPFQ+KHNldDogU2V0PFQ+LCBwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbikgPT4ge1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNldCkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSBjb250aW51ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIGBQLm1hcChrZXlQYXR0ZXJuLCB2YWx1ZVBhdHRlcm4pYCB0YWtlcyBhIHN1YnBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdCB0aGVcbiAqIGtleSwgYSBzdWJwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgdGhlIHZhbHVlIGFuZCByZXR1cm5zIGEgcGF0dGVybiB0aGF0XG4gKiBtYXRjaGVzIG9uIG1hcHMgd2hlcmUgYWxsIGVsZW1lbnRzIGluc2lkZSB0aGUgbWFwIG1hdGNoIHRob3NlIHR3b1xuICogc3VicGF0dGVybnMuXG4gKlxuICogW1JlYWQgYFAubWFwYCBkb2N1bWVudGF0aW9uIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BtYXAtcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoeyB1c2VyczogUC5tYXAoUC5tYXAoUC5zdHJpbmcsIFAubnVtYmVyKSkgfSwgKG1hcCkgPT4gYG1hcCdzIHR5cGUgaXMgTWFwPHN0cmluZywgbnVtYmVyPmApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXA8aW5wdXQ+KCk6IENoYWluYWJsZTxNYXBQPGlucHV0LCB1bmtub3duLCB1bmtub3duPj47XG5leHBvcnQgZnVuY3Rpb24gbWFwPFxuICBpbnB1dCxcbiAgY29uc3QgcGtleSBleHRlbmRzIFBhdHRlcm48V2l0aERlZmF1bHQ8VW53cmFwTWFwS2V5PGlucHV0PiwgdW5rbm93bj4+LFxuICBjb25zdCBwdmFsdWUgZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcE1hcFZhbHVlPGlucHV0PiwgdW5rbm93bj4+XG4+KHBhdHRlcm5LZXk6IHBrZXksIHBhdHRlcm5WYWx1ZTogcHZhbHVlKTogQ2hhaW5hYmxlPE1hcFA8aW5wdXQsIHBrZXksIHB2YWx1ZT4+O1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBrZXkgZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcE1hcEtleTxpbnB1dD4sIHVua25vd24+PixcbiAgY29uc3QgcHZhbHVlIGV4dGVuZHMgUGF0dGVybjxXaXRoRGVmYXVsdDxVbndyYXBNYXBWYWx1ZTxpbnB1dD4sIHVua25vd24+PlxuPihcbiAgLi4uYXJnczogW3BhdHRlcm5LZXk/OiBwa2V5LCBwYXR0ZXJuVmFsdWU/OiBwdmFsdWVdXG4pOiBDaGFpbmFibGU8TWFwUDxpbnB1dCwgcGtleSwgcHZhbHVlPj4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl0oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaDogPFVua25vd25JbnB1dD4odmFsdWU6IFVua25vd25JbnB1dCB8IGlucHV0KSA9PiB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBNYXApKSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuXG4gICAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcblxuICAgICAgICAgIGlmICh2YWx1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtYXRjaGVkOiB0cnVlLCBzZWxlY3Rpb25zIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSAoc2VsZWN0aW9uc1trZXldIHx8IFtdKS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSB9O1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgXFxgUC5tYXBcXGAgd2FzblxcJ3QgZ2l2ZW4gZW5vdWdoIGFyZ3VtZW50cy4gRXhwZWN0ZWQgKGtleSwgdmFsdWUpLCByZWNlaXZlZCAke2FyZ3NbMF0/LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW3BhdHRlcm5LZXksIHBhdHRlcm5WYWx1ZV0gPSBhcmdzO1xuXG4gICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hcEV2ZXJ5KHZhbHVlLCAodiwgaykgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5TWF0Y2ggPSBtYXRjaFBhdHRlcm4ocGF0dGVybktleSwgaywgc2VsZWN0b3IpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVNYXRjaCA9IG1hdGNoUGF0dGVybihwYXR0ZXJuVmFsdWUsIHYsIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlNYXRjaCAmJiB2YWx1ZU1hdGNoO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9O1xuICAgICAgICB9LFxuICAgICAgICBnZXRTZWxlY3Rpb25LZXlzOiAoKSA9PlxuICAgICAgICAgIGFyZ3MubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IFsuLi5nZXRTZWxlY3Rpb25LZXlzKGFyZ3NbMF0pLCAuLi5nZXRTZWxlY3Rpb25LZXlzKGFyZ3NbMV0pXSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmNvbnN0IG1hcEV2ZXJ5ID0gPEssIFQ+KFxuICBtYXA6IE1hcDxLLCBUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGtleTogSykgPT4gYm9vbGVhblxuKSA9PiB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcC5lbnRyaWVzKCkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXkpKSBjb250aW51ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIGBQLmludGVyc2VjdGlvbiguLi5wYXR0ZXJucylgIHJldHVybnMgYSBwYXR0ZXJuIHdoaWNoIG1hdGNoZXNcbiAqIG9ubHkgaWYgKipldmVyeSoqIHBhdHRlcm5zIHByb3ZpZGVkIGluIHBhcmFtZXRlciBtYXRjaCB0aGUgaW5wdXQuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmludGVyc2VjdGlvbmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGludGVyc2VjdGlvbi1wYXR0ZXJucylcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChcbiAqICAgICB7XG4gKiAgICAgICB1c2VyOiBQLmludGVyc2VjdGlvbihcbiAqICAgICAgICAgeyBmaXJzdG5hbWU6IFAuc3RyaW5nIH0sXG4gKiAgICAgICAgIHsgbGFzdG5hbWU6IFAuc3RyaW5nIH0sXG4gKiAgICAgICAgIHsgYWdlOiBQLndoZW4oYWdlID0+IGFnZSA+IDIxKSB9XG4gKiAgICAgICApXG4gKiAgICAgfSxcbiAqICAgICAoeyB1c2VyIH0pID0+ICd3aWxsIG1hdGNoIHsgZmlyc3RuYW1lOiBzdHJpbmcsIGxhc3RuYW1lOiBzdHJpbmcsIGFnZTogbnVtYmVyIH0gaWYgYWdlID4gMjEnXG4gKiAgIClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbjxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm5zIGV4dGVuZHMgcmVhZG9ubHkgW1BhdHRlcm48aW5wdXQ+LCAuLi5QYXR0ZXJuPGlucHV0PltdXVxuPiguLi5wYXR0ZXJuczogcGF0dGVybnMpOiBDaGFpbmFibGU8QW5kUDxpbnB1dCwgcGF0dGVybnM+PiB7XG4gIHJldHVybiBjaGFpbmFibGUoe1xuICAgIFttYXRjaGVyXTogKCkgPT4gKHtcbiAgICAgIG1hdGNoOiAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IChwYXR0ZXJucyBhcyByZWFkb25seSBVbmtub3duUGF0dGVybltdKS5ldmVyeSgocCkgPT5cbiAgICAgICAgICBtYXRjaFBhdHRlcm4ocCwgdmFsdWUsIHNlbGVjdG9yKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBtYXRjaGVkLCBzZWxlY3Rpb25zIH07XG4gICAgICB9LFxuICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT5cbiAgICAgICAgZmxhdE1hcChwYXR0ZXJucyBhcyByZWFkb25seSBVbmtub3duUGF0dGVybltdLCBnZXRTZWxlY3Rpb25LZXlzKSxcbiAgICAgIG1hdGNoZXJUeXBlOiAnYW5kJyxcbiAgICB9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogYFAudW5pb24oLi4ucGF0dGVybnMpYCByZXR1cm5zIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzXG4gKiBpZiAqKmF0IGxlYXN0IG9uZSoqIG9mIHRoZSBwYXR0ZXJucyBwcm92aWRlZCBpbiBwYXJhbWV0ZXIgbWF0Y2ggdGhlIGlucHV0LlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC51bmlvbmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHVuaW9uLXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFxuICogICAgIHsgdHlwZTogUC51bmlvbignYScsICdiJywgJ2MnKSB9LFxuICogICAgICh7IHR5cGUgfSkgPT4gJ3dpbGwgbWF0Y2ggeyB0eXBlOiBcImFcIiB8IFwiYlwiIHwgXCJjXCIgfSdcbiAqICAgKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb248XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJucyBleHRlbmRzIHJlYWRvbmx5IFtQYXR0ZXJuPGlucHV0PiwgLi4uUGF0dGVybjxpbnB1dD5bXV1cbj4oLi4ucGF0dGVybnM6IHBhdHRlcm5zKTogQ2hhaW5hYmxlPE9yUDxpbnB1dCwgcGF0dGVybnM+PiB7XG4gIHJldHVybiBjaGFpbmFibGUoe1xuICAgIFttYXRjaGVyXTogKCkgPT4gKHtcbiAgICAgIG1hdGNoOiA8VW5rbm93bklucHV0Pih2YWx1ZTogVW5rbm93bklucHV0IHwgaW5wdXQpID0+IHtcbiAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgZmxhdE1hcChcbiAgICAgICAgICBwYXR0ZXJucyBhcyByZWFkb25seSBVbmtub3duUGF0dGVybltdLFxuICAgICAgICAgIGdldFNlbGVjdGlvbktleXNcbiAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHNlbGVjdG9yKGtleSwgdW5kZWZpbmVkKSk7XG4gICAgICAgIGNvbnN0IG1hdGNoZWQgPSAocGF0dGVybnMgYXMgcmVhZG9ubHkgVW5rbm93blBhdHRlcm5bXSkuc29tZSgocCkgPT5cbiAgICAgICAgICBtYXRjaFBhdHRlcm4ocCwgdmFsdWUsIHNlbGVjdG9yKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBtYXRjaGVkLCBzZWxlY3Rpb25zIH07XG4gICAgICB9LFxuICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT5cbiAgICAgICAgZmxhdE1hcChwYXR0ZXJucyBhcyByZWFkb25seSBVbmtub3duUGF0dGVybltdLCBnZXRTZWxlY3Rpb25LZXlzKSxcbiAgICAgIG1hdGNoZXJUeXBlOiAnb3InLFxuICAgIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBgUC5ub3QocGF0dGVybilgIHJldHVybnMgYSBwYXR0ZXJuIHdoaWNoIG1hdGNoZXMgaWYgdGhlIHN1YiBwYXR0ZXJuXG4gKiBkb2Vzbid0IG1hdGNoLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5ub3RgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3Bub3QtcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaDx7IGE6IHN0cmluZyB8IG51bWJlciB9Pih2YWx1ZSlcbiAqICAgLndpdGgoeyBhOiBQLm5vdChQLnN0cmluZykgfSwgKHgpID0+ICd3aWxsIG1hdGNoIHsgYTogbnVtYmVyIH0nXG4gKiAgIClcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm90PFxuICBpbnB1dCxcbiAgY29uc3QgcGF0dGVybiBleHRlbmRzIFBhdHRlcm48aW5wdXQ+IHwgVW5rbm93blBhdHRlcm5cbj4ocGF0dGVybjogcGF0dGVybik6IENoYWluYWJsZTxOb3RQPGlucHV0LCBwYXR0ZXJuPj4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl06ICgpID0+ICh7XG4gICAgICBtYXRjaDogPFVua25vd25JbnB1dD4odmFsdWU6IFVua25vd25JbnB1dCB8IGlucHV0KSA9PiAoe1xuICAgICAgICBtYXRjaGVkOiAhbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHZhbHVlLCAoKSA9PiB7fSksXG4gICAgICB9KSxcbiAgICAgIGdldFNlbGVjdGlvbktleXM6ICgpID0+IFtdLFxuICAgICAgbWF0Y2hlclR5cGU6ICdub3QnLFxuICAgIH0pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBgUC53aGVuKCh2YWx1ZSkgPT4gYm9vbGVhbilgIHJldHVybnMgYSBwYXR0ZXJuIHdoaWNoIG1hdGNoZXNcbiAqIGlmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB0aGUgY3VycmVudCBpbnB1dC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAud2hlbmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHdoZW4tcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaDx7IGFnZTogbnVtYmVyIH0+KHZhbHVlKVxuICogICAud2l0aCh7IGFnZTogUC53aGVuKGFnZSA9PiBhZ2UgPiAyMSkgfSwgKHgpID0+ICd3aWxsIG1hdGNoIGlmIHZhbHVlLmFnZSA+IDIxJ1xuICogICApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGVuPGlucHV0LCBwcmVkaWNhdGUgZXh0ZW5kcyAodmFsdWU6IGlucHV0KSA9PiB1bmtub3duPihcbiAgcHJlZGljYXRlOiBwcmVkaWNhdGVcbik6IEd1YXJkUDxcbiAgaW5wdXQsXG4gIHByZWRpY2F0ZSBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBuYXJyb3dlZCA/IG5hcnJvd2VkIDogbmV2ZXJcbj47XG5leHBvcnQgZnVuY3Rpb24gd2hlbjxpbnB1dCwgbmFycm93ZWQgZXh0ZW5kcyBpbnB1dCwgZXhjbHVkZWQ+KFxuICBwcmVkaWNhdGU6IChpbnB1dDogaW5wdXQpID0+IGlucHV0IGlzIG5hcnJvd2VkXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBuYXJyb3dlZCwgZXhjbHVkZWQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW48aW5wdXQsIHByZWRpY2F0ZSBleHRlbmRzICh2YWx1ZTogaW5wdXQpID0+IHVua25vd24+KFxuICBwcmVkaWNhdGU6IHByZWRpY2F0ZVxuKTogR3VhcmRQPFxuICBpbnB1dCxcbiAgcHJlZGljYXRlIGV4dGVuZHMgKHZhbHVlOiBhbnkpID0+IHZhbHVlIGlzIGluZmVyIG5hcnJvd2VkID8gbmFycm93ZWQgOiBuZXZlclxuPiB7XG4gIHJldHVybiB7XG4gICAgW21hdGNoZXJdOiAoKSA9PiAoe1xuICAgICAgbWF0Y2g6IDxVbmtub3duSW5wdXQ+KHZhbHVlOiBVbmtub3duSW5wdXQgfCBpbnB1dCkgPT4gKHtcbiAgICAgICAgbWF0Y2hlZDogQm9vbGVhbihwcmVkaWNhdGUodmFsdWUgYXMgaW5wdXQpKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIGBQLnNlbGVjdCgpYCBpcyBhIHBhdHRlcm4gd2hpY2ggd2lsbCBhbHdheXMgbWF0Y2gsXG4gKiBhbmQgd2lsbCBpbmplY3QgdGhlIHNlbGVjdGVkIHBpZWNlIG9mIGlucHV0IGluIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zZWxlY3RgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzZWxlY3QtcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaDx7IGFnZTogbnVtYmVyIH0+KHZhbHVlKVxuICogICAud2l0aCh7IGFnZTogUC5zZWxlY3QoKSB9LCAoYWdlKSA9PiAnYWdlOiBudW1iZXInXG4gKiAgIClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdCgpOiBDaGFpbmFibGU8QW5vbnltb3VzU2VsZWN0UCwgJ3NlbGVjdCcgfCAnb3InIHwgJ2FuZCc+O1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm5PcktleSBleHRlbmRzXG4gICAgfCBzdHJpbmdcbiAgICB8ICh1bmtub3duIGV4dGVuZHMgaW5wdXQgPyBVbmtub3duUGF0dGVybiA6IFBhdHRlcm48aW5wdXQ+KVxuPihcbiAgcGF0dGVybk9yS2V5OiBwYXR0ZXJuT3JLZXlcbik6IHBhdHRlcm5PcktleSBleHRlbmRzIHN0cmluZ1xuICA/IENoYWluYWJsZTxTZWxlY3RQPHBhdHRlcm5PcktleSwgJ3NlbGVjdCcgfCAnb3InIHwgJ2FuZCc+PlxuICA6IENoYWluYWJsZTxcbiAgICAgIFNlbGVjdFA8c3ltYm9scy5hbm9ueW1vdXNTZWxlY3RLZXksIGlucHV0LCBwYXR0ZXJuT3JLZXk+LFxuICAgICAgJ3NlbGVjdCcgfCAnb3InIHwgJ2FuZCdcbiAgICA+O1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyB1bmtub3duIGV4dGVuZHMgaW5wdXQgPyBVbmtub3duUGF0dGVybiA6IFBhdHRlcm48aW5wdXQ+LFxuICBjb25zdCBrIGV4dGVuZHMgc3RyaW5nXG4+KFxuICBrZXk6IGssXG4gIHBhdHRlcm46IHBhdHRlcm5cbik6IENoYWluYWJsZTxTZWxlY3RQPGssIGlucHV0LCBwYXR0ZXJuPiwgJ3NlbGVjdCcgfCAnb3InIHwgJ2FuZCc+O1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChcbiAgLi4uYXJnczogW2tleU9yUGF0dGVybj86IHVua25vd24gfCBzdHJpbmcsIHBhdHRlcm4/OiB1bmtub3duXVxuKTogQ2hhaW5hYmxlPFNlbGVjdFA8c3RyaW5nPiwgJ3NlbGVjdCcgfCAnb3InIHwgJ2FuZCc+IHtcbiAgY29uc3Qga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyA/IGFyZ3NbMF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhdHRlcm46IHVua25vd24gPVxuICAgIGFyZ3MubGVuZ3RoID09PSAyXG4gICAgICA/IGFyZ3NbMV1cbiAgICAgIDogdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhcmdzWzBdO1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl0oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgW2tleSA/PyBzeW1ib2xzLmFub255bW91c1NlbGVjdEtleV06IHZhbHVlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoZWQ6XG4gICAgICAgICAgICAgIHBhdHRlcm4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgIDogbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHZhbHVlLCBzZWxlY3RvciksXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBzZWxlY3Rpb25zLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGdldFNlbGVjdGlvbktleXM6ICgpID0+XG4gICAgICAgICAgW2tleSA/PyBzeW1ib2xzLmFub255bW91c1NlbGVjdEtleV0uY29uY2F0KFxuICAgICAgICAgICAgcGF0dGVybiA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRTZWxlY3Rpb25LZXlzKHBhdHRlcm4pXG4gICAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzVW5rbm93bih4OiB1bmtub3duKTogeCBpcyB1bmtub3duIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyPFQ+KHg6IFQgfCBudW1iZXIpOiB4IGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nPFQ+KHg6IFQgfCBzdHJpbmcpOiB4IGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbjxUPih4OiBUIHwgYm9vbGVhbik6IHggaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludDxUPih4OiBUIHwgYmlnaW50KTogeCBpcyBiaWdpbnQge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdiaWdpbnQnO1xufVxuXG5mdW5jdGlvbiBpc1N5bWJvbDxUPih4OiBUIHwgc3ltYm9sKTogeCBpcyBzeW1ib2wge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzeW1ib2wnO1xufVxuXG5mdW5jdGlvbiBpc051bGxpc2g8VD4oeDogVCB8IG51bGwgfCB1bmRlZmluZWQpOiB4IGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzTm9uTnVsbGFibGUoeDogdW5rbm93bik6IHggaXMge30ge1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiB4ICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgQW55Q29uc3RydWN0b3IgPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cbmZ1bmN0aW9uIGlzSW5zdGFuY2VPZjxUIGV4dGVuZHMgQW55Q29uc3RydWN0b3I+KGNsYXNzQ29uc3RydWN0b3I6IFQpIHtcbiAgcmV0dXJuICh2YWw6IHVua25vd24pOiB2YWwgaXMgSW5zdGFuY2VUeXBlPFQ+ID0+XG4gICAgdmFsIGluc3RhbmNlb2YgY2xhc3NDb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBgUC5hbnlgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgKiphbnkgdmFsdWUqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYW55YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwXy13aWxkY2FyZClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLmFueSwgKCkgPT4gJ3dpbGwgYWx3YXlzIG1hdGNoJylcbiAqL1xuZXhwb3J0IGNvbnN0IGFueTogQW55UGF0dGVybiA9IGNoYWluYWJsZSh3aGVuKGlzVW5rbm93bikpO1xuXG4vKipcbiAqIGBQLl9gIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgKiphbnkgdmFsdWUqKi5cbiAqIEl0J3MgYW4gYWxpYXMgdG8gYFAuYW55YC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuX2Agb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcF8td2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5fLCAoKSA9PiAnd2lsbCBhbHdheXMgbWF0Y2gnKVxuICovXG5leHBvcnQgY29uc3QgXyA9IGFueTtcblxuLyoqXG4gKiBgUC5zdHJpbmcuc3RhcnRzV2l0aChzdGFydClgIGlzIGEgcGF0dGVybiwgbWF0Y2hpbmcgKipzdHJpbmdzKiogc3RhcnRpbmcgd2l0aCBgc3RhcnRgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcuc3RhcnRzV2l0aGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ3N0YXJ0c1dpdGgpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5zdHJpbmcuc3RhcnRzV2l0aCgnQScpLCAoKSA9PiAndmFsdWUgc3RhcnRzIHdpdGggYW4gQScpXG4gKi9cblxuY29uc3Qgc3RhcnRzV2l0aCA9IDxpbnB1dCwgY29uc3Qgc3RhcnQgZXh0ZW5kcyBzdHJpbmc+KFxuICBzdGFydDogc3RhcnRcbik6IEd1YXJkUDxpbnB1dCwgYCR7c3RhcnR9JHtzdHJpbmd9YD4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5zdGFydHNXaXRoKHN0YXJ0KSk7XG5cbi8qKlxuICogYFAuc3RyaW5nLmVuZHNXaXRoKGVuZClgIGlzIGEgcGF0dGVybiwgbWF0Y2hpbmcgKipzdHJpbmdzKiogZW5kaW5nIHdpdGggYGVuZGAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN0cmluZy5lbmRzV2l0aGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ2VuZHNXaXRoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLmVuZHNXaXRoKCchJyksICgpID0+ICd2YWx1ZSBlbmRzIHdpdGggYW4gIScpXG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gPGlucHV0LCBjb25zdCBlbmQgZXh0ZW5kcyBzdHJpbmc+KFxuICBlbmQ6IGVuZFxuKTogR3VhcmRQPGlucHV0LCBgJHtzdHJpbmd9JHtlbmR9YD4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5lbmRzV2l0aChlbmQpKTtcblxuLyoqXG4gKiBgUC5zdHJpbmcubWluTGVuZ3RoKG1pbilgIGlzIGEgcGF0dGVybiwgbWF0Y2hpbmcgKipzdHJpbmdzKiogd2l0aCBhdCBsZWFzdCBgbWluYCBjaGFyYWN0ZXJzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcubWluTGVuZ3RoYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwc3RyaW5nbWluTGVuZ3RoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLm1pbkxlbmd0aCgxMCksICgpID0+ICdzdHJpbmcgd2l0aCBtb3JlIGxlbmd0aCA+PSAxMCcpXG4gKi9cbmNvbnN0IG1pbkxlbmd0aCA9IDxjb25zdCBtaW4gZXh0ZW5kcyBudW1iZXI+KG1pbjogbWluKSA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+PSBtaW4pO1xuXG4vKipcbiAqIGBQLnN0cmluZy5sZW5ndGgobGVuKWAgaXMgYSBwYXR0ZXJuLCBtYXRjaGluZyAqKnN0cmluZ3MqKiB3aXRoIGV4YWN0bHkgYGxlbmAgY2hhcmFjdGVycy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3RyaW5nLmxlbmd0aGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ2xlbmd0aClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5sZW5ndGgoMTApLCAoKSA9PiAnc3RyaW5ncyB3aXRoIGxlbmd0aCA9PT0gMTAnKVxuICovXG5jb25zdCBsZW5ndGggPSA8Y29uc3QgbGVuIGV4dGVuZHMgbnVtYmVyPihsZW46IGxlbikgPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IGxlbik7XG5cbi8qKlxuICogYFAuc3RyaW5nLm1heExlbmd0aChtYXgpYCBpcyBhIHBhdHRlcm4sIG1hdGNoaW5nICoqc3RyaW5ncyoqIHdpdGggYXQgbW9zdCBgbWF4YCBjaGFyYWN0ZXJzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcubWF4TGVuZ3RoYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwc3RyaW5nbWF4TGVuZ3RoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLm1heExlbmd0aCgxMCksICgpID0+ICdzdHJpbmcgd2l0aCBtb3JlIGxlbmd0aCA8PSAxMCcpXG4gKi9cbmNvbnN0IG1heExlbmd0aCA9IDxjb25zdCBtYXggZXh0ZW5kcyBudW1iZXI+KG1heDogbWF4KSA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA8PSBtYXgpO1xuXG4vKipcbiAqIGBQLnN0cmluZy5pbmNsdWRlcyhzdWJzdHIpYCBpcyBhIHBhdHRlcm4sIG1hdGNoaW5nICoqc3RyaW5ncyoqIGNvbnRhaW5pbmcgYHN1YnN0cmAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN0cmluZy5pbmNsdWRlc2Agb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ2luY2x1ZGVzKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLmluY2x1ZGVzKCdodHRwJyksICgpID0+ICd2YWx1ZSBjb250YWlucyBodHRwJylcbiAqL1xuY29uc3QgaW5jbHVkZXMgPSA8aW5wdXQsIGNvbnN0IHN1YnN0ciBleHRlbmRzIHN0cmluZz4oXG4gIHN1YnN0cjogc3Vic3RyXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBzdHJpbmcsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlLmluY2x1ZGVzKHN1YnN0cikpO1xuXG4vKipcbiAqIGBQLnN0cmluZy5yZWdleChleHByKWAgaXMgYSBwYXR0ZXJuLCBtYXRjaGluZyAqKnN0cmluZ3MqKiB0aGF0IGBleHByYCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN0cmluZy5yZWdleGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ3JlZ2V4KVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLnJlZ2V4KC9eaHR0cHM/OlxcL1xcLy8pLCAoKSA9PiAndXJsJylcbiAqL1xuY29uc3QgcmVnZXggPSA8aW5wdXQsIGNvbnN0IGV4cHIgZXh0ZW5kcyBzdHJpbmcgfCBSZWdFeHA+KFxuICBleHByOiBleHByXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBzdHJpbmcsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpICYmIEJvb2xlYW4odmFsdWUubWF0Y2goZXhwcikpKTtcblxuY29uc3Qgc3RyaW5nQ2hhaW5hYmxlID0gPHBhdHRlcm4gZXh0ZW5kcyBNYXRjaGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4oXG4gIHBhdHRlcm46IHBhdHRlcm5cbik6IFN0cmluZ0NoYWluYWJsZTxwYXR0ZXJuPiA9PlxuICBPYmplY3QuYXNzaWduKGNoYWluYWJsZShwYXR0ZXJuKSwge1xuICAgIHN0YXJ0c1dpdGg6IChzdHI6IHN0cmluZykgPT5cbiAgICAgIHN0cmluZ0NoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgc3RhcnRzV2l0aChzdHIpKSksXG4gICAgZW5kc1dpdGg6IChzdHI6IHN0cmluZykgPT5cbiAgICAgIHN0cmluZ0NoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgZW5kc1dpdGgoc3RyKSkpLFxuICAgIG1pbkxlbmd0aDogKG1pbjogbnVtYmVyKSA9PlxuICAgICAgc3RyaW5nQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBtaW5MZW5ndGgobWluKSkpLFxuICAgIGxlbmd0aDogKGxlbjogbnVtYmVyKSA9PlxuICAgICAgc3RyaW5nQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBsZW5ndGgobGVuKSkpLFxuICAgIG1heExlbmd0aDogKG1heDogbnVtYmVyKSA9PlxuICAgICAgc3RyaW5nQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBtYXhMZW5ndGgobWF4KSkpLFxuICAgIGluY2x1ZGVzOiAoc3RyOiBzdHJpbmcpID0+XG4gICAgICBzdHJpbmdDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGluY2x1ZGVzKHN0cikpKSxcbiAgICByZWdleDogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIHJlZ2V4KHN0cikpKSxcbiAgfSkgYXMgYW55O1xuXG4vKipcbiAqIGBQLnN0cmluZ2AgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyBhbnkgKipzdHJpbmcqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3RyaW5nYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwc3RyaW5nLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBzdHJpbmdzJylcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZzogU3RyaW5nUGF0dGVybiA9IHN0cmluZ0NoYWluYWJsZSh3aGVuKGlzU3RyaW5nKSk7XG5cbi8qKlxuICogYFAubnVtYmVyLmJldHdlZW4obWluLCBtYXgpYCBtYXRjaGVzICoqbnVtYmVycyoqIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLFxuICogZXF1YWwgdG8gbWluIG9yIGVxdWFsIHRvIG1heC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLmJldHdlZW5gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJiZXR3ZWVuKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLmJldHdlZW4oMCwgMTApLCAoKSA9PiAnMCA8PSBudW1iZXJzIDw9IDEwJylcbiAqL1xuY29uc3QgYmV0d2VlbiA9IDxpbnB1dCwgY29uc3QgbWluIGV4dGVuZHMgbnVtYmVyLCBjb25zdCBtYXggZXh0ZW5kcyBudW1iZXI+KFxuICBtaW46IG1pbixcbiAgbWF4OiBtYXhcbik6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgbWluIDw9IHZhbHVlICYmIG1heCA+PSB2YWx1ZSk7XG5cbi8qKlxuICogYFAubnVtYmVyLmx0KG1heClgIG1hdGNoZXMgKipudW1iZXJzKiogc21hbGxlciB0aGFuIGBtYXhgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIubHRgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJsdClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5sdCgxMCksICgpID0+ICdudW1iZXJzIDwgMTAnKVxuICovXG5jb25zdCBsdCA9IDxpbnB1dCwgY29uc3QgbWF4IGV4dGVuZHMgbnVtYmVyPihcbiAgbWF4OiBtYXhcbik6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgPCBtYXgpO1xuXG4vKipcbiAqIGBQLm51bWJlci5ndChtaW4pYCBtYXRjaGVzICoqbnVtYmVycyoqIGdyZWF0ZXIgdGhhbiBgbWluYC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLmd0YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyZ3QpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIuZ3QoMTApLCAoKSA9PiAnbnVtYmVycyA+IDEwJylcbiAqL1xuY29uc3QgZ3QgPSA8aW5wdXQsIGNvbnN0IG1pbiBleHRlbmRzIG51bWJlcj4oXG4gIG1pbjogbWluXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlID4gbWluKTtcblxuLyoqXG4gKiBgUC5udW1iZXIubHRlKG1heClgIG1hdGNoZXMgKipudW1iZXJzKiogc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGBtYXhgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIubHRlYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVybHRlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLmx0ZSgxMCksICgpID0+ICdudW1iZXJzIDw9IDEwJylcbiAqL1xuY29uc3QgbHRlID0gPGlucHV0LCBjb25zdCBtYXggZXh0ZW5kcyBudW1iZXI+KFxuICBtYXg6IG1heFxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA8PSBtYXgpO1xuXG4vKipcbiAqIGBQLm51bWJlci5ndGUobWluKWAgbWF0Y2hlcyAqKm51bWJlcnMqKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG1pbmAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5ndGVgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJndGUpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIuZ3RlKDEwKSwgKCkgPT4gJ251bWJlcnMgPj0gMTAnKVxuICovXG5jb25zdCBndGUgPSA8aW5wdXQsIGNvbnN0IG1pbiBleHRlbmRzIG51bWJlcj4oXG4gIG1pbjogbWluXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlID49IG1pbik7XG5cbi8qKlxuICogYFAubnVtYmVyLmludCgpYCBtYXRjaGVzICoqaW50ZWdlcioqIG51bWJlcnMuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5pbnQoKWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmludClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5pbnQoKSwgKCkgPT4gJ2FuIGludGVnZXInKVxuICovXG5jb25zdCBpbnQgPSA8aW5wdXQ+KCk6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpO1xuXG4vKipcbiAqIGBQLm51bWJlci5maW5pdGVgIG1hdGNoZXMgKipmaW5pdGUgbnVtYmVycyoqLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIuZmluaXRlYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyZmluaXRlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLmZpbml0ZSwgKCkgPT4gJ25vdCBJbmZpbml0eScpXG4gKi9cbmNvbnN0IGZpbml0ZSA9IDxpbnB1dD4oKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKTtcblxuLyoqXG4gKiBgUC5udW1iZXIucG9zaXRpdmUoKWAgbWF0Y2hlcyAqKnBvc2l0aXZlKiogbnVtYmVycy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLnBvc2l0aXZlKClgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJwb3NpdGl2ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5wb3NpdGl2ZSgpLCAoKSA9PiAnbnVtYmVyID4gMCcpXG4gKi9cbmNvbnN0IHBvc2l0aXZlID0gPGlucHV0PigpOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlID4gMCk7XG5cbi8qKlxuICogYFAubnVtYmVyLm5lZ2F0aXZlKClgIG1hdGNoZXMgKipuZWdhdGl2ZSoqIG51bWJlcnMuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5uZWdhdGl2ZSgpYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVybmVnYXRpdmUpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIubmVnYXRpdmUoKSwgKCkgPT4gJ251bWJlciA8IDAnKVxuICovXG5jb25zdCBuZWdhdGl2ZSA9IDxpbnB1dD4oKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA8IDApO1xuXG5jb25zdCBudW1iZXJDaGFpbmFibGUgPSA8cGF0dGVybiBleHRlbmRzIE1hdGNoZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PihcbiAgcGF0dGVybjogcGF0dGVyblxuKTogTnVtYmVyQ2hhaW5hYmxlPHBhdHRlcm4+ID0+XG4gIE9iamVjdC5hc3NpZ24oY2hhaW5hYmxlKHBhdHRlcm4pLCB7XG4gICAgYmV0d2VlbjogKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT5cbiAgICAgIG51bWJlckNoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgYmV0d2VlbihtaW4sIG1heCkpKSxcbiAgICBsdDogKG1heDogbnVtYmVyKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGx0KG1heCkpKSxcbiAgICBndDogKG1pbjogbnVtYmVyKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGd0KG1pbikpKSxcbiAgICBsdGU6IChtYXg6IG51bWJlcikgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBsdGUobWF4KSkpLFxuICAgIGd0ZTogKG1pbjogbnVtYmVyKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGd0ZShtaW4pKSksXG4gICAgaW50OiAoKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGludCgpKSksXG4gICAgZmluaXRlOiAoKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGZpbml0ZSgpKSksXG4gICAgcG9zaXRpdmU6ICgpID0+IG51bWJlckNoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgcG9zaXRpdmUoKSkpLFxuICAgIG5lZ2F0aXZlOiAoKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIG5lZ2F0aXZlKCkpKSxcbiAgfSkgYXMgYW55O1xuXG4vKipcbiAqIGBQLm51bWJlcmAgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyBhbnkgKipudW1iZXIqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBudW1iZXJzJylcbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlcjogTnVtYmVyUGF0dGVybiA9IG51bWJlckNoYWluYWJsZSh3aGVuKGlzTnVtYmVyKSk7XG5cbi8qKlxuICogYFAuYmlnaW50LmJldHdlZW4obWluLCBtYXgpYCBtYXRjaGVzICoqYmlnaW50KiogYmV0d2VlbiBgbWluYCBhbmQgYG1heGAsXG4gKiBlcXVhbCB0byBtaW4gb3IgZXF1YWwgdG8gbWF4LlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5iaWdpbnQuYmV0d2VlbmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmJldHdlZW4pXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5iaWdpbnQuYmV0d2VlbigwLCAxMCksICgpID0+ICcwIDw9IGJpZ2ludHMgPD0gMTAnKVxuICovXG5jb25zdCBiZXR3ZWVuQmlnSW50ID0gPFxuICBpbnB1dCxcbiAgY29uc3QgbWluIGV4dGVuZHMgYmlnaW50LFxuICBjb25zdCBtYXggZXh0ZW5kcyBiaWdpbnRcbj4oXG4gIG1pbjogbWluLFxuICBtYXg6IG1heFxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiBtaW4gPD0gdmFsdWUgJiYgbWF4ID49IHZhbHVlKTtcblxuLyoqXG4gKiBgUC5iaWdpbnQubHQobWF4KWAgbWF0Y2hlcyAqKmJpZ2ludCoqIHNtYWxsZXIgdGhhbiBgbWF4YC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50Lmx0YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVybHQpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5iaWdpbnQubHQoMTApLCAoKSA9PiAnYmlnaW50cyA8IDEwJylcbiAqL1xuY29uc3QgbHRCaWdJbnQgPSA8aW5wdXQsIGNvbnN0IG1heCBleHRlbmRzIGJpZ2ludD4oXG4gIG1heDogbWF4XG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBiaWdpbnQsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNCaWdJbnQodmFsdWUpICYmIHZhbHVlIDwgbWF4KTtcblxuLyoqXG4gKiBgUC5iaWdpbnQuZ3QobWluKWAgbWF0Y2hlcyAqKmJpZ2ludCoqIGdyZWF0ZXIgdGhhbiBgbWluYC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50Lmd0YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyZ3QpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5iaWdpbnQuZ3QoMTApLCAoKSA9PiAnYmlnaW50cyA+IDEwJylcbiAqL1xuY29uc3QgZ3RCaWdJbnQgPSA8aW5wdXQsIGNvbnN0IG1pbiBleHRlbmRzIGJpZ2ludD4oXG4gIG1pbjogbWluXG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBiaWdpbnQsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNCaWdJbnQodmFsdWUpICYmIHZhbHVlID4gbWluKTtcblxuLyoqXG4gKiBgUC5iaWdpbnQubHRlKG1heClgIG1hdGNoZXMgKipiaWdpbnQqKiBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gYG1heGAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJpZ2ludC5sdGVgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJsdGUpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5iaWdpbnQubHRlKDEwKSwgKCkgPT4gJ2JpZ2ludHMgPD0gMTAnKVxuICovXG5jb25zdCBsdGVCaWdJbnQgPSA8aW5wdXQsIGNvbnN0IG1heCBleHRlbmRzIGJpZ2ludD4oXG4gIG1heDogbWF4XG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBiaWdpbnQsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNCaWdJbnQodmFsdWUpICYmIHZhbHVlIDw9IG1heCk7XG5cbi8qKlxuICogYFAuYmlnaW50Lmd0ZShtaW4pYCBtYXRjaGVzICoqYmlnaW50KiogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBtaW5gLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5iaWdpbnQuZ3RlYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwYmlnaW50Z3RlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50Lmd0ZSgxMCksICgpID0+ICdiaWdpbnRzID49IDEwJylcbiAqL1xuY29uc3QgZ3RlQmlnSW50ID0gPGlucHV0LCBjb25zdCBtaW4gZXh0ZW5kcyBiaWdpbnQ+KFxuICBtaW46IG1pblxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiB2YWx1ZSA+PSBtaW4pO1xuXG4vKipcbiAqIGBQLmJpZ2ludC5wb3NpdGl2ZSgpYCBtYXRjaGVzICoqcG9zaXRpdmUqKiBiaWdpbnRzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5iaWdpbnQucG9zaXRpdmUoKWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGJpZ2ludHBvc2l0aXZlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50LnBvc2l0aXZlKCksICgpID0+ICdiaWdpbnQgPiAwJylcbiAqL1xuY29uc3QgcG9zaXRpdmVCaWdJbnQgPSA8aW5wdXQ+KCk6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIGJpZ2ludCwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc0JpZ0ludCh2YWx1ZSkgJiYgdmFsdWUgPiAwKTtcblxuLyoqXG4gKiBgUC5iaWdpbnQubmVnYXRpdmUoKWAgbWF0Y2hlcyAqKm5lZ2F0aXZlKiogYmlnaW50cy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50Lm5lZ2F0aXZlKClgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BiaWdpbnRuZWdhdGl2ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLmJpZ2ludC5uZWdhdGl2ZSgpLCAoKSA9PiAnYmlnaW50IDwgMCcpXG4gKi9cbmNvbnN0IG5lZ2F0aXZlQmlnSW50ID0gPGlucHV0PigpOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBiaWdpbnQsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNCaWdJbnQodmFsdWUpICYmIHZhbHVlIDwgMCk7XG5cbmNvbnN0IGJpZ2ludENoYWluYWJsZSA9IDxwYXR0ZXJuIGV4dGVuZHMgTWF0Y2hlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+KFxuICBwYXR0ZXJuOiBwYXR0ZXJuXG4pOiBCaWdJbnRDaGFpbmFibGU8cGF0dGVybj4gPT5cbiAgT2JqZWN0LmFzc2lnbihjaGFpbmFibGUocGF0dGVybiksIHtcbiAgICBiZXR3ZWVuOiAobWluOiBiaWdpbnQsIG1heDogYmlnaW50KSA9PlxuICAgICAgYmlnaW50Q2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBiZXR3ZWVuQmlnSW50KG1pbiwgbWF4KSkpLFxuICAgIGx0OiAobWF4OiBiaWdpbnQpID0+IGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbHRCaWdJbnQobWF4KSkpLFxuICAgIGd0OiAobWluOiBiaWdpbnQpID0+IGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgZ3RCaWdJbnQobWluKSkpLFxuICAgIGx0ZTogKG1heDogYmlnaW50KSA9PlxuICAgICAgYmlnaW50Q2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBsdGVCaWdJbnQobWF4KSkpLFxuICAgIGd0ZTogKG1pbjogYmlnaW50KSA9PlxuICAgICAgYmlnaW50Q2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBndGVCaWdJbnQobWluKSkpLFxuICAgIHBvc2l0aXZlOiAoKSA9PiBiaWdpbnRDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIHBvc2l0aXZlQmlnSW50KCkpKSxcbiAgICBuZWdhdGl2ZTogKCkgPT4gYmlnaW50Q2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBuZWdhdGl2ZUJpZ0ludCgpKSksXG4gIH0pIGFzIGFueTtcblxuLyoqXG4gKiBgUC5iaWdpbnRgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgYW55ICoqYmlnaW50KiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJpZ2ludGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jbnVtYmVyLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC53aXRoKFAuYmlnaW50LCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBiaWdpbnRzJylcbiAqL1xuZXhwb3J0IGNvbnN0IGJpZ2ludDogQmlnSW50UGF0dGVybiA9IGJpZ2ludENoYWluYWJsZSh3aGVuKGlzQmlnSW50KSk7XG5cbi8qKlxuICogYFAuYm9vbGVhbmAgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyBhbnkgKipib29sZWFuKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJvb2xlYW5gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI2Jvb2xlYW4td2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLndpdGgoUC5ib29sZWFuLCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBib29sZWFucycpXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuOiBCb29sZWFuUGF0dGVybiA9IGNoYWluYWJsZSh3aGVuKGlzQm9vbGVhbikpO1xuXG4vKipcbiAqIGBQLnN5bWJvbGAgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyBhbnkgKipzeW1ib2wqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3ltYm9sYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNzeW1ib2wtd2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLndpdGgoUC5zeW1ib2wsICgpID0+ICd3aWxsIG1hdGNoIG9uIHN5bWJvbHMnKVxuICovXG5leHBvcnQgY29uc3Qgc3ltYm9sOiBTeW1ib2xQYXR0ZXJuID0gY2hhaW5hYmxlKHdoZW4oaXNTeW1ib2wpKTtcblxuLyoqXG4gKiBgUC5udWxsaXNoYCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4sIG1hdGNoaW5nICoqbnVsbCoqIG9yICoqdW5kZWZpbmVkKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bGxpc2hgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI251bGxpc2gtd2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLndpdGgoUC5udWxsaXNoLCAoeCkgPT4gYCR7eH0gaXMgbnVsbCBvciB1bmRlZmluZWRgKVxuICovXG5leHBvcnQgY29uc3QgbnVsbGlzaDogTnVsbGlzaFBhdHRlcm4gPSBjaGFpbmFibGUod2hlbihpc051bGxpc2gpKTtcblxuLyoqXG4gKiBgUC5ub25OdWxsYWJsZWAgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyBldmVyeXRoaW5nIGV4Y2VwdCAqKm51bGwqKiBvciAqKnVuZGVmaW5lZCoqLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5ub25OdWxsYWJsZWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jbm9uTnVsbGFibGUtd2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLndpdGgoUC5ub25OdWxsYWJsZSwgKHgpID0+IGAke3h9IGlzbid0IG51bGwgbm9yIHVuZGVmaW5lZGApXG4gKi9cbmV4cG9ydCBjb25zdCBub25OdWxsYWJsZTogTm9uTnVsbGFibGVQYXR0ZXJuID0gY2hhaW5hYmxlKHdoZW4oaXNOb25OdWxsYWJsZSkpO1xuXG4vKipcbiAqIGBQLmluc3RhbmNlT2YoU29tZUNsYXNzKWAgaXMgYSBwYXR0ZXJuIG1hdGNoaW5nIGluc3RhbmNlcyBvZiBhIGdpdmVuIGNsYXNzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5pbnN0YW5jZU9mYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwaW5zdGFuY2VvZi1wYXR0ZXJucylcbiAqXG4gKiAgQGV4YW1wbGVcbiAqICAgLndpdGgoUC5pbnN0YW5jZU9mKFNvbWVDbGFzcyksICgpID0+ICd3aWxsIG1hdGNoIG9uIFNvbWVDbGFzcyBpbnN0YW5jZXMnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFuY2VPZjxUIGV4dGVuZHMgQW55Q29uc3RydWN0b3I+KFxuICBjbGFzc0NvbnN0cnVjdG9yOiBUXG4pOiBDaGFpbmFibGU8R3VhcmRQPHVua25vd24sIEluc3RhbmNlVHlwZTxUPj4+IHtcbiAgcmV0dXJuIGNoYWluYWJsZSh3aGVuKGlzSW5zdGFuY2VPZihjbGFzc0NvbnN0cnVjdG9yKSkpO1xufVxuXG4vKipcbiAqIGBQLnNoYXBlKHNvbWVQYXR0ZXJuKWAgbGV0cyB5b3UgY2FsbCBtZXRob2RzIGxpa2UgYC5vcHRpb25hbCgpYCwgYC5hbmRgLCBgLm9yYCBhbmQgYC5zZWxlY3QoKWBcbiAqIE9uIHN0cnVjdHVyYWwgcGF0dGVybnMsIGxpa2Ugb2JqZWN0cyBhbmQgYXJyYXlzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zaGFwZWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHNoYXBlLXBhdHRlcm5zKVxuICpcbiAqICBAZXhhbXBsZVxuICogICAud2l0aChcbiAqICAgICB7XG4gKiAgICAgICBzdGF0ZTogUC5zaGFwZSh7IHN0YXR1czogXCJzdWNjZXNzXCIgfSkub3B0aW9uYWwoKS5zZWxlY3QoKVxuICogICAgIH0sXG4gKiAgICAgKHN0YXRlKSA9PiAnbWF0Y2ggdGhlIHN1Y2Nlc3Mgc3RhdGUsIG9yIHVuZGVmaW5lZC4nXG4gKiAgIClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXBlPGlucHV0LCBjb25zdCBwYXR0ZXJuIGV4dGVuZHMgUGF0dGVybjxpbnB1dD4+KFxuICBwYXR0ZXJuOiBwYXR0ZXJuXG4pOiBDaGFpbmFibGU8R3VhcmRQPGlucHV0LCBJbnZlcnRQYXR0ZXJuPHBhdHRlcm4sIGlucHV0Pj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXBlKHBhdHRlcm46IFVua25vd25QYXR0ZXJuKSB7XG4gIHJldHVybiBjaGFpbmFibGUod2hlbihpc01hdGNoaW5nKHBhdHRlcm4pKSk7XG59XG4iLCAiLyoqXG4gKiBFcnJvciB3aGVuIHRoZSBnaXZlbiBpbnB1dCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCBhbnkgaW5jbHVkZWQgcGF0dGVyblxuICogYW5kIC5leGhhdXN0aXZlKCkgd2FzIHNwZWNpZmllZFxuICovXG5leHBvcnQgY2xhc3MgTm9uRXhoYXVzdGl2ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5wdXQ6IHVua25vd24pIHtcbiAgICBsZXQgZGlzcGxheWVkVmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgIGRpc3BsYXllZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkoaW5wdXQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRpc3BsYXllZFZhbHVlID0gaW5wdXQ7XG4gICAgfVxuICAgIHN1cGVyKGBQYXR0ZXJuIG1hdGNoaW5nIGVycm9yOiBubyBwYXR0ZXJuIG1hdGNoZXMgdmFsdWUgJHtkaXNwbGF5ZWRWYWx1ZX1gKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFBhdHRlcm4gfSBmcm9tICcuL3R5cGVzL1BhdHRlcm4nO1xuaW1wb3J0IHsgTWF0Y2ggfSBmcm9tICcuL3R5cGVzL01hdGNoJztcbmltcG9ydCAqIGFzIHN5bWJvbHMgZnJvbSAnLi9pbnRlcm5hbHMvc3ltYm9scyc7XG5pbXBvcnQgeyBtYXRjaFBhdHRlcm4gfSBmcm9tICcuL2ludGVybmFscy9oZWxwZXJzJztcbmltcG9ydCB7IE5vbkV4aGF1c3RpdmVFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxudHlwZSBNYXRjaFN0YXRlPG91dHB1dD4gPVxuICB8IHsgbWF0Y2hlZDogdHJ1ZTsgdmFsdWU6IG91dHB1dCB9XG4gIHwgeyBtYXRjaGVkOiBmYWxzZTsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG5jb25zdCB1bm1hdGNoZWQ6IE1hdGNoU3RhdGU8bmV2ZXI+ID0ge1xuICBtYXRjaGVkOiBmYWxzZSxcbiAgdmFsdWU6IHVuZGVmaW5lZCxcbn07XG5cbi8qKlxuICogYG1hdGNoYCBjcmVhdGVzIGEgKipwYXR0ZXJuIG1hdGNoaW5nIGV4cHJlc3Npb24qKi5cbiAqICAqIFVzZSBgLndpdGgocGF0dGVybiwgaGFuZGxlcilgIHRvIHBhdHRlcm4gbWF0Y2ggb24gdGhlIGlucHV0LlxuICogICogVXNlIGAuZXhoYXVzdGl2ZSgpYCBvciBgLm90aGVyd2lzZSgoKSA9PiBkZWZhdWx0VmFsdWUpYCB0byBlbmQgdGhlIGV4cHJlc3Npb24gYW5kIGdldCB0aGUgcmVzdWx0LlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgbWF0Y2hgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI21hdGNoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgZGVjbGFyZSBsZXQgaW5wdXQ6IFwiQVwiIHwgXCJCXCI7XG4gKlxuICogIHJldHVybiBtYXRjaChpbnB1dClcbiAqICAgIC53aXRoKFwiQVwiLCAoKSA9PiBcIkl0J3MgYW4gQSFcIilcbiAqICAgIC53aXRoKFwiQlwiLCAoKSA9PiBcIkl0J3MgYSBCIVwiKVxuICogICAgLmV4aGF1c3RpdmUoKTtcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaDxjb25zdCBpbnB1dCwgb3V0cHV0ID0gc3ltYm9scy51bnNldD4oXG4gIHZhbHVlOiBpbnB1dFxuKTogTWF0Y2g8aW5wdXQsIG91dHB1dD4ge1xuICByZXR1cm4gbmV3IE1hdGNoRXhwcmVzc2lvbih2YWx1ZSwgdW5tYXRjaGVkKSBhcyBhbnk7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbWF0Y2ggZXhwcmVzc2lvbi4gSXQgZm9sbG93cyB0aGVcbiAqIGJ1aWxkZXIgcGF0dGVybiwgd2UgY2hhaW4gbWV0aG9kcyB0byBhZGQgZmVhdHVyZXMgdG8gdGhlIGV4cHJlc3Npb25cbiAqIHVudGlsIHdlIGNhbGwgYC5leGhhdXN0aXZlYCwgYC5vdGhlcndpc2VgIG9yIHRoZSB1bnNhZmUgYC5ydW5gXG4gKiBtZXRob2QgdG8gZXhlY3V0ZSBpdC5cbiAqXG4gKiBUaGUgdHlwZXMgb2YgdGhpcyBjbGFzcyBhcmVuJ3QgcHVibGljLCB0aGUgcHVibGljIHR5cGUgZGVmaW5pdGlvblxuICogY2FuIGJlIGZvdW5kIGluIHNyYy90eXBlcy9NYXRjaC50cy5cbiAqL1xuY2xhc3MgTWF0Y2hFeHByZXNzaW9uPGlucHV0LCBvdXRwdXQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbnB1dDogaW5wdXQsIHByaXZhdGUgc3RhdGU6IE1hdGNoU3RhdGU8b3V0cHV0Pikge31cblxuICB3aXRoKC4uLmFyZ3M6IGFueVtdKTogTWF0Y2hFeHByZXNzaW9uPGlucHV0LCBvdXRwdXQ+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5tYXRjaGVkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGhhbmRsZXI6IChzZWxlY3Rpb246IHVua25vd24sIHZhbHVlOiBpbnB1dCkgPT4gb3V0cHV0ID1cbiAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcblxuICAgIGNvbnN0IHBhdHRlcm5zOiBQYXR0ZXJuPGlucHV0PltdID0gW2FyZ3NbMF1dO1xuICAgIGxldCBwcmVkaWNhdGU6ICgodmFsdWU6IGlucHV0KSA9PiB1bmtub3duKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gY2FzZSB3aXRoIGd1YXJkIGFzIHNlY29uZCBhcmd1bWVudFxuICAgICAgcHJlZGljYXRlID0gYXJnc1sxXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgLy8gY2FzZSB3aXRoIHNldmVyYWwgcGF0dGVybnNcbiAgICAgIHBhdHRlcm5zLnB1c2goLi4uYXJncy5zbGljZSgxLCBhcmdzLmxlbmd0aCAtIDEpKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzU2VsZWN0aW9ucyA9IGZhbHNlO1xuICAgIGxldCBzZWxlY3RlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCBzZWxlY3QgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBoYXNTZWxlY3Rpb25zID0gdHJ1ZTtcbiAgICAgIHNlbGVjdGVkW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgbWF0Y2hlZCA9XG4gICAgICBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBtYXRjaFBhdHRlcm4ocGF0dGVybiwgdGhpcy5pbnB1dCwgc2VsZWN0KSkgJiZcbiAgICAgIChwcmVkaWNhdGUgPyBCb29sZWFuKHByZWRpY2F0ZSh0aGlzLmlucHV0KSkgOiB0cnVlKTtcblxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBoYXNTZWxlY3Rpb25zXG4gICAgICA/IHN5bWJvbHMuYW5vbnltb3VzU2VsZWN0S2V5IGluIHNlbGVjdGVkXG4gICAgICAgID8gc2VsZWN0ZWRbc3ltYm9scy5hbm9ueW1vdXNTZWxlY3RLZXldXG4gICAgICAgIDogc2VsZWN0ZWRcbiAgICAgIDogdGhpcy5pbnB1dDtcblxuICAgIGNvbnN0IHN0YXRlID0gbWF0Y2hlZFxuICAgICAgPyB7XG4gICAgICAgICAgbWF0Y2hlZDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICB2YWx1ZTogaGFuZGxlcihzZWxlY3Rpb25zLCB0aGlzLmlucHV0KSxcbiAgICAgICAgfVxuICAgICAgOiB1bm1hdGNoZWQ7XG5cbiAgICByZXR1cm4gbmV3IE1hdGNoRXhwcmVzc2lvbih0aGlzLmlucHV0LCBzdGF0ZSk7XG4gIH1cblxuICB3aGVuKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBpbnB1dCkgPT4gdW5rbm93bixcbiAgICBoYW5kbGVyOiAoc2VsZWN0aW9uOiBpbnB1dCwgdmFsdWU6IGlucHV0KSA9PiBvdXRwdXRcbiAgKTogTWF0Y2hFeHByZXNzaW9uPGlucHV0LCBvdXRwdXQ+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5tYXRjaGVkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG1hdGNoZWQgPSBCb29sZWFuKHByZWRpY2F0ZSh0aGlzLmlucHV0KSk7XG5cbiAgICByZXR1cm4gbmV3IE1hdGNoRXhwcmVzc2lvbjxpbnB1dCwgb3V0cHV0PihcbiAgICAgIHRoaXMuaW5wdXQsXG4gICAgICBtYXRjaGVkXG4gICAgICAgID8geyBtYXRjaGVkOiB0cnVlLCB2YWx1ZTogaGFuZGxlcih0aGlzLmlucHV0LCB0aGlzLmlucHV0KSB9XG4gICAgICAgIDogdW5tYXRjaGVkXG4gICAgKTtcbiAgfVxuXG4gIG90aGVyd2lzZShoYW5kbGVyOiAodmFsdWU6IGlucHV0KSA9PiBvdXRwdXQpOiBvdXRwdXQge1xuICAgIGlmICh0aGlzLnN0YXRlLm1hdGNoZWQpIHJldHVybiB0aGlzLnN0YXRlLnZhbHVlO1xuICAgIHJldHVybiBoYW5kbGVyKHRoaXMuaW5wdXQpO1xuICB9XG5cbiAgZXhoYXVzdGl2ZSgpOiBvdXRwdXQge1xuICAgIGlmICh0aGlzLnN0YXRlLm1hdGNoZWQpIHJldHVybiB0aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgdGhyb3cgbmV3IE5vbkV4aGF1c3RpdmVFcnJvcih0aGlzLmlucHV0KTtcbiAgfVxuXG4gIHJ1bigpOiBvdXRwdXQge1xuICAgIHJldHVybiB0aGlzLmV4aGF1c3RpdmUoKTtcbiAgfVxuXG4gIHJldHVyblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBtYXRjaCB9IGZyb20gJ3RzLXBhdHRlcm4nXG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHNoZWxsIGhlbHBlciB3aXRoIHRoZSBnaXZlbiBzaGVsbCB0eXBlXG4gKlxuICogQHBhcmFtIHNoZWxsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzaGVsbCB0byB1c2VcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzaCA9IHNoZWxsKCdiYXNoJylcbiAqXG4gKiBjb25zdCBjb24gPSBkYWcuY29udGFpbmVyKClcbiAqICAgLndpdGhFeGVjKHNoKCdlY2hvIGhlbGxvIHdvcmxkIScpKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChzaGVsbE5hbWU6ICdzaCcgfCAnYmFzaCcgfCAnenNoJykge1xuXHRyZXR1cm4gKGlucHV0OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcblx0XHRjb25zdCBpbnB1dEFyID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF1cblx0XHRjb25zdCB0cmltbWVkSW5wdXQgPSBpbnB1dEFyLm1hcCgoaSkgPT5cblx0XHRcdGlcblx0XHRcdFx0LnRyaW0oKVxuXHRcdFx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0XHRcdC5tYXAoKGwpID0+IGwudHJpbSgpKVxuXHRcdFx0XHQuam9pbignXFxuJylcblx0XHQpXG5cblx0XHRyZXR1cm4gbWF0Y2goc2hlbGxOYW1lKVxuXHRcdFx0LndpdGgoJ3NoJywgKCkgPT4gWydzaCcsICctYycsIGBzZXQgLWV1OyAke3RyaW1tZWRJbnB1dH1gXSlcblx0XHRcdC53aXRoKCdiYXNoJywgKCkgPT4gWydiYXNoJywgJy1jJywgYHNldCAtZXVvIHBpcGVmYWlsOyAke3RyaW1tZWRJbnB1dH1gXSlcblx0XHRcdC53aXRoKCd6c2gnLCAoKSA9PiBbJ3pzaCcsICctYycsIGBzZXQgLWV1byBwaXBlZmFpbDsgJHt0cmltbWVkSW5wdXR9YF0pXG5cdFx0XHQuZXhoYXVzdGl2ZSgpXG5cdH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyB1cCB9IGZyb20gJ2VtcGF0aGljL2ZpbmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBvUm9vdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjd2QgPSBjd2QgPz8gcHJvY2Vzcy5jd2QoKVxuXG5cdGNvbnN0IGxvY2tmaWxlID0gdXAoJ3BucG0tbG9jay55YW1sJywgeyBjd2QgfSlcblx0aWYgKCFsb2NrZmlsZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGRldGVybWluZSByZXBvIHJvb3QgcGF0aDogdW5hYmxlIHRvIGZpbmQgcG5wbS1sb2NrLnlhbWwnKVxuXHR9XG5cblx0cmV0dXJuIHBhdGguZGlybmFtZShsb2NrZmlsZSlcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gdGhlIGRhZ2dlciBtb2R1bGUuXG4gKlxuICogUmVxdWlyZXMgYHBucG0tbG9jay55YW1sYCB0byBleGlzdCBpbiB0aGUgcmVwbyByb290LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKipEZWZhdWx0OioqIGBwcm9jZXNzLmN3ZCgpYFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBkYWdnZXIgbW9kdWxlIHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZVBhdGgoY3dkPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y3dkID0gY3dkID8/IHByb2Nlc3MuY3dkKClcblxuXHRjb25zdCBsb2NrZmlsZSA9IHVwKCdwbnBtLWxvY2sueWFtbCcsIHsgY3dkIH0pXG5cdGlmICghbG9ja2ZpbGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBkZXRlcm1pbmUgcmVwbyByb290IHBhdGg6IHVuYWJsZSB0byBmaW5kIHBucG0tbG9jay55YW1sJylcblx0fVxuXHRjb25zdCByZXBvUm9vdCA9IHBhdGguZGlybmFtZShsb2NrZmlsZSlcblxuXHRjb25zdCBkYWdnZXJKc29uID0gdXAoJ2RhZ2dlci5qc29uJywgeyBjd2QsIHN0b3A6IHJlcG9Sb290IH0pXG5cdGlmICghZGFnZ2VySnNvbikge1xuXHRcdHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGRldGVybWluZSBkYWdnZXIuanNvbiBwYXRoOiB1bmFibGUgdG8gZmluZCBkYWdnZXIuanNvbicpXG5cdH1cblxuXHRyZXR1cm4gcGF0aC5yZWxhdGl2ZShyZXBvUm9vdCwgcGF0aC5kaXJuYW1lKGRhZ2dlckpzb24pKVxufVxuIiwgImltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHdhbGsgZnJvbSBcImVtcGF0aGljL3dhbGtcIjtcbmV4cG9ydCBmdW5jdGlvbiB1cChuYW1lLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHRtcDtcblx0bGV0IHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdHRtcCA9IGpvaW4oZGlyLCBuYW1lKTtcblx0XHRpZiAoZXhpc3RzU3luYyh0bXApKSByZXR1cm4gdG1wO1xuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gYW55KG5hbWVzLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRsZXQgaiA9IDAsIGxlbiA9IG5hbWVzLmxlbmd0aCwgdG1wO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuXHRcdFx0dG1wID0gam9pbihkaXIsIG5hbWVzW2pdKTtcblx0XHRcdGlmIChleGlzdHNTeW5jKHRtcCkpIHJldHVybiB0bXA7XG5cdFx0fVxuXHR9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGFic29sdXRlIH0gZnJvbSBcImVtcGF0aGljL3Jlc29sdmVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1cChiYXNlLCBvcHRpb25zKSB7XG5cdGxldCB7IHN0b3AsIGN3ZCB9ID0gb3B0aW9ucyB8fCB7fTtcblx0bGV0IHRtcCA9IGFic29sdXRlKGJhc2UsIGN3ZCksIHJvb3QgPSAhc3RvcDtcblx0bGV0IHByZXYsIGFyciA9IFtdO1xuXHRpZiAoc3RvcCkgc3RvcCA9IGFic29sdXRlKHN0b3AsIGN3ZCk7XG5cdHdoaWxlIChyb290IHx8IHRtcCAhPT0gc3RvcCkge1xuXHRcdGFyci5wdXNoKHRtcCk7XG5cdFx0dG1wID0gZGlybmFtZShwcmV2ID0gdG1wKTtcblx0XHRpZiAodG1wID09PSBwcmV2KSBicmVhaztcblx0fVxuXHRyZXR1cm4gYXJyO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gYWJzb2x1dGUoaW5wdXQsIHJvb3QpIHtcblx0cmV0dXJuIGlzQWJzb2x1dGUoaW5wdXQpID8gaW5wdXQgOiByZXNvbHZlKHJvb3QgfHwgXCIuXCIsIGlucHV0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcm9tKHJvb3QsIGlkZW50LCBzaWxlbnQpIHtcblx0dHJ5IHtcblx0XHRsZXQgciA9IHJvb3QgaW5zdGFuY2VvZiBVUkwgfHwgcm9vdC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IGpvaW4oZmlsZVVSTFRvUGF0aChyb290KSwgXCJub29wLmpzXCIpIDogam9pbihhYnNvbHV0ZShyb290KSwgXCJub29wLmpzXCIpO1xuXHRcdHJldHVybiBjcmVhdGVSZXF1aXJlKHIpLnJlc29sdmUoaWRlbnQpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoIXNpbGVudCkgdGhyb3cgZXJyO1xuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gY3dkKGlkZW50LCBzaWxlbnQpIHtcblx0cmV0dXJuIGZyb20ocmVzb2x2ZSgpLCBpZGVudCwgc2lsZW50KTtcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbi8qKlxuICogSGVscGVyIHR5cGUgdG8gY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nIGxpdGVyYWwgdHlwZS5cbiAqIGUuZy4sICdoZWxsbycgLT4gJ0hlbGxvJ1xuICovXG50eXBlIENhcGl0YWxpemVTdHJpbmc8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgRmlyc3R9JHtpbmZlciBSZXN0fWBcblx0PyBgJHtVcHBlcmNhc2U8Rmlyc3Q+fSR7UmVzdH1gXG5cdDogU1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybXMgYSBzbmFrZV9jYXNlIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gY2FtZWxDYXNlLlxuICogZS5nLiwgJ1NPTUVfQVBJX0tFWScgLT4gJ3NvbWVBcGlLZXknXG4gKiAgICAgICAnSEVMTE9fV09STEQnICAtPiAnaGVsbG9Xb3JsZCdcbiAqICAgICAgICdXT1JEJyAgICAgICAgIC0+ICd3b3JkJ1xuICovXG50eXBlIFNuYWtlVG9DYW1lbENhc2U8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgVH1fJHtpbmZlciBVfWBcblx0PyBgJHtMb3dlcmNhc2U8VD59JHtDYXBpdGFsaXplU3RyaW5nPFNuYWtlVG9DYW1lbENhc2U8VT4+fWAgLy8gTG93ZXJjYXNlIGZpcnN0IHBhcnQsIGNhcGl0YWxpemUgYW5kIHJlY3Vyc2Ugb24gdGhlIHJlc3Rcblx0OiBMb3dlcmNhc2U8Uz4gLy8gQmFzZSBjYXNlOiBObyB1bmRlcnNjb3JlLCBqdXN0IGxvd2VyY2FzZSB0aGUgd2hvbGUgdGhpbmdcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBmcm9tIHNuYWtlX2Nhc2UsIFVQUEVSX1NOQUtFX0NBU0UsIFBhc2NhbENhc2UsXG4gKiBvciBBTExfQ0FQUyB0byBjYW1lbENhc2UgYXQgcnVudGltZS5cbiAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBjYW1lbENhc2Ugb3IgbG93ZXJjYXNlLCBpdCByZW1haW5zIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gc3RyIFRoZSBpbnB1dCBzdHJpbmcgaW4gc25ha2VfY2FzZSBmb3JtYXQuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHN0cmluZyBpbiBjYW1lbENhc2UgZm9ybWF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc25ha2VUb0NhbWVsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4gJydcblx0fVxuXG5cdC8vIENhc2UgMTogU3RyaW5nIGNvbnRhaW5zIHVuZGVyc2NvcmVzIChzbmFrZV9jYXNlKVxuXHRpZiAoc3RyLmluY2x1ZGVzKCdfJykpIHtcblx0XHRsZXQgcmVzdWx0ID0gJydcblx0XHRjb25zdCBwYXJ0cyA9IHN0ci5zcGxpdCgnXycpXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcGFydCA9IHBhcnRzW2ldXG5cdFx0XHRpZiAocGFydCkge1xuXHRcdFx0XHQvLyBTa2lwIGVtcHR5IHBhcnRzIGZyb20gbXVsdGlwbGUgdW5kZXJzY29yZXNcblx0XHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHQvLyBGaXJzdCBub24tZW1wdHkgcGFydDogbG93ZXJjYXNlIHRoZSB3aG9sZSBwYXJ0XG5cdFx0XHRcdFx0cmVzdWx0ICs9IHBhcnQudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFN1YnNlcXVlbnQgbm9uLWVtcHR5IHBhcnRzOiBjYXBpdGFsaXplIGZpcnN0IGxldHRlciwgcmVzdCBsb3dlcmNhc2Vcblx0XHRcdFx0XHRyZXN1bHQgKz0gcGFydFswXSEudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIEhhbmRsZSBjYXNlIGxpa2UgXCJfU09NRV9XT1JEX1wiIC0+IFwic29tZVdvcmRcIlxuXHRcdC8vIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyB3YXMgJ18nIGFuZCByZXN1bHQgaXMgZW1wdHksXG5cdFx0Ly8gaXQgbWVhbnMgdGhlIHN0cmluZyB3YXMgb25seSB1bmRlcnNjb3JlcywgcmV0dXJuICcnXG5cdFx0Ly8gSWYgdGhlIGZpcnN0IHBhcnQgd2FzIGVtcHR5ICgnX1dPUkQnKSwgcmVzdWx0IHN0YXJ0cyBsb3dlcmNhc2UgY29ycmVjdGx5LlxuXHRcdHJldHVybiByZXN1bHRcblx0fVxuXG5cdC8vIENhc2UgMjogU3RyaW5nIGRvZXMgTk9UIGNvbnRhaW4gdW5kZXJzY29yZXNcblx0Ly8gQ2hlY2sgaWYgaXQncyBBTExfQ0FQUyAoYWxsb3dpbmcgZm9yIG51bWJlcnMpXG5cdGNvbnN0IGlzQWxsQ2FwcyA9IC9eW0EtWjAtOV0rJC8udGVzdChzdHIpXG5cdGlmIChpc0FsbENhcHMpIHtcblx0XHQvLyBlLmcuLCBcIldPUkRcIiwgXCJUT0tFTjEyM1wiIC0+IFwid29yZFwiLCBcInRva2VuMTIzXCJcblx0XHRyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKClcblx0fVxuXG5cdC8vIENoZWNrIGlmIGl0J3MgUGFzY2FsQ2FzZSBvciBhbHJlYWR5IGNhbWVsQ2FzZS9sb3dlcmNhc2Vcblx0Ly8gSWYgdGhlIGZpcnN0IGxldHRlciBpcyBhbHJlYWR5IGxvd2VyY2FzZSwgYXNzdW1lIGl0J3MgY2FtZWxDYXNlIG9yIGxvd2VyY2FzZVxuXHRpZiAoc3RyWzBdID09PSBzdHJbMF0hLnRvTG93ZXJDYXNlKCkpIHtcblx0XHQvLyBlLmcuLCBcImhlbGxvV29ybGRcIiwgXCJ3b3JkXCIgLT4gc3RheXMgdGhlIHNhbWVcblx0XHRyZXR1cm4gc3RyXG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIGFzc3VtZSBpdCdzIFBhc2NhbENhc2U6IExvd2VyY2FzZSBvbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXJcblx0Ly8gZS5nLiwgXCJIZWxsb1dvcmxkXCIsIFwiU29tZVZhbHVlXCIgLT4gXCJoZWxsb1dvcmxkXCIsIFwic29tZVZhbHVlXCJcblx0cmV0dXJuIHN0clswXSEudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCdzIGtleXMgZnJvbSBzbmFrZV9jYXNlIG9yIFVQUEVSX1NOQUtFX0NBU0UgdG8gY2FtZWxDYXNlLlxuICogVGhlIHJldHVybiB0eXBlIHByZWNpc2VseSBtYXBzIHRoZSBpbnB1dCBrZXlzIHRvIHRoZWlyIGNhbWVsQ2FzZSB2ZXJzaW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW5wdXQgb2JqZWN0LCBleHBlY3RlZCB0byBoYXZlIHN0cmluZyBrZXlzLlxuICogQHBhcmFtIGlucHV0IFRoZSBvYmplY3Qgd2l0aCBzbmFrZV9jYXNlIGtleXMuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYnV0IGNhbWVsQ2FzZSBrZXlzLCB3aXRoIGEgc3BlY2lmaWMgaW5mZXJyZWQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0NhbWVsPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pihcblx0aW5wdXQ6IFRcbik6IHsgW0sgaW4ga2V5b2YgVCBhcyBTbmFrZVRvQ2FtZWxDYXNlPEsgJiBzdHJpbmc+XTogVFtLXSB9IHtcblx0Y29uc3Qgb3V0cHV0OiBhbnkgPSB7fVxuXG5cdGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG5cdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpbnB1dCwga2V5KSkge1xuXHRcdFx0Y29uc3QgY2FtZWxDYXNlS2V5ID0gc25ha2VUb0NhbWVsKGtleSlcblx0XHRcdG91dHB1dFtjYW1lbENhc2VLZXldID0gaW5wdXRba2V5XVxuXHRcdH1cblx0fVxuXG5cdC8vIFdlIHVzZSBhIHR5cGUgYXNzZXJ0aW9uIGhlcmUuIFdoaWxlIG91ciBydW50aW1lIGxvZ2ljIGNyZWF0ZXMgdGhlIGNvcnJlY3Rcblx0Ly8gc2hhcGUsIFR5cGVTY3JpcHQncyBhbmFseXNpcyB3aXRoaW4gdGhlIGxvb3AgaXNuJ3QgcG93ZXJmdWwgZW5vdWdoIHRvXG5cdC8vIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoYXQgJ291dHB1dCcgcGVyZmVjdGx5IG1hdGNoZXMgdGhlIGNvbXBsZXggbWFwcGVkIHR5cGUuXG5cdC8vIFRoZSByZXR1cm4gdHlwZSBhbm5vdGF0aW9uIGd1YXJhbnRlZXMgdGhlIHR5cGUgZm9yIHRoZSBjYWxsZXIuXG5cdHJldHVybiBvdXRwdXQgYXMgeyBbSyBpbiBrZXlvZiBUIGFzIFNuYWtlVG9DYW1lbENhc2U8SyAmIHN0cmluZz5dOiBUW0tdIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbi8vIEhlbHBlciB0byBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBsb3dlcmNhc2UgQS1aXG50eXBlIElzTG93ZXI8QyBleHRlbmRzIHN0cmluZz4gPVxuXHRMb3dlcmNhc2U8Qz4gZXh0ZW5kcyBVcHBlcmNhc2U8Qz4gPyBmYWxzZSA6IEMgZXh0ZW5kcyBMb3dlcmNhc2U8Qz4gPyB0cnVlIDogZmFsc2Vcbi8vIEhlbHBlciB0byBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyB1cHBlcmNhc2UgQS1aXG50eXBlIElzVXBwZXI8QyBleHRlbmRzIHN0cmluZz4gPVxuXHRMb3dlcmNhc2U8Qz4gZXh0ZW5kcyBVcHBlcmNhc2U8Qz4gPyBmYWxzZSA6IEMgZXh0ZW5kcyBVcHBlcmNhc2U8Qz4gPyB0cnVlIDogZmFsc2Vcbi8vIEhlbHBlciB0byBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhIGRpZ2l0IDAtOVxudHlwZSBJc0RpZ2l0PEMgZXh0ZW5kcyBzdHJpbmc+ID0gQyBleHRlbmRzIGAke251bWJlcn1gID8gdHJ1ZSA6IGZhbHNlXG5cbi8vIFJlY3Vyc2l2ZSBpbm5lciBoZWxwZXIgZm9yIENhbWVsVG9TbmFrZUNhc2Vcbi8vIFByZXZDaGFyIHRyYWNrcyB0aGUgKnByZXZpb3VzKiBjaGFyYWN0ZXIgZnJvbSB0aGUgb3JpZ2luYWwgc3RyaW5nXG50eXBlIENhbWVsVG9TbmFrZUlubmVyPFMgZXh0ZW5kcyBzdHJpbmcsIFByZXZDaGFyIGV4dGVuZHMgc3RyaW5nID0gJyc+ID1cblx0Ly8gQmFzZSBjYXNlOiBJZiB0aGUgaW5wdXQgc3RyaW5nIFMgaXMgZW1wdHksIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuXG5cdFMgZXh0ZW5kcyAnJ1xuXHRcdD8gJydcblx0XHQ6IC8vIFJlY3Vyc2l2ZSBzdGVwOiBJZiBTIGhhcyBjb250ZW50Li4uXG5cdFx0XHRTIGV4dGVuZHMgYCR7aW5mZXIgRmlyc3R9JHtpbmZlciBSZXN0fWBcblx0XHRcdD8gLy8gLS0tIExvZ2ljIGJhc2VkIG9uIHRoZSAnRmlyc3QnIGNoYXJhY3RlciAtLS1cblxuXHRcdFx0XHQvLyAxLiBJcyAnRmlyc3QnIGFuIHVwcGVyY2FzZSBsZXR0ZXI/XG5cdFx0XHRcdElzVXBwZXI8Rmlyc3Q+IGV4dGVuZHMgdHJ1ZVxuXHRcdFx0XHQ/IC8vIDFhLiBXYXMgJ1ByZXZDaGFyJyBsb3dlcmNhc2Ugb3IgYSBkaWdpdD8gKFJlcXVpcmVzIHVuZGVyc2NvcmUpXG5cdFx0XHRcdFx0SXNMb3dlcjxQcmV2Q2hhcj4gZXh0ZW5kcyB0cnVlXG5cdFx0XHRcdFx0PyBgXyR7VXBwZXJjYXNlPEZpcnN0Pn0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gXG5cdFx0XHRcdFx0OiBJc0RpZ2l0PFByZXZDaGFyPiBleHRlbmRzIHRydWVcblx0XHRcdFx0XHRcdD8gYF8ke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHRcdFx0XHRcdFx0OiAvLyAxYi4gJ1ByZXZDaGFyJyB3YXMgdXBwZXJjYXNlLCBzeW1ib2wsIG9yIHN0YXJ0LiBDaGVjayBmb3IgYWNyb255bSBlbmRpbmcuXG5cdFx0XHRcdFx0XHRcdFJlc3QgZXh0ZW5kcyBgJHtpbmZlciBOZXh0Q2hhcn0ke3N0cmluZ31gIC8vIExvb2sgYWhlYWRcblx0XHRcdFx0XHRcdFx0PyBJc0xvd2VyPE5leHRDaGFyPiBleHRlbmRzIHRydWUgLy8gSXMgdGhlICpuZXh0KiBjaGFyIGxvd2VyY2FzZT9cblx0XHRcdFx0XHRcdFx0XHQ/IGBfJHtVcHBlcmNhc2U8Rmlyc3Q+fSR7Q2FtZWxUb1NuYWtlSW5uZXI8UmVzdCwgRmlyc3Q+fWAgLy8gWWVzIChlLmcuLCBBUElfS2V5KVxuXHRcdFx0XHRcdFx0XHRcdDogYCR7VXBwZXJjYXNlPEZpcnN0Pn0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gIC8vIE5vIChlLmcuLCBIVFRQKVxuXHRcdFx0XHRcdFx0XHQ6IC8vICdGaXJzdCcgaXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9yIGZvbGxvd2VkIGJ5IG5vbi1sb3dlcmNhc2UuXG5cdFx0XHRcdFx0XHRcdFx0YCR7VXBwZXJjYXNlPEZpcnN0Pn0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gXG5cdFx0XHRcdDogLy8gMi4gSXMgJ0ZpcnN0JyBhIGRpZ2l0PyAoT25seSBjaGVja2VkIGlmIG5vdCB1cHBlcmNhc2UpXG5cdFx0XHRcdFx0SXNEaWdpdDxGaXJzdD4gZXh0ZW5kcyB0cnVlXG5cdFx0XHRcdFx0PyAvLyAyYS4gV2FzICdQcmV2Q2hhcicgYSBsb3dlcmNhc2UgbGV0dGVyPyAoUmVxdWlyZXMgdW5kZXJzY29yZSlcblx0XHRcdFx0XHRcdElzTG93ZXI8UHJldkNoYXI+IGV4dGVuZHMgdHJ1ZVxuXHRcdFx0XHRcdFx0PyBgXyR7Rmlyc3R9JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHRcdFx0XHRcdFx0OiAvLyAnUHJldkNoYXInIHdhcyBub3QgbG93ZXJjYXNlIChkaWdpdCwgdXBwZXJjYXNlLCBzeW1ib2wsIHN0YXJ0KVxuXHRcdFx0XHRcdFx0XHRgJHtGaXJzdH0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gXG5cdFx0XHRcdFx0OiAvLyAzLiAnRmlyc3QnIG11c3QgYmUgYSBsb3dlcmNhc2UgbGV0dGVyIG9yIGEgc3ltYm9sLlxuXHRcdFx0XHRcdFx0Ly8gICAgKFN5bWJvbHMgYXJlIGhhbmRsZWQgbGlrZSBsb3dlcmNhc2UgaGVyZSAtIG5vIHVuZGVyc2NvcmUgbmVlZGVkIGJlZm9yZSB0aGVtKVxuXHRcdFx0XHRcdFx0YCR7VXBwZXJjYXNlPEZpcnN0Pn0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gIC8vIFVwcGVyY2FzZSBsZXR0ZXIsIGFwcGVuZCBzeW1ib2wgZGlyZWN0bHlcblx0XHRcdDogLy8gVGhpcyBjYXNlIHNob3VsZCB0ZWNobmljYWxseSBub3QgYmUgcmVhY2hhYmxlIGlmIFMgaXMgbm90ICcnLCBidXQgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcy5cblx0XHRcdFx0JydcblxuLyoqXG4gKiBUeXBlIGhlbHBlciB0byBjb252ZXJ0IGEgY2FtZWxDYXNlL1Bhc2NhbENhc2Ugc3RyaW5nIGxpdGVyYWwgdHlwZVxuICogdG8gYW4gVVBQRVJfU05BS0VfQ0FTRSBzdHJpbmcgbGl0ZXJhbCB0eXBlLiBIYW5kbGVzIGNvbW1vbiBjYXNlc1xuICogaW5jbHVkaW5nIHRyYW5zaXRpb25zIGZyb20gbG93ZXIgdG8gdXBwZXIsIGxldHRlcnMgdG8gZGlnaXRzLCBhbmQgYmFzaWMgYWNyb255bXMuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgICd1c2VySWQnIC0+ICdVU0VSX0lEJ1xuICogICAndXNlck5hbWUnIC0+ICdVU0VSX05BTUUnXG4gKiAgICdpc0FjdGl2ZScgLT4gJ0lTX0FDVElWRSdcbiAqICAgJ0FQSUtleScgLT4gJ0FQSV9LRVknXG4gKiAgICd2ZXJzaW9uMTAnIC0+ICdWRVJTSU9OXzEwJ1xuICogICAnYXBpVjJDbGllbnQnIC0+ICdBUElfVjJfQ0xJRU5UJ1xuICovXG50eXBlIENhbWVsVG9TbmFrZUNhc2U8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgRmlyc3R9JHtpbmZlciBSZXN0fWBcblx0PyAvLyBVcHBlcmNhc2UgdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHByb2Nlc3MgdGhlIHJlc3QgdXNpbmcgdGhlIGlubmVyIGhlbHBlclxuXHRcdGAke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHQ6IC8vIEhhbmRsZSBzaW5nbGUgY2hhcmFjdGVyIG9yIGVtcHR5IHN0cmluZ1xuXHRcdFVwcGVyY2FzZTxTPlxuXG4vKipcbiAqIENvbnZlcnRzIGEgY2FtZWxDYXNlIG9yIFBhc2NhbENhc2Ugc3RyaW5nIHRvIFVQUEVSX1NOQUtFX0NBU0UuXG4gKiBIYW5kbGVzIGFjcm9ueW1zIGFuZCBudW1iZXJzIHdpdGhpbiB0aGUgc3RyaW5nLlxuICpcbiAqICoqRXhhbXBsZXM6KipcbiAqIGBgYFxuICogICAnaGVsbG9Xb3JsZCcgLT4gJ0hFTExPX1dPUkxEJ1xuICogICAnSGVsbG9Xb3JsZCcgLT4gJ0hFTExPX1dPUkxEJ1xuICogICAnc29tZUFQSUtleScgLT4gJ1NPTUVfQVBJX0tFWSdcbiAqICAgJ2dldEh0dHBSZXNwb25zZUNvZGUnIC0+ICdHRVRfSFRUUF9SRVNQT05TRV9DT0RFJ1xuICogICAndmVyc2lvbjEwJyAtPiAnVkVSU0lPTl8xMCcgLy8gRml4ZWRcbiAqICAgJ3ZlcnNpb24xMEFscGhhJyAtPiAnVkVSU0lPTl8xMF9BTFBIQScgLy8gRml4ZWRcbiAqICAgJ2FwaVYyQ2xpZW50JyAtPiAnQVBJX1YyX0NMSUVOVCdcbiAqICAgJ3JlbGVhc2VWMTAnIC0+ICdSRUxFQVNFX1YxMCdcbiAqICAgJ3ZlcnNpb24yRGF0YScgLT4gJ1ZFUlNJT05fMl9EQVRBJyAvLyBGaXhlZFxuICogICAnd29yZCcgLT4gJ1dPUkQnXG4gKmBgYFxuICogQHBhcmFtIHN0ciBUaGUgaW5wdXQgc3RyaW5nIGluIGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlIGZvcm1hdC5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIFVQUEVSX1NOQUtFX0NBU0UgZm9ybWF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxUb1NuYWtlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4gJydcblx0fVxuXG5cdC8vIFRoZSBzZXF1ZW5jZSBtYXR0ZXJzOlxuXHRjb25zdCByZXN1bHQgPSBzdHJcblx0XHQvLyAxLiBBZGQgXyBiZWZvcmUgYW4gdXBwZXJjYXNlIGxldHRlciB0aGF0IGlzIGZvbGxvd2VkIGJ5IGEgbG93ZXJjYXNlIGxldHRlcixcblx0XHQvLyAgICBidXQgb25seSBpZiB0aGUgdXBwZXJjYXNlIGxldHRlciBpcyBub3QgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kXG5cdFx0Ly8gICAgaXMgcHJlY2VkZWQgYnkgYW5vdGhlciB1cHBlcmNhc2UgbGV0dGVyIChoYW5kbGVzIGFjcm9ueW1zIGxpa2UgQVBJS2V5IC0+IEFQSV9LZXkpLlxuXHRcdC5yZXBsYWNlKC8oW0EtWl0pKFtBLVpdW2Etel0pL2csICckMV8kMicpXG5cdFx0Ly8gMi4gQWRkIF8gYmVmb3JlIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdGhhdCBpcyBwcmVjZWRlZCBieSBhIGxvd2VyY2FzZSBsZXR0ZXIgb3IgYSBkaWdpdC5cblx0XHQvLyAgICAoaGFuZGxlcyBoZWxsb1dvcmxkIC0+IGhlbGxvX1dvcmxkLCB2ZXJzaW9uMTBVcGRhdGUgLT4gdmVyc2lvbjEwX1VwZGF0ZSwgYXBpVjJDbGllbnQgLT4gYXBpX1YyQ2xpZW50KVxuXHRcdC5yZXBsYWNlKC8oW2EtelxcZF0pKFtBLVpdKS9nLCAnJDFfJDInKVxuXHRcdC8vIDMuIEFkZCBfIGJldHdlZW4gYSBsb3dlcmNhc2UgbGV0dGVyIGFuZCBhIG51bWJlci5cblx0XHQvLyAgICAoaGFuZGxlcyB2ZXJzaW9uMTAgLT4gdmVyc2lvbl8xMCwgYnV0IE5PVCBWMTAgLT4gVl8xMCBiZWNhdXNlIFYgaXMgdXBwZXJjYXNlKVxuXHRcdC5yZXBsYWNlKC8oW2Etel0pKFxcZCkvZywgJyQxXyQyJylcblxuXHQvLyBDb252ZXJ0IHRoZSBlbnRpcmUgcmVzdWx0IHRvIHVwcGVyY2FzZVxuXHRyZXR1cm4gcmVzdWx0LnRvVXBwZXJDYXNlKClcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QncyBrZXlzIGZyb20gY2FtZWxDYXNlL1Bhc2NhbENhc2UgdG8gVVBQRVJfU05BS0VfQ0FTRS5cbiAqIFByb3ZpZGVzIGNvbXBpbGUtdGltZSB0eXBlIHNhZmV0eSBmb3IgdGhlIGNvbnZlcnRlZCBrZXlzIGJhc2VkIG9uIGNvbW1vbiBwYXR0ZXJucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW5wdXQgb2JqZWN0LlxuICogQHBhcmFtIGlucHV0IFRoZSBvYmplY3Qgd2l0aCBjYW1lbENhc2UvUGFzY2FsQ2FzZSBrZXlzLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWVzIGJ1dCBVUFBFUl9TTkFLRV9DQVNFIGtleXMsXG4gKiAgICAgICAgICB3aXRoIGFuIGluZmVycmVkIHR5cGUgcmVmbGVjdGluZyB0aGUga2V5IHRyYW5zZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvU25ha2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuXHRpbnB1dDogVFxuXHQvLyBBcHBseSB0aGUgbWFwcGVkIHR5cGUgd2l0aCBrZXkgcmVtYXBwaW5nIHVzaW5nIHRoZSB0eXBlIGhlbHBlclxuKTogeyBbSyBpbiBrZXlvZiBUIGFzIENhbWVsVG9TbmFrZUNhc2U8SyAmIHN0cmluZz5dOiBUW0tdIH0ge1xuXHRjb25zdCBvdXRwdXQ6IGFueSA9IHt9IC8vIEluaXRpYWxpemUgYXMgJ2FueScgb3IgJ3t9J1xuXG5cdGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG5cdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpbnB1dCwga2V5KSkge1xuXHRcdFx0Y29uc3Qgc25ha2VDYXNlS2V5ID0gY2FtZWxUb1NuYWtlKGtleSkgLy8gUnVudGltZSBjb252ZXJzaW9uXG5cdFx0XHRvdXRwdXRbc25ha2VDYXNlS2V5XSA9IGlucHV0W2tleV1cblx0XHR9XG5cdH1cblxuXHQvLyBUeXBlIGFzc2VydGlvbjogV2UgdHJ1c3QgdGhlIHJ1bnRpbWUgYGNhbWVsVG9TbmFrZWAgbG9naWMgcHJvZHVjZXMga2V5c1xuXHQvLyBtYXRjaGluZyB0aGUgc3RydWN0dXJlIGRlZmluZWQgYnkgdGhlIGBDYW1lbFRvU25ha2VDYXNlYCB0eXBlIGhlbHBlci5cblx0Ly8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBUUyBjYW4ndCBwZXJmZWN0bHkgdmVyaWZ5IHRoZSBydW50aW1lIGxvZ2ljXG5cdC8vIGFnYWluc3QgdGhlIGNvbXBsZXggdHlwZS1sZXZlbCBsb2dpYyBmb3IgYWxsIHBvc3NpYmxlIGlucHV0cy5cblx0cmV0dXJuIG91dHB1dCBhcyB7IFtLIGluIGtleW9mIFQgYXMgQ2FtZWxUb1NuYWtlQ2FzZTxLICYgc3RyaW5nPl06IFRbS10gfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBQ08sSUFBTUEsRUFBWSxDQUV4QixnQkFBaUIsQ0FFaEIsT0FBUSxDQUNQLG1CQUNBLFVBQ0EsYUFDQSxlQUNBLGVBQ0EsZUFDQSxhQUNBLFdBQ0EsWUFDQSxlQUNBLGFBQ0EsWUFDQSxPQUNELENBQ0QsQ0FDRCxFQ3BCQSxPQUFTLHFCQUFBQyxNQUF5QixtQkFpQjNCLElBQU1DLEVBQWEsSUFBSUQsRUFRdkIsU0FBU0UsRUFBa0JDLEVBQTBCLENBQzNELElBQU1DLEVBQVVELEVBQUssU0FBUyxFQUFFLFFBQVEsaUJBQWtCLEVBQUUsRUFFdERFLEVBQ0xELEVBQVEsTUFBTSxpREFBaUQsR0FDL0RBLEVBQVEsTUFBTSw4QkFBOEIsRUFFN0MsR0FBSSxDQUFDQyxHQUFlLE9BQU9BLEVBQVksQ0FBQyxFQUFNLElBQzdDLGVBQVEsS0FBSywwREFBMkRELENBQU8sRUFDeEUsQ0FBQyxFQUtULElBQU1FLEVBSFlELEVBQVksQ0FBQyxFQUk3QixRQUFRLGVBQWdCLEVBQUUsRUFDMUIsUUFBUSxhQUFjLEVBQUUsRUFFMUIsT0FBS0MsRUFBaUIsS0FBSyxFQUlwQkEsRUFDTCxNQUFNLEdBQUcsRUFDVCxJQUFLQyxHQUVZQSxFQUFNLE1BQU0sTUFBTSxFQUFFLENBQUMsR0FDckIsS0FBSyxHQUFLLEVBQzNCLEVBQ0EsT0FBUUMsR0FBU0EsRUFBSyxPQUFTLENBQUMsRUFWMUIsQ0FBQyxDQVdWLENBT08sU0FBU0MsR0FBK0IsQ0FDOUMsT0FBTyxTQUFVQyxFQUFjQyxFQUE4QkMsRUFBZ0MsQ0FDNUYsR0FBSSxPQUFPQSxFQUFlLEtBQWUsT0FBT0EsRUFBVyxPQUFVLFdBQ3BFLE1BQU0sSUFB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S0FBS0EsRUFBT0UsQ0FBRyxFQUFHLENBQ3JELElBQU1DLEVBQWVOLEdBQWFLLENBQUcsRUFDckNELEVBQU9FLENBQVksRUFBSUgsRUFBTUUsQ0FBRyxDQUNqQyxDQU9ELE9BQU9ELENBQ1IiLAogICJuYW1lcyI6IFsiY29uc3RhbnRzIiwgIkFzeW5jTG9jYWxTdG9yYWdlIiwgImVudlN0b3JhZ2UiLCAiZXh0cmFjdFBhcmFtTmFtZXMiLCAiZnVuYyIsICJmdW5jU3RyIiwgInBhcmFtc01hdGNoIiwgImNsZWFuZWRQYXJhbXNTdHIiLCAicGFyYW0iLCAibmFtZSIsICJQYXJhbXNUb0VudiIsICJfdGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgImRlc2NyaXB0b3IiLCAib3JpZ2luYWxNZXRob2QiLCAicGFyYW1OYW1lcyIsICJhcmdzIiwgInBhcmVudENvbnRleHQiLCAibmV3RW52IiwgImN1cnJlbnRQYXJhbXMiLCAiaW5kZXgiLCAibWVyZ2VkRW52IiwgImNvbnRleHRUb1N0b3JlIiwgIm1hdGNoZXIiLCAiU3ltYm9sIiwgImZvciIsICJpc1ZhcmlhZGljIiwgImFub255bW91c1NlbGVjdEtleSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJCb29sZWFuIiwgImlzTWF0Y2hlciIsICJ4IiwgInN5bWJvbHMiLCAibWF0Y2hQYXR0ZXJuIiwgInBhdHRlcm4iLCAic2VsZWN0IiwgIm1hdGNoZWQiLCAic2VsZWN0aW9ucyIsICJtYXRjaCIsICJPYmplY3QiLCAia2V5cyIsICJmb3JFYWNoIiwgImtleSIsICJBcnJheSIsICJpc0FycmF5IiwgInN0YXJ0UGF0dGVybnMiLCAiZW5kUGF0dGVybnMiLCAidmFyaWFkaWNQYXR0ZXJucyIsICJpIiwgInN1YnBhdHRlcm4iLCAicHVzaCIsICJsZW5ndGgiLCAiRXJyb3IiLCAic3RhcnRWYWx1ZXMiLCAic2xpY2UiLCAiZW5kVmFsdWVzIiwgIm1pZGRsZVZhbHVlcyIsICJJbmZpbml0eSIsICJldmVyeSIsICJzdWJQYXR0ZXJuIiwgIlJlZmxlY3QiLCAib3duS2V5cyIsICJrIiwgIm1hdGNoZXJUeXBlIiwgImlzIiwgImdldFNlbGVjdGlvbktleXMiLCAiX3BhdHRlcm4kc3ltYm9scyRtYXRjIiwgIl9wYXR0ZXJuJHN5bWJvbHMkbWF0YzIiLCAiX3BhdHRlcm4kc3ltYm9scyRtYXRjMyIsICJjYWxsIiwgImZsYXRNYXAiLCAidmFsdWVzIiwgInhzIiwgImYiLCAicmVkdWNlIiwgImFjYyIsICJjb25jYXQiLCAiY2hhaW5hYmxlIiwgInBhdHRlcm4iLCAiT2JqZWN0IiwgImFzc2lnbiIsICJvcHRpb25hbCIsICJhbmQiLCAicDIiLCAiaW50ZXJzZWN0aW9uIiwgIm9yIiwgInVuaW9uIiwgInNlbGVjdCIsICJrZXkiLCAib3B0aW9uYWwiLCAicGF0dGVybiIsICJjaGFpbmFibGUiLCAibWF0Y2hlciIsICJtYXRjaCIsICJ2YWx1ZSIsICJzZWxlY3Rpb25zIiwgInNlbGVjdG9yIiwgImtleSIsICJnZXRTZWxlY3Rpb25LZXlzIiwgImZvckVhY2giLCAidW5kZWZpbmVkIiwgIm1hdGNoZWQiLCAibWF0Y2hQYXR0ZXJuIiwgIm1hdGNoZXJUeXBlIiwgImludGVyc2VjdGlvbiIsICJwYXR0ZXJucyIsICJjaGFpbmFibGUiLCAibWF0Y2hlciIsICJtYXRjaCIsICJ2YWx1ZSIsICJzZWxlY3Rpb25zIiwgInNlbGVjdG9yIiwgImtleSIsICJtYXRjaGVkIiwgImV2ZXJ5IiwgInAiLCAibWF0Y2hQYXR0ZXJuIiwgImdldFNlbGVjdGlvbktleXMiLCAiZmxhdE1hcCIsICJtYXRjaGVyVHlwZSIsICJ1bmlvbiIsICJmb3JFYWNoIiwgInVuZGVmaW5lZCIsICJzb21lIiwgIndoZW4iLCAicHJlZGljYXRlIiwgIkJvb2xlYW4iLCAic2VsZWN0IiwgImFyZ3MiLCAicGF0dGVybiIsICJsZW5ndGgiLCAic3ltYm9scyIsICJjb25jYXQiLCAiaXNOdW1iZXIiLCAieCIsICJpc1N0cmluZyIsICJpc0JpZ0ludCIsICJhbnkiLCAic3RyaW5nQ2hhaW5hYmxlIiwgInBhdHRlcm4iLCAiT2JqZWN0IiwgImFzc2lnbiIsICJjaGFpbmFibGUiLCAic3RhcnRzV2l0aCIsICJzdHIiLCAiaW50ZXJzZWN0aW9uIiwgInN0YXJ0IiwgIndoZW4iLCAidmFsdWUiLCAiaXNTdHJpbmciLCAiZW5kc1dpdGgiLCAiZW5kIiwgIm1pbkxlbmd0aCIsICJtaW4iLCAibGVuZ3RoIiwgImxlbiIsICJtYXhMZW5ndGgiLCAibWF4IiwgImluY2x1ZGVzIiwgInN1YnN0ciIsICJyZWdleCIsICJleHByIiwgIkJvb2xlYW4iLCAibWF0Y2giLCAic3RyaW5nIiwgIm51bWJlckNoYWluYWJsZSIsICJiZXR3ZWVuIiwgImlzTnVtYmVyIiwgImx0IiwgImd0IiwgImx0ZSIsICJndGUiLCAiaW50IiwgIk51bWJlciIsICJpc0ludGVnZXIiLCAiZmluaXRlIiwgImlzRmluaXRlIiwgInBvc2l0aXZlIiwgIm5lZ2F0aXZlIiwgIm51bWJlciIsICJiaWdpbnRDaGFpbmFibGUiLCAiYmV0d2VlbkJpZ0ludCIsICJpc0JpZ0ludCIsICJiaWdpbnQiLCAiYm9vbGVhbiIsICJ4IiwgInN5bWJvbCIsICJudWxsaXNoIiwgIm5vbk51bGxhYmxlIiwgIk5vbkV4aGF1c3RpdmVFcnJvciIsICJFcnJvciIsICJjb25zdHJ1Y3RvciIsICJpbnB1dCIsICJkaXNwbGF5ZWRWYWx1ZSIsICJKU09OIiwgInN0cmluZ2lmeSIsICJlIiwgInN1cGVyIiwgInRoaXMiLCAidW5tYXRjaGVkIiwgIm1hdGNoZWQiLCAidmFsdWUiLCAidW5kZWZpbmVkIiwgIm1hdGNoIiwgIk1hdGNoRXhwcmVzc2lvbiIsICJzdGF0ZSIsICJ3aXRoIiwgImFyZ3MiLCAiaGFuZGxlciIsICJsZW5ndGgiLCAicGF0dGVybnMiLCAicHJlZGljYXRlIiwgInB1c2giLCAic2xpY2UiLCAiaGFzU2VsZWN0aW9ucyIsICJzZWxlY3RlZCIsICJzZWxlY3QiLCAia2V5IiwgInNvbWUiLCAicGF0dGVybiIsICJtYXRjaFBhdHRlcm4iLCAic3ltYm9scyIsICJ3aGVuIiwgIkJvb2xlYW4iLCAib3RoZXJ3aXNlIiwgImV4aGF1c3RpdmUiLCAicnVuIiwgInJldHVyblR5cGUiLCAic2hlbGwiLCAic2hlbGxOYW1lIiwgImlucHV0IiwgInRyaW1tZWRJbnB1dCIsICJpIiwgImwiLCAieiIsICJwYXRoIiwgImpvaW4iLCAiZXhpc3RzU3luYyIsICJkaXJuYW1lIiwgImlzQWJzb2x1dGUiLCAiam9pbiIsICJyZXNvbHZlIiwgImFic29sdXRlIiwgImlucHV0IiwgInJvb3QiLCAiaXNBYnNvbHV0ZSIsICJyZXNvbHZlIiwgInVwIiwgImJhc2UiLCAib3B0aW9ucyIsICJzdG9wIiwgImN3ZCIsICJ0bXAiLCAiYWJzb2x1dGUiLCAicm9vdCIsICJwcmV2IiwgImFyciIsICJkaXJuYW1lIiwgInVwIiwgIm5hbWUiLCAib3B0aW9ucyIsICJkaXIiLCAidG1wIiwgInN0YXJ0IiwgImpvaW4iLCAiZXhpc3RzU3luYyIsICJnZXRNb2R1bGVQYXRoIiwgImN3ZCIsICJsb2NrZmlsZSIsICJ1cCIsICJyZXBvUm9vdCIsICJwYXRoIiwgImRhZ2dlckpzb24iLCAic25ha2VUb0NhbWVsIiwgInN0ciIsICJyZXN1bHQiLCAicGFydHMiLCAiaSIsICJwYXJ0IiwgImNvbnZlcnRUb0NhbWVsIiwgImlucHV0IiwgIm91dHB1dCIsICJrZXkiLCAiY2FtZWxDYXNlS2V5IiwgImNhbWVsVG9TbmFrZSIsICJzdHIiLCAiY29udmVydFRvU25ha2UiLCAiaW5wdXQiLCAib3V0cHV0IiwgImtleSIsICJzbmFrZUNhc2VLZXkiXQp9Cg==
1
+ var M={workersMonorepo:{ignore:["**/node_modules/","**/.env","**/.secret","**/.wrangler","**/.dev.vars","**/.turbo/","**/dist/","**/dist2/","**/.DS_Store","**/.astro/","**/.next/","*.env"]}};import{AsyncLocalStorage as N}from"node:async_hooks";var E=new N;function B(e){let t=e.toString().replace(/(\r\n|\n|\r)/gm,""),n=t.match(/(?:async\s*)?(?:function\s*[\w\s]*)?\(([^)]*)\)/)??t.match(/^\s*(?:async\s*)?\(([^)]*)\)/);if(!n||typeof n[1]>"u")return console.warn("Could not extract parameter names from function string:",t),[];let o=n[1].replace(/\/\*.*?\*\//g,"").replace(/\/\/.*?$/gm,"");return o.trim()?o.split(",").map(s=>s.split(/[:=]/)[0]?.trim()??"").filter(s=>s.length>0):[]}function D(){return function(e,t,n){if(typeof n>"u"||typeof n.value!="function")throw new Error(`@ParamsToEnv decorator can only be applied to methods, not: ${String(t)}`);let r=n.value,o=null;n.value=function(...s){let c=E.getStore();o===null&&(o=B(r),o.length,s.length);let l={},w=new Set;o?.forEach((k,U)=>{/^[A-Z0-9_]+$/.test(k)&&(w.add(k),U<s.length&&(l[k]=s[U]))});let C={...c?.mergedEnv??{},...l},z={currentParams:w,mergedEnv:C};return E.run(z,()=>r.apply(this,s))}}}var m=Symbol.for("@ts-pattern/matcher"),Z=Symbol.for("@ts-pattern/isVariadic"),b="@ts-pattern/anonymous-select-key",F=e=>!!(e&&typeof e=="object"),T=e=>e&&!!e[m],f=(e,t,n)=>{if(T(e)){let r=e[m](),{matched:o,selections:s}=r.match(t);return o&&s&&Object.keys(s).forEach(c=>n(c,s[c])),o}if(F(e)){if(!F(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let r=[],o=[],s=[];for(let c of e.keys()){let l=e[c];T(l)&&l[Z]?s.push(l):s.length?o.push(l):r.push(l)}if(s.length){if(s.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<r.length+o.length)return!1;let c=t.slice(0,r.length),l=o.length===0?[]:t.slice(-o.length),w=t.slice(r.length,o.length===0?1/0:-o.length);return r.every((g,C)=>f(g,c[C],n))&&o.every((g,C)=>f(g,l[C],n))&&(s.length===0||f(s[0],w,n))}return e.length===t.length&&e.every((c,l)=>f(c,t[l],n))}return Reflect.ownKeys(e).every(r=>{let o=e[r];return(r in t||T(s=o)&&s[m]().matcherType==="optional")&&f(o,t[r],n);var s})}return Object.is(t,e)},S=e=>{var t,n,r;return F(e)?T(e)?(t=(n=(r=e[m]()).getSelectionKeys)==null?void 0:n.call(r))!=null?t:[]:Array.isArray(e)?$(e,S):$(Object.values(e),S):[]},$=(e,t)=>e.reduce((n,r)=>n.concat(t(r)),[]);function u(e){return Object.assign(e,{optional:()=>W(e),and:t=>a(e,t),or:t=>J(e,t),select:t=>t===void 0?L(e):L(t,e)})}function W(e){return u({[m]:()=>({match:t=>{let n={},r=(o,s)=>{n[o]=s};return t===void 0?(S(e).forEach(o=>r(o,void 0)),{matched:!0,selections:n}):{matched:f(e,t,r),selections:n}},getSelectionKeys:()=>S(e),matcherType:"optional"})})}function a(...e){return u({[m]:()=>({match:t=>{let n={},r=(o,s)=>{n[o]=s};return{matched:e.every(o=>f(o,t,r)),selections:n}},getSelectionKeys:()=>$(e,S),matcherType:"and"})})}function J(...e){return u({[m]:()=>({match:t=>{let n={},r=(o,s)=>{n[o]=s};return $(e,S).forEach(o=>r(o,void 0)),{matched:e.some(o=>f(o,t,r)),selections:n}},getSelectionKeys:()=>$(e,S),matcherType:"or"})})}function i(e){return{[m]:()=>({match:t=>({matched:!!e(t)})})}}function L(...e){let t=typeof e[0]=="string"?e[0]:void 0,n=e.length===2?e[1]:typeof e[0]=="string"?void 0:e[0];return u({[m]:()=>({match:r=>{let o={[t??b]:r};return{matched:n===void 0||f(n,r,(s,c)=>{o[s]=c}),selections:o}},getSelectionKeys:()=>[t??b].concat(n===void 0?[]:S(n))})})}function p(e){return typeof e=="number"}function d(e){return typeof e=="string"}function y(e){return typeof e=="bigint"}var le=u(i(function(e){return!0}));var v=e=>Object.assign(u(e),{startsWith:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.startsWith(n)))));var n},endsWith:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.endsWith(n)))));var n},minLength:t=>v(a(e,(n=>i(r=>d(r)&&r.length>=n))(t))),length:t=>v(a(e,(n=>i(r=>d(r)&&r.length===n))(t))),maxLength:t=>v(a(e,(n=>i(r=>d(r)&&r.length<=n))(t))),includes:t=>{return v(a(e,(n=t,i(r=>d(r)&&r.includes(n)))));var n},regex:t=>{return v(a(e,(n=t,i(r=>d(r)&&!!r.match(n)))));var n}}),ue=v(i(d)),h=e=>Object.assign(u(e),{between:(t,n)=>h(a(e,((r,o)=>i(s=>p(s)&&r<=s&&o>=s))(t,n))),lt:t=>h(a(e,(n=>i(r=>p(r)&&r<n))(t))),gt:t=>h(a(e,(n=>i(r=>p(r)&&r>n))(t))),lte:t=>h(a(e,(n=>i(r=>p(r)&&r<=n))(t))),gte:t=>h(a(e,(n=>i(r=>p(r)&&r>=n))(t))),int:()=>h(a(e,i(t=>p(t)&&Number.isInteger(t)))),finite:()=>h(a(e,i(t=>p(t)&&Number.isFinite(t)))),positive:()=>h(a(e,i(t=>p(t)&&t>0))),negative:()=>h(a(e,i(t=>p(t)&&t<0)))}),pe=h(i(p)),x=e=>Object.assign(u(e),{between:(t,n)=>x(a(e,((r,o)=>i(s=>y(s)&&r<=s&&o>=s))(t,n))),lt:t=>x(a(e,(n=>i(r=>y(r)&&r<n))(t))),gt:t=>x(a(e,(n=>i(r=>y(r)&&r>n))(t))),lte:t=>x(a(e,(n=>i(r=>y(r)&&r<=n))(t))),gte:t=>x(a(e,(n=>i(r=>y(r)&&r>=n))(t))),positive:()=>x(a(e,i(t=>y(t)&&t>0))),negative:()=>x(a(e,i(t=>y(t)&&t<0)))}),he=x(i(y)),fe=u(i(function(e){return typeof e=="boolean"})),me=u(i(function(e){return typeof e=="symbol"})),ge=u(i(function(e){return e==null})),de=u(i(function(e){return e!=null}));var P=class extends Error{constructor(t){let n;try{n=JSON.stringify(t)}catch{n=t}super(`Pattern matching error: no pattern matches value ${n}`),this.input=void 0,this.input=t}},R={matched:!1,value:void 0};function _(e){return new j(e,R)}var j=class e{constructor(t,n){this.input=void 0,this.state=void 0,this.input=t,this.state=n}with(...t){if(this.state.matched)return this;let n=t[t.length-1],r=[t[0]],o;t.length===3&&typeof t[1]=="function"?o=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let s=!1,c={},l=(g,C)=>{s=!0,c[g]=C},w=!r.some(g=>f(g,this.input,l))||o&&!o(this.input)?R:{matched:!0,value:n(s?b in c?c[b]:c:this.input,this.input)};return new e(this.input,w)}when(t,n){if(this.state.matched)return this;let r=!!t(this.input);return new e(this.input,r?{matched:!0,value:n(this.input,this.input)}:R)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(t=q){return this.state.matched?this.state.value:t(this.input)}run(){return this.exhaustive()}returnType(){return this}};function q(e){throw new P(e)}function V(e){return t=>{let r=(Array.isArray(t)?t:[t]).map(o=>o.trim().split(`
2
+ `).map(s=>s.trim()).join(`
3
+ `));return _(e).with("sh",()=>["sh","-c",`set -eu; ${r}`]).with("bash",()=>["bash","-c",`set -euo pipefail; ${r}`]).with("zsh",()=>["zsh","-c",`set -euo pipefail; ${r}`]).exhaustive()}}import I from"node:path";import{join as Y}from"node:path";import{existsSync as ee}from"node:fs";import{dirname as Q}from"node:path";import{isAbsolute as G,join as Ce,resolve as H}from"node:path";function K(e,t){return G(e)?e:H(t||".",e)}function O(e,t){let{stop:n,cwd:r}=t||{},o=K(e,r),s=!n,c,l=[];for(n&&(n=K(n,r));(s||o!==n)&&(l.push(o),o=Q(c=o),o!==c););return l}function A(e,t){let n,r,o=t&&t.cwd||"";for(n of O(o,t))if(r=Y(n,e),ee(r))return r}function te(e){e=e??process.cwd();let t=A("pnpm-lock.yaml",{cwd:e});if(!t)throw new Error("could not determine repo root path: unable to find pnpm-lock.yaml");let n=I.dirname(t),r=A("dagger.json",{cwd:e,stop:n});if(!r)throw new Error("could not determine dagger.json path: unable to find dagger.json");return I.relative(n,I.dirname(r))}function ne(e){if(!e)return"";if(e.includes("_")){let n="",r=e.split("_");for(let o=0;o<r.length;o++){let s=r[o];s&&(n.length===0?n+=s.toLowerCase():n+=s[0].toUpperCase()+s.slice(1).toLowerCase())}return n}return/^[A-Z0-9]+$/.test(e)?e.toLowerCase():e[0]===e[0].toLowerCase()?e:e[0].toLowerCase()+e.slice(1)}function re(e){let t={};for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=ne(n);t[r]=e[n]}return t}function oe(e){return e?e.replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([a-z])(\d)/g,"$1_$2").toUpperCase():""}function se(e){let t={};for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let r=oe(n);t[r]=e[n]}return t}export{D as ParamsToEnv,M as constants,re as convertToCamel,se as convertToSnake,E as envStorage,te as getModulePath,V as shell};
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZW52LnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNy4wL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9pbnRlcm5hbHMvc3ltYm9scy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHMtcGF0dGVybkA1LjcuMC9ub2RlX21vZHVsZXMvdHMtcGF0dGVybi9zcmMvaW50ZXJuYWxzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzLXBhdHRlcm5ANS43LjAvbm9kZV9tb2R1bGVzL3RzLXBhdHRlcm4vc3JjL2lzLW1hdGNoaW5nLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNy4wL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9wYXR0ZXJucy50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHMtcGF0dGVybkA1LjcuMC9ub2RlX21vZHVsZXMvdHMtcGF0dGVybi9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90cy1wYXR0ZXJuQDUuNy4wL25vZGVfbW9kdWxlcy90cy1wYXR0ZXJuL3NyYy9tYXRjaC50cyIsICIuLi9zcmMvc2hlbGwudHMiLCAiLi4vc3JjL3BhdGgudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2VtcGF0aGljQDEuMS4wL25vZGVfbW9kdWxlcy9lbXBhdGhpYy9maW5kLm1qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZW1wYXRoaWNAMS4xLjAvbm9kZV9tb2R1bGVzL2VtcGF0aGljL3dhbGsubWpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9lbXBhdGhpY0AxLjEuMC9ub2RlX21vZHVsZXMvZW1wYXRoaWMvcmVzb2x2ZS5tanMiLCAiLi4vc3JjL2NvbnZlcnQvc25ha2UtdG8tY2FtZWwudHMiLCAiLi4vc3JjL2NvbnZlcnQvY2FtZWwtdG8tc25ha2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKiB2YXJpb3VzIGNvbnN0YW50cyBmb3IgZGFnZ2VyIG1vZHVsZXMgaW4gbXkgcmVwb3MgKi9cbmV4cG9ydCBjb25zdCBjb25zdGFudHMgPSB7XG5cdC8qKiBjb25zdGFudHMgZm9yIHdvcmtlcnMtbW9ub3JlcG8gKi9cblx0d29ya2Vyc01vbm9yZXBvOiB7XG5cdFx0LyoqIGRlZmF1bHQgc291cmNlIGlnbm9yZSBsaXN0ICovXG5cdFx0aWdub3JlOiBbXG5cdFx0XHQnKiovbm9kZV9tb2R1bGVzLycsXG5cdFx0XHQnKiovLmVudicsXG5cdFx0XHQnKiovLnNlY3JldCcsXG5cdFx0XHQnKiovLndyYW5nbGVyJyxcblx0XHRcdCcqKi8uZGV2LnZhcnMnLFxuXHRcdFx0JyoqLy50dXJiby8nLFxuXHRcdFx0JyoqL2Rpc3QvJyxcblx0XHRcdCcqKi9kaXN0Mi8nLFxuXHRcdFx0JyoqLy5EU19TdG9yZScsXG5cdFx0XHQnKiovLmFzdHJvLycsXG5cdFx0XHQnKiovLm5leHQvJyxcblx0XHRcdCcqLmVudicsXG5cdFx0XSBzYXRpc2ZpZXMgc3RyaW5nW10sXG5cdH0sXG59IGFzIGNvbnN0XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuXG5pbXBvcnQgdHlwZSB7IFNlY3JldCB9IGZyb20gJ0BkYWdnZXIuaW8vZGFnZ2VyJ1xuXG4vKipcbiAqIFN0cnVjdHVyZSBzdG9yZWQgaW4gQXN5bmNMb2NhbFN0b3JhZ2UsIGNvbnRhaW5pbmcgYm90aCB0aGUgZnVsbHkgbWVyZ2VkXG4gKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHRoZSBzZXQgb2YgdmFyaWFibGVzIGV4cGxpY2l0bHkgcGFzc2VkIHRvIHRoZVxuICogY3VycmVudCBkZWNvcmF0ZWQgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZDb250ZXh0IHtcblx0Y3VycmVudFBhcmFtczogU2V0PHN0cmluZz5cblx0bWVyZ2VkRW52OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXQgfCBzdHJpbmcgfCB1bmRlZmluZWQ+XG59XG5cbi8qKlxuICogU3RvcmUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBhY2Nlc3NpYmxlIHZpYSBBc3luY0xvY2FsU3RvcmFnZVxuICovXG5leHBvcnQgY29uc3QgZW52U3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxFbnZDb250ZXh0PigpXG5cbi8qKlxuICogSGVscGVyIHRvIGV4dHJhY3QgcGFyYW1ldGVyIG5hbWVzIGZyb20gYSBmdW5jdGlvbidzIHNvdXJjZSBjb2RlLlxuICogTm90ZTogVGhpcyBhcHByb2FjaCB1c2luZyBGdW5jdGlvbi50b1N0cmluZygpIGNhbiBiZSBmcmFnaWxlIGFuZCBtaWdodFxuICogYnJlYWsgd2l0aCBjb2RlIG1pbmlmaWNhdGlvbiBvciBjb21wbGV4IGZ1bmN0aW9uIGRlZmluaXRpb25zLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQYXJhbU5hbWVzKGZ1bmM6IEZ1bmN0aW9uKTogc3RyaW5nW10ge1xuXHRjb25zdCBmdW5jU3RyID0gZnVuYy50b1N0cmluZygpLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICcnKVxuXHQvLyBSZWdleCB0byBmaW5kIHBhcmFtZXRlciBsaXN0IHdpdGhpbiBwYXJlbnRoZXNlcywgaGFuZGxlcyB2YXJpb3VzIGZ1bmN0aW9uIGRlZmluaXRpb24gc3R5bGVzXG5cdGNvbnN0IHBhcmFtc01hdGNoID1cblx0XHRmdW5jU3RyLm1hdGNoKC8oPzphc3luY1xccyopPyg/OmZ1bmN0aW9uXFxzKltcXHdcXHNdKik/XFwoKFteKV0qKVxcKS8pID8/XG5cdFx0ZnVuY1N0ci5tYXRjaCgvXlxccyooPzphc3luY1xccyopP1xcKChbXildKilcXCkvKSAvLyBBcnJvdyBmdW5jdGlvbiBzdXBwb3J0XG5cblx0aWYgKCFwYXJhbXNNYXRjaCB8fCB0eXBlb2YgcGFyYW1zTWF0Y2hbMV0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0Y29uc29sZS53YXJuKCdDb3VsZCBub3QgZXh0cmFjdCBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBmdW5jdGlvbiBzdHJpbmc6JywgZnVuY1N0cilcblx0XHRyZXR1cm4gW11cblx0fVxuXHRjb25zdCBwYXJhbXNTdHIgPSBwYXJhbXNNYXRjaFsxXVxuXG5cdC8vIFJlbW92ZSBjb21tZW50cywgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0eXBlIGFubm90YXRpb25zIHRvIGlzb2xhdGUgbmFtZXNcblx0Y29uc3QgY2xlYW5lZFBhcmFtc1N0ciA9IHBhcmFtc1N0clxuXHRcdC5yZXBsYWNlKC9cXC9cXCouKj9cXCpcXC8vZywgJycpIC8vIFJlbW92ZSBibG9jayBjb21tZW50c1xuXHRcdC5yZXBsYWNlKC9cXC9cXC8uKj8kL2dtLCAnJykgLy8gUmVtb3ZlIGxpbmUgY29tbWVudHNcblxuXHRpZiAoIWNsZWFuZWRQYXJhbXNTdHIudHJpbSgpKSB7XG5cdFx0cmV0dXJuIFtdIC8vIE5vIHBhcmFtZXRlcnNcblx0fVxuXG5cdHJldHVybiBjbGVhbmVkUGFyYW1zU3RyXG5cdFx0LnNwbGl0KCcsJylcblx0XHQubWFwKChwYXJhbSkgPT4ge1xuXHRcdFx0Ly8gUmVtb3ZlIHR5cGUgYW5ub3RhdGlvbnMgKGUuZy4sIFwiOiBTZWNyZXRcIikgYW5kIGRlZmF1bHQgaW5pdGlhbGl6ZXJzIChlLmcuLCBcIj0gJ2RlZmF1bHQnXCIpXG5cdFx0XHRjb25zdCBuYW1lUGFydCA9IHBhcmFtLnNwbGl0KC9bOj1dLylbMF1cblx0XHRcdHJldHVybiBuYW1lUGFydD8udHJpbSgpID8/ICcnXG5cdFx0fSlcblx0XHQuZmlsdGVyKChuYW1lKSA9PiBuYW1lLmxlbmd0aCA+IDApIC8vIEZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBmcm9tIHRyYWlsaW5nIGNvbW1hcyBldGMuXG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCB3cmFwcyBhIG1ldGhvZCB0byBjYXB0dXJlIGl0cyBhcmd1bWVudHMgYmFzZWQgb25cbiAqIGV4dHJhY3RlZCBwYXJhbWV0ZXIgbmFtZXMgYW5kIHN0b3JlIHRoZW0gaW4gQXN5bmNMb2NhbFN0b3JhZ2UuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBmdW5jdGlvbiBQYXJhbXNUb0VudigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKF90YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0aWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgQFBhcmFtc1RvRW52IGRlY29yYXRvciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIG1ldGhvZHMsIG5vdDogJHtTdHJpbmcocHJvcGVydHlLZXkpfWBcblx0XHRcdClcblx0XHR9XG5cdFx0Y29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlXG5cblx0XHRsZXQgcGFyYW1OYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbCAvLyBDYWNoZSBwYXJhbWV0ZXIgbmFtZXMgbGF6aWx5XG5cblx0XHRkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKTogYW55IHtcblx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBlbnZTdG9yYWdlLmdldFN0b3JlKClcblxuXHRcdFx0aWYgKHBhcmFtTmFtZXMgPT09IG51bGwpIHtcblx0XHRcdFx0cGFyYW1OYW1lcyA9IGV4dHJhY3RQYXJhbU5hbWVzKG9yaWdpbmFsTWV0aG9kKVxuXHRcdFx0XHQvLyBCYXNpYyB2YWxpZGF0aW9uOiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIGV4dHJhY3RlZCBuYW1lcyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkLlxuXHRcdFx0XHQvLyBUaGlzIG1pZ2h0IGJlIGluYWNjdXJhdGUgaWYgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmVuJ3QgcGFzc2VkLlxuXHRcdFx0XHRpZiAocGFyYW1OYW1lcy5sZW5ndGggIT09IGFyZ3MubGVuZ3RoICYmIHR5cGVvZiBwcm9wZXJ0eUtleSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHQvLyBMb2cgYSB3YXJuaW5nIGJ1dCBhdHRlbXB0IHRvIHByb2NlZWQuIFRoZSBjb250ZXh0IG1pZ2h0IGJlIGluY29tcGxldGUuXG5cdFx0XHRcdFx0Ly8gTm90ZTogRGlzYWJsaW5nIHRoaXMgZm9yIG5vdyBiZWNhdXNlIG9wdGlvbmFsIHBhcmFtZXRlcnMgdHJpZ2dlciB0aGlzIHdhcm5pbmcuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS53YXJuKFxuXHRcdFx0XHRcdC8vIFx0YFBhcmFtZXRlciBuYW1lIGV4dHJhY3Rpb24vYXJndW1lbnQgY291bnQgbWlzbWF0Y2ggZm9yICR7cHJvcGVydHlLZXl9OiBgICtcblx0XHRcdFx0XHQvLyBcdFx0YEV4dHJhY3RlZCAke3BhcmFtTmFtZXMubGVuZ3RofSBuYW1lcyAoJHtwYXJhbU5hbWVzLmpvaW4oJywgJyl9KSwgcmVjZWl2ZWQgJHthcmdzLmxlbmd0aH0gYXJncy4gYCArXG5cdFx0XHRcdFx0Ly8gXHRcdGBDb250ZXh0IGluIEFzeW5jTG9jYWxTdG9yYWdlIG1heSBiZSBpbmNvbXBsZXRlIG9yIGluY29ycmVjdC5gXG5cdFx0XHRcdFx0Ly8gKVxuXHRcdFx0XHRcdC8vIE9wdGlvbmFsbHksIHlvdSBjb3VsZCB0cnkgdG8gcGFkIHBhcmFtTmFtZXMgb3IgdHJ1bmNhdGUgYXJncywgYnV0IGl0J3Mgcmlza3kuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbmV3RW52OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXQgfCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge31cblx0XHRcdGNvbnN0IGN1cnJlbnRQYXJhbXMgPSBuZXcgU2V0PHN0cmluZz4oKSAvLyBUcmFjayBwYXJhbXMgZm9yIGN1cnJlbnQgbWV0aG9kXG5cdFx0XHRwYXJhbU5hbWVzPy5mb3JFYWNoKChuYW1lLCBpbmRleCkgPT4ge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgcGFyYW0gbmFtZSBtYXRjaGVzIHRoZSBFTlZfVkFSIHBhdHRlcm5cblx0XHRcdFx0aWYgKC9eW0EtWjAtOV9dKyQvLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0XHQvLyBBZGQgYWxsIG1hdGNoaW5nIGRlZmluZWQgcGFyYW1ldGVyIG5hbWVzIHRvIGN1cnJlbnRQYXJhbXNcblx0XHRcdFx0XHRjdXJyZW50UGFyYW1zLmFkZChuYW1lKVxuXHRcdFx0XHRcdC8vIE9ubHkgYWRkIHRvIG5ld0VudiBpZiBhcmd1bWVudCB3YXMgYWN0dWFsbHkgcGFzc2VkXG5cdFx0XHRcdFx0aWYgKGluZGV4IDwgYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG5ld0VudltuYW1lXSA9IGFyZ3NbaW5kZXhdXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIElmIHBhcmFtTmFtZXMubGVuZ3RoID4gYXJncy5sZW5ndGgsIHNvbWUgbmFtZXMgd29uJ3QgZ2V0IGEgdmFsdWUsIHdoaWNoIGlzIGV4cGVjdGVkIGZvciBvcHRpb25hbCBwYXJhbXMuXG5cdFx0XHR9KVxuXG5cdFx0XHQvLyBtZXJnZSBwYXJlbnQgY29udGV4dCB3aXRoIG5ldyBjb250ZXh0IChuZXcgdGFrZXMgcHJlY2VkZW5jZSlcblx0XHRcdGNvbnN0IHBhcmVudE1lcmdlZEVudiA9IHBhcmVudENvbnRleHQ/Lm1lcmdlZEVudiA/PyB7fVxuXHRcdFx0Y29uc3QgbWVyZ2VkRW52ID0geyAuLi5wYXJlbnRNZXJnZWRFbnYsIC4uLm5ld0VudiB9XG5cblx0XHRcdC8vIFByZXBhcmUgY29udGV4dCBvYmplY3QgZm9yIHN0b3JhZ2Vcblx0XHRcdGNvbnN0IGNvbnRleHRUb1N0b3JlOiBFbnZDb250ZXh0ID0ge1xuXHRcdFx0XHRjdXJyZW50UGFyYW1zLFxuXHRcdFx0XHRtZXJnZWRFbnYsXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGhpbiB0aGUgQXN5bmNMb2NhbFN0b3JhZ2UgY29udGV4dCB1c2luZyB0aGUgbWVyZ2VkIGVudlxuXHRcdFx0cmV0dXJuIGVudlN0b3JhZ2UucnVuKGNvbnRleHRUb1N0b3JlLCAoKSA9PiB7XG5cdFx0XHRcdC8vIFRoZSBvcmlnaW5hbCBtZXRob2QgaXMgY2FsbGVkIHdpdGggaXRzIG9yaWdpbmFsIGFyZ3VtZW50c1xuXHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncylcblx0XHRcdH0pXG5cdFx0fVxuXHR9XG59XG4iLCAiLyoqXG4gKiBTeW1ib2xzIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdHMtcGF0dGVybiB0byBjb25zdHJ1Y3QgYW5kIGRpc2NyaW1pbmF0ZVxuICogR3VhcmQsIE5vdCwgYW5kIFNlbGVjdCwgYW5kIEFub255bW91c1NlbGVjdCBwYXR0ZXJuc1xuICpcbiAqIFN5bWJvbHMgaGF2ZSB0aGUgYWR2YW50YWdlIG9mIG5vdCBhcHBlYXJpbmcgaW4gYXV0by1jb21wbGV0ZSBzdWdnZXN0aW9ucyBpblxuICogdXNlciBkZWZpbmVkIHBhdHRlcm5zLCBhbmQgZWxpbWluYXRlIHRoZSByaXNrIG9mIHByb3BlcnR5XG4gKiBvdmVybGFwIGJldHdlZW4gdHMtcGF0dGVybiBpbnRlcm5hbHMgYW5kIHVzZXIgZGVmaW5lZCBwYXR0ZXJucy5cbiAqXG4gKiBUaGVzZSBzeW1ib2xzIGhhdmUgdG8gYmUgdmlzaWJsZSB0byB0c2MgZm9yIHR5cGUgaW5mZXJlbmNlIHRvIHdvcmssIGJ1dFxuICogdXNlcnMgc2hvdWxkIG5vdCBpbXBvcnQgdGhlbVxuICogQG1vZHVsZVxuICogQHByaXZhdGVcbiAqIEBpbnRlcm5hbFxuICovXG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyID0gU3ltYm9sLmZvcignQHRzLXBhdHRlcm4vbWF0Y2hlcicpO1xuZXhwb3J0IHR5cGUgbWF0Y2hlciA9IHR5cGVvZiBtYXRjaGVyO1xuXG5leHBvcnQgY29uc3QgdW5zZXQgPSBTeW1ib2wuZm9yKCdAdHMtcGF0dGVybi91bnNldCcpO1xuZXhwb3J0IHR5cGUgdW5zZXQgPSB0eXBlb2YgdW5zZXQ7XG5cbmV4cG9ydCBjb25zdCBpc1ZhcmlhZGljID0gU3ltYm9sLmZvcignQHRzLXBhdHRlcm4vaXNWYXJpYWRpYycpO1xuZXhwb3J0IHR5cGUgaXNWYXJpYWRpYyA9IHR5cGVvZiBpc1ZhcmlhZGljO1xuXG4vLyBjYW4ndCBiZSBhIHN5bWJvbCBiZWNhdXNlIHRoaXMga2V5IGhhcyB0byBiZSBlbnVtZXJhYmxlLlxuZXhwb3J0IGNvbnN0IGFub255bW91c1NlbGVjdEtleSA9ICdAdHMtcGF0dGVybi9hbm9ueW1vdXMtc2VsZWN0LWtleSc7XG5leHBvcnQgdHlwZSBhbm9ueW1vdXNTZWxlY3RLZXkgPSB0eXBlb2YgYW5vbnltb3VzU2VsZWN0S2V5O1xuXG5leHBvcnQgY29uc3Qgb3ZlcnJpZGUgPSBTeW1ib2wuZm9yKCdAdHMtcGF0dGVybi9vdmVycmlkZScpO1xuZXhwb3J0IHR5cGUgb3ZlcnJpZGUgPSB0eXBlb2Ygb3ZlcnJpZGU7XG4iLCAiLyoqXG4gKiBAbW9kdWxlXG4gKiBAcHJpdmF0ZVxuICogQGludGVybmFsXG4gKi9cblxuaW1wb3J0ICogYXMgc3ltYm9scyBmcm9tICcuL3N5bWJvbHMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4uL3R5cGVzL0ZpbmRTZWxlY3RlZCc7XG5pbXBvcnQgeyBQYXR0ZXJuLCBNYXRjaGVyLCBNYXRjaGVyVHlwZSwgQW55TWF0Y2hlciB9IGZyb20gJy4uL3R5cGVzL1BhdHRlcm4nO1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBpc09iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE9iamVjdCA9PlxuICBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpO1xuXG4vLyAgIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGlzTWF0Y2hlciA9IChcbiAgeDogdW5rbm93blxuKTogeCBpcyBNYXRjaGVyPHVua25vd24sIHVua25vd24sIE1hdGNoZXJUeXBlLCBTZWxlY3Rpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHBhdHRlcm4gPSB4IGFzIE1hdGNoZXI8dW5rbm93biwgdW5rbm93biwgTWF0Y2hlclR5cGUsIFNlbGVjdGlvblR5cGU+O1xuICByZXR1cm4gcGF0dGVybiAmJiAhIXBhdHRlcm5bc3ltYm9scy5tYXRjaGVyXTtcbn07XG5cbi8vIEBpbnRlcm5hbFxuY29uc3QgaXNPcHRpb25hbFBhdHRlcm4gPSAoXG4gIHg6IHVua25vd25cbik6IHggaXMgTWF0Y2hlcjx1bmtub3duLCB1bmtub3duLCAnb3B0aW9uYWwnLCBTZWxlY3Rpb25UeXBlPiA9PiB7XG4gIHJldHVybiBpc01hdGNoZXIoeCkgJiYgeFtzeW1ib2xzLm1hdGNoZXJdKCkubWF0Y2hlclR5cGUgPT09ICdvcHRpb25hbCc7XG59O1xuXG4vLyB0ZWxscyB1cyBpZiB0aGUgdmFsdWUgbWF0Y2hlcyBhIGdpdmVuIHBhdHRlcm4uXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBtYXRjaFBhdHRlcm4gPSAoXG4gIHBhdHRlcm46IGFueSxcbiAgdmFsdWU6IGFueSxcbiAgc2VsZWN0OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGlzTWF0Y2hlcihwYXR0ZXJuKSkge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBwYXR0ZXJuW3N5bWJvbHMubWF0Y2hlcl0oKTtcbiAgICBjb25zdCB7IG1hdGNoZWQsIHNlbGVjdGlvbnMgfSA9IG1hdGNoZXIubWF0Y2godmFsdWUpO1xuICAgIGlmIChtYXRjaGVkICYmIHNlbGVjdGlvbnMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHNlbGVjdGlvbnMpLmZvckVhY2goKGtleSkgPT4gc2VsZWN0KGtleSwgc2VsZWN0aW9uc1trZXldKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KHBhdHRlcm4pKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFR1cGxlIHBhdHRlcm5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgbGV0IHN0YXJ0UGF0dGVybnMgPSBbXTtcbiAgICAgIGxldCBlbmRQYXR0ZXJucyA9IFtdO1xuICAgICAgbGV0IHZhcmlhZGljUGF0dGVybnM6IEFueU1hdGNoZXJbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGkgb2YgcGF0dGVybi5rZXlzKCkpIHtcbiAgICAgICAgY29uc3Qgc3VicGF0dGVybiA9IHBhdHRlcm5baV07XG4gICAgICAgIGlmIChpc01hdGNoZXIoc3VicGF0dGVybikgJiYgc3VicGF0dGVybltzeW1ib2xzLmlzVmFyaWFkaWNdKSB7XG4gICAgICAgICAgdmFyaWFkaWNQYXR0ZXJucy5wdXNoKHN1YnBhdHRlcm4pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhcmlhZGljUGF0dGVybnMubGVuZ3RoKSB7XG4gICAgICAgICAgZW5kUGF0dGVybnMucHVzaChzdWJwYXR0ZXJuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFydFBhdHRlcm5zLnB1c2goc3VicGF0dGVybik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhZGljUGF0dGVybnMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YXJpYWRpY1BhdHRlcm5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgUGF0dGVybiBlcnJvcjogVXNpbmcgXFxgLi4uUC5hcnJheSguLi4pXFxgIHNldmVyYWwgdGltZXMgaW4gYSBzaW5nbGUgcGF0dGVybiBpcyBub3QgYWxsb3dlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCBzdGFydFBhdHRlcm5zLmxlbmd0aCArIGVuZFBhdHRlcm5zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVzID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRQYXR0ZXJucy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZXMgPVxuICAgICAgICAgIGVuZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCA/IFtdIDogdmFsdWUuc2xpY2UoLWVuZFBhdHRlcm5zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1pZGRsZVZhbHVlcyA9IHZhbHVlLnNsaWNlKFxuICAgICAgICAgIHN0YXJ0UGF0dGVybnMubGVuZ3RoLFxuICAgICAgICAgIGVuZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCA/IEluZmluaXR5IDogLWVuZFBhdHRlcm5zLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc3RhcnRQYXR0ZXJucy5ldmVyeSgoc3ViUGF0dGVybiwgaSkgPT5cbiAgICAgICAgICAgIG1hdGNoUGF0dGVybihzdWJQYXR0ZXJuLCBzdGFydFZhbHVlc1tpXSwgc2VsZWN0KVxuICAgICAgICAgICkgJiZcbiAgICAgICAgICBlbmRQYXR0ZXJucy5ldmVyeSgoc3ViUGF0dGVybiwgaSkgPT5cbiAgICAgICAgICAgIG1hdGNoUGF0dGVybihzdWJQYXR0ZXJuLCBlbmRWYWx1ZXNbaV0sIHNlbGVjdClcbiAgICAgICAgICApICYmXG4gICAgICAgICAgKHZhcmlhZGljUGF0dGVybnMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogbWF0Y2hQYXR0ZXJuKHZhcmlhZGljUGF0dGVybnNbMF0sIG1pZGRsZVZhbHVlcywgc2VsZWN0KSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhdHRlcm4ubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGhcbiAgICAgICAgPyBwYXR0ZXJuLmV2ZXJ5KChzdWJQYXR0ZXJuLCBpKSA9PlxuICAgICAgICAgICAgbWF0Y2hQYXR0ZXJuKHN1YlBhdHRlcm4sIHZhbHVlW2ldLCBzZWxlY3QpXG4gICAgICAgICAgKVxuICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMocGF0dGVybikuZXZlcnkoKGspOiBib29sZWFuID0+IHtcbiAgICAgIGNvbnN0IHN1YlBhdHRlcm4gPSBwYXR0ZXJuW2tdO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICAoayBpbiB2YWx1ZSB8fCBpc09wdGlvbmFsUGF0dGVybihzdWJQYXR0ZXJuKSkgJiZcbiAgICAgICAgbWF0Y2hQYXR0ZXJuKHN1YlBhdHRlcm4sIHZhbHVlW2tdLCBzZWxlY3QpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5pcyh2YWx1ZSwgcGF0dGVybik7XG59O1xuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25LZXlzID0gKHBhdHRlcm46IGFueSk6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGlzT2JqZWN0KHBhdHRlcm4pKSB7XG4gICAgaWYgKGlzTWF0Y2hlcihwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHBhdHRlcm5bc3ltYm9scy5tYXRjaGVyXSgpLmdldFNlbGVjdGlvbktleXM/LigpID8/IFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkgcmV0dXJuIGZsYXRNYXAocGF0dGVybiwgZ2V0U2VsZWN0aW9uS2V5cyk7XG4gICAgcmV0dXJuIGZsYXRNYXAoT2JqZWN0LnZhbHVlcyhwYXR0ZXJuKSwgZ2V0U2VsZWN0aW9uS2V5cyk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufTtcblxuLy8gQGludGVybmFsXG5leHBvcnQgY29uc3QgZmxhdE1hcCA9IDxhLCBiPihcbiAgeHM6IHJlYWRvbmx5IGFbXSxcbiAgZjogKHY6IGEpID0+IHJlYWRvbmx5IGJbXVxuKTogYltdID0+IHhzLnJlZHVjZTxiW10+KChhY2MsIHgpID0+IGFjYy5jb25jYXQoZih4KSksIFtdKTtcbiIsICJpbXBvcnQgeyBNYXRjaGVkVmFsdWUsIFBhdHRlcm4sIFVua25vd25Qcm9wZXJ0aWVzIH0gZnJvbSAnLi90eXBlcy9QYXR0ZXJuJztcbmltcG9ydCAqIGFzIFAgZnJvbSAnLi9wYXR0ZXJucyc7XG5pbXBvcnQgeyBtYXRjaFBhdHRlcm4gfSBmcm9tICcuL2ludGVybmFscy9oZWxwZXJzJztcbmltcG9ydCB7IFdpdGhEZWZhdWx0IH0gZnJvbSAnLi90eXBlcy9oZWxwZXJzJztcblxuLyoqXG4gKiBUaGlzIGNvbnN0cmFpbnQgYWxsb3dzIHVzaW5nIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICogaW4gb2JqZWN0IHBhdHRlcm5zLiBTZWUgXCJzaG91bGQgYWxsb3cgdGFyZ2V0dGluZyB1bmtub3duIHByb3BlcnRpZXNcIlxuICogdW5pdCB0ZXN0IGluIGBpcy1tYXRjaGluZy50ZXN0LnRzYC5cbiAqL1xudHlwZSBQYXR0ZXJuQ29uc3RyYWludDxUPiA9IFQgZXh0ZW5kcyByZWFkb25seSBhbnlbXVxuICA/IFAuUGF0dGVybjxUPlxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyBQLlBhdHRlcm48VD4gJiBVbmtub3duUHJvcGVydGllc1xuICA6IFAuUGF0dGVybjxUPjtcblxuLyoqXG4gKiBgaXNNYXRjaGluZ2AgdGFrZXMgcGF0dGVybiBhbmQgcmV0dXJucyBhICoqdHlwZSBndWFyZCoqIGZ1bmN0aW9uLCBjaGVjaGluZyBpZiBhIHZhbHVlIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLlxuICpcbiAqIFtSZWFkICBkb2N1bWVudGF0aW9uIGZvciBgaXNNYXRjaGluZ2Agb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jaXNtYXRjaGluZylcbiAqXG4gKiBAZXhhbXBsZVxuICogIGNvbnN0IGhhc05hbWUgPSBpc01hdGNoaW5nKHsgbmFtZTogUC5zdHJpbmcgfSlcbiAqXG4gKiAgZGVjbGFyZSBsZXQgaW5wdXQ6IHVua25vd25cbiAqXG4gKiAgaWYgKGhhc05hbWUoaW5wdXQpKSB7XG4gKiAgICAvLyBgaW5wdXRgIGluZmVycmVkIGFzIHsgbmFtZTogc3RyaW5nIH1cbiAqICAgIHJldHVybiBpbnB1dC5uYW1lXG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXRjaGluZzxjb25zdCBwIGV4dGVuZHMgUGF0dGVybjx1bmtub3duPj4oXG4gIHBhdHRlcm46IHBcbik6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgUC5pbmZlcjxwPjtcbi8qKlxuICogYGlzTWF0Y2hpbmdgIHRha2VzIHBhdHRlcm4gYW5kIGEgdmFsdWUgYW5kIGNoZWNrcyBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGlzIHBhdHRlcm4uXG4gKlxuICogW1JlYWQgIGRvY3VtZW50YXRpb24gZm9yIGBpc01hdGNoaW5nYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNpc21hdGNoaW5nKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgZGVjbGFyZSBsZXQgaW5wdXQ6IHVua25vd25cbiAqXG4gKiAgaWYgKGlzTWF0Y2hpbmcoeyBuYW1lOiBQLnN0cmluZyB9LCBpbnB1dCkpIHtcbiAqICAgIC8vIGBpbnB1dGAgaW5mZXJyZWQgYXMgeyBuYW1lOiBzdHJpbmcgfVxuICogICAgcmV0dXJuIGlucHV0Lm5hbWVcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nPGNvbnN0IFQsIGNvbnN0IFAgZXh0ZW5kcyBQYXR0ZXJuQ29uc3RyYWludDxUPj4oXG4gIHBhdHRlcm46IFAsXG4gIHZhbHVlOiBUXG4pOiB2YWx1ZSBpcyBUICYgV2l0aERlZmF1bHQ8UC5uYXJyb3c8VCwgUD4sIFAuaW5mZXI8UD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXRjaGluZzxjb25zdCBwIGV4dGVuZHMgUGF0dGVybjxhbnk+PihcbiAgLi4uYXJnczogW3BhdHRlcm46IHAsIHZhbHVlPzogYW55XVxuKTogYm9vbGVhbiB8ICgodmFsZTogYW55KSA9PiBib29sZWFuKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IFtwYXR0ZXJuXSA9IGFyZ3M7XG4gICAgcmV0dXJuICh2YWx1ZTogYW55KTogdmFsdWUgaXMgTWF0Y2hlZFZhbHVlPGFueSwgUC5pbmZlcjxwPj4gPT5cbiAgICAgIG1hdGNoUGF0dGVybihwYXR0ZXJuLCB2YWx1ZSwgKCkgPT4ge30pO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IFtwYXR0ZXJuLCB2YWx1ZV0gPSBhcmdzO1xuICAgIHJldHVybiBtYXRjaFBhdHRlcm4ocGF0dGVybiwgdmFsdWUsICgpID0+IHt9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgaXNNYXRjaGluZyB3YXNuJ3QgZ2l2ZW4gdGhlIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHM6IGV4cGVjdGVkIDEgb3IgMiwgcmVjZWl2ZWQgJHthcmdzLmxlbmd0aH0uYFxuICApO1xufVxuIiwgIi8qKlxuICogVGhlIGBQYCBtb2R1bGUgY29udGFpbnMgcGF0dGVybnMgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2lsZGNhcmRzIGFuZFxuICogb3RoZXIgcGF0dGVybi1tYXRjaGluZyB1dGlsaXRpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1hdGNoUGF0dGVybiwgZ2V0U2VsZWN0aW9uS2V5cywgZmxhdE1hcCB9IGZyb20gJy4vaW50ZXJuYWxzL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgc3ltYm9scyBmcm9tICcuL2ludGVybmFscy9zeW1ib2xzJztcbmltcG9ydCB7IG1hdGNoZXIgfSBmcm9tICcuL2ludGVybmFscy9zeW1ib2xzJztcbmltcG9ydCB7IGlzTWF0Y2hpbmcgfSBmcm9tICcuL2lzLW1hdGNoaW5nJztcbmltcG9ydCB7IEV4dHJhY3RQcmVjaXNlVmFsdWUgfSBmcm9tICcuL3R5cGVzL0V4dHJhY3RQcmVjaXNlVmFsdWUnO1xuaW1wb3J0IHsgRm4gfSBmcm9tICcuL3R5cGVzL2hlbHBlcnMnO1xuaW1wb3J0IHsgSW52ZXJ0UGF0dGVybiB9IGZyb20gJy4vdHlwZXMvSW52ZXJ0UGF0dGVybic7XG5pbXBvcnQge1xuICBQYXR0ZXJuLFxuICBVbmtub3duUGF0dGVybixcbiAgT3B0aW9uYWxQLFxuICBBcnJheVAsXG4gIE1hcFAsXG4gIFNldFAsXG4gIEFuZFAsXG4gIE9yUCxcbiAgTm90UCxcbiAgR3VhcmRQLFxuICBTZWxlY3RQLFxuICBBbm9ueW1vdXNTZWxlY3RQLFxuICBHdWFyZEV4Y2x1ZGVQLFxuICBDdXN0b21QLFxuICBNYXRjaGVyLFxuICBTdHJpbmdQYXR0ZXJuLFxuICBBbnlQYXR0ZXJuLFxuICBOdW1iZXJQYXR0ZXJuLFxuICBCb29sZWFuUGF0dGVybixcbiAgQmlnSW50UGF0dGVybixcbiAgTnVsbGlzaFBhdHRlcm4sXG4gIFN5bWJvbFBhdHRlcm4sXG4gIENoYWluYWJsZSxcbiAgQmlnSW50Q2hhaW5hYmxlLFxuICBOdW1iZXJDaGFpbmFibGUsXG4gIFN0cmluZ0NoYWluYWJsZSxcbiAgQXJyYXlDaGFpbmFibGUsXG4gIFZhcmlhZGljLFxuICBOb25OdWxsYWJsZVBhdHRlcm4sXG59IGZyb20gJy4vdHlwZXMvUGF0dGVybic7XG5cbmV4cG9ydCB0eXBlIHtcbiAgLyoqXG4gICAqIGBQYXR0ZXJuPFQ+YCBpcyB0aGUgdHlwZSBvZiBhbGwgcGF0dGVybnNcbiAgICogdGhhdCBjYW4gbWF0Y2ggYSB2YWx1ZSBvZiB0eXBlIGBUYC5cbiAgICovXG4gIFBhdHRlcm4sXG5cbiAgLyoqXG4gICAqIGB1bnN0YWJsZV9GbmAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlZCBhXG4gICAqIGEgTWF0Y2hhYmxlIGluc3RhbmNlIOKAkyBhIGN1c3RvbSB0eXBlIHRoYXRcbiAgICogY2FuIGJlIHVzZWQgYXMgYSBwYXR0ZXJuLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgZmVhdHVyZSBpcyB1bnN0YWJsZS5cbiAgICovXG4gIEZuIGFzIHVuc3RhYmxlX0ZuLFxufTtcblxuZXhwb3J0IHsgbWF0Y2hlciB9O1xuXG4vKipcbiAqIEEgYE1hdGNoYWJsZWAgaXMgYW4gb2JqZWN0IGltcGxlbWVudGluZ1xuICogdGhlIE1hdGNoZXIgUHJvdG9jb2wuIEl0IG11c3QgaGF2ZSBhIGBbUC5tYXRjaGVyXTogUC5NYXRjaGVyPE5hcnJvd0ZuPmBcbiAqIGtleSwgd2hpY2ggZGVmaW5lcyBob3cgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIG1hdGNoZWQgYnkgVFMtUGF0dGVybi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgZmVhdHVyZSBpcyB1bnN0YWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNsYXNzIFNvbWU8VD4gaW1wbGVtZW50cyBQLnVuc3RhYmxlX01hdGNoYWJsZSB7XG4gKiAgW1AubWF0Y2hlcl0oKTogUC51bnN0YWJsZV9NYXRjaGVyPFNvbWU8VD4+XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgdW5zdGFibGVfTWF0Y2hhYmxlPFxuICBuYXJyb3dlZE9yRm4sXG4gIGlucHV0ID0gdW5rbm93bixcbiAgcGF0dGVybiA9IG5ldmVyXG4+ID0gQ3VzdG9tUDxpbnB1dCwgcGF0dGVybiwgbmFycm93ZWRPckZuPjtcblxuLyoqXG4gKiBBIGBNYXRjaGVyYCBpcyBhbiBvYmplY3Qgd2l0aCBgbWF0Y2hgIGZ1bmN0aW9uLCB3aGljaFxuICogZGVmaW5lcyBob3cgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIG1hdGNoZWQgYnkgVFMtUGF0dGVybi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgZmVhdHVyZSBpcyB1bnN0YWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNsYXNzIFNvbWU8VD4gaW1wbGVtZW50cyBQLnVuc3RhYmxlX01hdGNoYWJsZSB7XG4gKiAgW1AubWF0Y2hlcl0oKTogUC51bnN0YWJsZV9NYXRjaGVyPFNvbWU8VD4+XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgdW5zdGFibGVfTWF0Y2hlcjxcbiAgbmFycm93ZWRPckZuLFxuICBpbnB1dCA9IHVua25vd24sXG4gIHBhdHRlcm4gPSBuZXZlclxuPiA9IFJldHVyblR5cGU8Q3VzdG9tUDxpbnB1dCwgcGF0dGVybiwgbmFycm93ZWRPckZuPlttYXRjaGVyXT47XG5cbi8qKlxuICogYFAuaW5mZXI8dHlwZW9mIHNvbWVQYXR0ZXJuPmAgd2lsbCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlXG4gKiBtYXRjaGVkIGJ5IHRoaXMgcGF0dGVybi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuaW5mZXJgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BpbmZlcilcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdXNlclBhdHRlcm4gPSB7IG5hbWU6IFAuc3RyaW5nwqB9XG4gKiB0eXBlIFVzZXIgPSBQLmluZmVyPHR5cGVvZiB1c2VyUGF0dGVybj5cbiAqL1xuZXhwb3J0IHR5cGUgaW5mZXI8cGF0dGVybj4gPSBJbnZlcnRQYXR0ZXJuPE5vSW5mZXI8cGF0dGVybj4sIHVua25vd24+O1xuXG4vKipcbiAqIGBQLm5hcnJvdzxJbnB1dCwgUGF0dGVybj5gIHdpbGwgbmFycm93IHRoZSBpbnB1dCB0eXBlIHRvIG9ubHkga2VlcFxuICogdGhlIHNldCBvZiB2YWx1ZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm92aWRlZCBwYXR0ZXJuIHR5cGUuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm5hcnJvd2Agb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG5hcnJvdylcbiAqXG4gKiBAZXhhbXBsZVxuICogdHlwZSBJbnB1dCA9IFsnYScgfCAnYicgfCAnYycsICdhJyB8ICdiJyB8ICdjJ11cbiAqIGNvbnN0IFBhdHRlcm4gPSBbJ2EnLCBQLnVuaW9uKCdhJywgJ2InKV0gYXMgY29uc3RcbiAqXG4gKiB0eXBlIE5hcnJvd2VkID0gUC5uYXJyb3c8SW5wdXQsIHR5cGVvZiBQYXR0ZXJuPlxuICogLy8gICAgIF4/IFsnYScsICdhJyB8ICdiJ11cbiAqL1xuZXhwb3J0IHR5cGUgbmFycm93PGlucHV0LCBwYXR0ZXJuPiA9IEV4dHJhY3RQcmVjaXNlVmFsdWU8XG4gIGlucHV0LFxuICBJbnZlcnRQYXR0ZXJuPHBhdHRlcm4sIGlucHV0PlxuPjtcblxuZnVuY3Rpb24gY2hhaW5hYmxlPHBhdHRlcm4gZXh0ZW5kcyBNYXRjaGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4oXG4gIHBhdHRlcm46IHBhdHRlcm5cbik6IENoYWluYWJsZTxwYXR0ZXJuPiB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHtcbiAgICBvcHRpb25hbDogKCkgPT4gb3B0aW9uYWwocGF0dGVybiksXG4gICAgYW5kOiAocDI6IGFueSkgPT4gaW50ZXJzZWN0aW9uKHBhdHRlcm4sIHAyKSxcbiAgICBvcjogKHAyOiBhbnkpID0+IHVuaW9uKHBhdHRlcm4sIHAyKSxcbiAgICBzZWxlY3Q6IChrZXk6IGFueSkgPT5cbiAgICAgIGtleSA9PT0gdW5kZWZpbmVkID8gc2VsZWN0KHBhdHRlcm4pIDogc2VsZWN0KGtleSwgcGF0dGVybiksXG4gIH0pIGFzIENoYWluYWJsZTxwYXR0ZXJuPjtcbn1cblxuY29uc3QgdmFyaWFkaWMgPSA8cGF0dGVybiBleHRlbmRzIHt9PihwYXR0ZXJuOiBwYXR0ZXJuKTogVmFyaWFkaWM8cGF0dGVybj4gPT5cbiAgT2JqZWN0LmFzc2lnbihwYXR0ZXJuLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8cGF0dGVybiwgdm9pZCwgdW5kZWZpbmVkPiB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBjb25zdCB2YXJpYWRpY1BhdHRlcm4gPSBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHtcbiAgICAgICAgW3N5bWJvbHMuaXNWYXJpYWRpY106IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHZhbHVlczogSXRlcmF0b3JSZXN1bHQ8cGF0dGVybiwgdm9pZD5bXSA9IFtcbiAgICAgICAgeyB2YWx1ZTogdmFyaWFkaWNQYXR0ZXJuLCBkb25lOiBmYWxzZSB9LFxuICAgICAgICB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSxcbiAgICAgIF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiAoKSA9PiB2YWx1ZXNbaSsrXSA/PyB2YWx1ZXMuYXQoLTEpISxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG5cbmZ1bmN0aW9uIGFycmF5Q2hhaW5hYmxlPHBhdHRlcm4gZXh0ZW5kcyBNYXRjaGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4oXG4gIHBhdHRlcm46IHBhdHRlcm5cbik6IEFycmF5Q2hhaW5hYmxlPHBhdHRlcm4+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odmFyaWFkaWMocGF0dGVybiksIHtcbiAgICBvcHRpb25hbDogKCkgPT4gYXJyYXlDaGFpbmFibGUob3B0aW9uYWwocGF0dGVybikpLFxuICAgIHNlbGVjdDogKGtleTogYW55KSA9PlxuICAgICAgYXJyYXlDaGFpbmFibGUoXG4gICAgICAgIGtleSA9PT0gdW5kZWZpbmVkID8gc2VsZWN0KHBhdHRlcm4pIDogc2VsZWN0KGtleSwgcGF0dGVybilcbiAgICAgICksXG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBgUC5vcHRpb25hbChzdWJwYXR0ZXJuKWAgdGFrZXMgYSBzdWIgcGF0dGVybiBhbmQgcmV0dXJucyBhIHBhdHRlcm4gd2hpY2ggbWF0Y2hlcyBpZiB0aGVcbiAqIGtleSBpcyB1bmRlZmluZWQgb3IgaWYgaXQgaXMgZGVmaW5lZCBhbmQgdGhlIHN1YiBwYXR0ZXJuIG1hdGNoZXMgaXRzIHZhbHVlLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5vcHRpb25hbGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG9wdGlvbmFsLXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKHsgZ3JlZXRpbmc6IFAub3B0aW9uYWwoJ0hlbGxvJykgfSwgKCkgPT4gJ3dpbGwgbWF0Y2ggeyBncmVldGluZz86IFwiSGVsbG9cIsKgfScpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyB1bmtub3duIGV4dGVuZHMgaW5wdXQgPyBVbmtub3duUGF0dGVybiA6IFBhdHRlcm48aW5wdXQ+XG4+KHBhdHRlcm46IHBhdHRlcm4pOiBDaGFpbmFibGU8T3B0aW9uYWxQPGlucHV0LCBwYXR0ZXJuPiwgJ29wdGlvbmFsJz4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl0oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaDogPFVua25vd25JbnB1dD4odmFsdWU6IFVua25vd25JbnB1dCB8IGlucHV0KSA9PiB7XG4gICAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ2V0U2VsZWN0aW9uS2V5cyhwYXR0ZXJuKS5mb3JFYWNoKChrZXkpID0+XG4gICAgICAgICAgICAgIHNlbGVjdG9yKGtleSwgdW5kZWZpbmVkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQ6IHRydWUsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoUGF0dGVybihwYXR0ZXJuLCB2YWx1ZSwgc2VsZWN0b3IpO1xuICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT4gZ2V0U2VsZWN0aW9uS2V5cyhwYXR0ZXJuKSxcbiAgICAgICAgbWF0Y2hlclR5cGU6ICdvcHRpb25hbCcsXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG50eXBlIFVud3JhcEFycmF5PHhzPiA9IHhzIGV4dGVuZHMgcmVhZG9ubHkgKGluZmVyIHgpW10gPyB4IDogbmV2ZXI7XG5cbnR5cGUgVW53cmFwU2V0PHhzPiA9IHhzIGV4dGVuZHMgU2V0PGluZmVyIHg+ID8geCA6IG5ldmVyO1xuXG50eXBlIFVud3JhcE1hcEtleTx4cz4gPSB4cyBleHRlbmRzIE1hcDxpbmZlciBrLCBhbnk+ID8gayA6IG5ldmVyO1xuXG50eXBlIFVud3JhcE1hcFZhbHVlPHhzPiA9IHhzIGV4dGVuZHMgTWFwPGFueSwgaW5mZXIgdj4gPyB2IDogbmV2ZXI7XG5cbnR5cGUgV2l0aERlZmF1bHQ8YSwgYj4gPSBbYV0gZXh0ZW5kcyBbbmV2ZXJdID8gYiA6IGE7XG5cbi8qKlxuICogYFAuYXJyYXkoc3VicGF0dGVybilgIHRha2VzIGEgc3ViIHBhdHRlcm4gYW5kIHJldHVybnMgYSBwYXR0ZXJuLCB3aGljaCBtYXRjaGVzXG4gKiBhcnJheXMgaWYgYWxsIHRoZWlyIGVsZW1lbnRzIG1hdGNoIHRoZSBzdWIgcGF0dGVybi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYXJyYXlgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BhcnJheS1wYXR0ZXJucylcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aCh7IHVzZXJzOiBQLmFycmF5KHsgbmFtZTogUC5zdHJpbmcgfSkgfSwgKCkgPT4gJ3dpbGwgbWF0Y2ggeyBuYW1lOiBzdHJpbmfCoH1bXScpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheTxpbnB1dD4oKTogQXJyYXlDaGFpbmFibGU8QXJyYXlQPGlucHV0LCB1bmtub3duPj47XG5leHBvcnQgZnVuY3Rpb24gYXJyYXk8XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJuIGV4dGVuZHMgUGF0dGVybjxXaXRoRGVmYXVsdDxVbndyYXBBcnJheTxpbnB1dD4sIHVua25vd24+PlxuPihwYXR0ZXJuOiBwYXR0ZXJuKTogQXJyYXlDaGFpbmFibGU8QXJyYXlQPGlucHV0LCBwYXR0ZXJuPj47XG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoXG4gIC4uLmFyZ3M6IFtwYXR0ZXJuPzogYW55XVxuKTogQXJyYXlDaGFpbmFibGU8QXJyYXlQPGFueSwgYW55Pj4ge1xuICByZXR1cm4gYXJyYXlDaGFpbmFibGUoe1xuICAgIFttYXRjaGVyXSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlIH07XG5cbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hdGNoZWQ6IHRydWUgfTtcblxuICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBhcmdzWzBdO1xuICAgICAgICAgIGxldCBzZWxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+ID0ge307XG5cbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBnZXRTZWxlY3Rpb25LZXlzKHBhdHRlcm4pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgc2VsZWN0aW9ucyB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gKHNlbGVjdGlvbnNba2V5XSB8fCBbXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gdmFsdWUuZXZlcnkoKHYpID0+XG4gICAgICAgICAgICBtYXRjaFBhdHRlcm4ocGF0dGVybiwgdiwgc2VsZWN0b3IpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT5cbiAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMCA/IFtdIDogZ2V0U2VsZWN0aW9uS2V5cyhhcmdzWzBdKSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogYFAuc2V0KHN1YnBhdHRlcm4pYCB0YWtlcyBhIHN1YiBwYXR0ZXJuIGFuZCByZXR1cm5zIGEgcGF0dGVybiB0aGF0IG1hdGNoZXNcbiAqIHNldHMgaWYgYWxsIHRoZWlyIGVsZW1lbnRzIG1hdGNoIHRoZSBzdWIgcGF0dGVybi5cbiAqXG4gKiBbUmVhZCBgUC5zZXRgIGRvY3VtZW50YXRpb24gb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHNldC1wYXR0ZXJucylcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aCh7IHVzZXJzOiBQLnNldChQLnN0cmluZykgfSwgKCkgPT4gJ3dpbGwgbWF0Y2ggU2V0PHN0cmluZz4nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0PGlucHV0PigpOiBDaGFpbmFibGU8U2V0UDxpbnB1dCwgdW5rbm93bj4+O1xuZXhwb3J0IGZ1bmN0aW9uIHNldDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcFNldDxpbnB1dD4sIHVua25vd24+PlxuPihwYXR0ZXJuOiBwYXR0ZXJuKTogQ2hhaW5hYmxlPFNldFA8aW5wdXQsIHBhdHRlcm4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzZXQ8XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJuIGV4dGVuZHMgUGF0dGVybjxXaXRoRGVmYXVsdDxVbndyYXBTZXQ8aW5wdXQ+LCB1bmtub3duPj5cbj4oLi4uYXJnczogW3BhdHRlcm4/OiBwYXR0ZXJuXSk6IENoYWluYWJsZTxTZXRQPGlucHV0LCBwYXR0ZXJuPj4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl0oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaDogPFVua25vd25JbnB1dD4odmFsdWU6IFVua25vd25JbnB1dCB8IGlucHV0KSA9PiB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTZXQpKSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuXG4gICAgICAgICAgbGV0IHNlbGVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT4gPSB7fTtcblxuICAgICAgICAgIGlmICh2YWx1ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtYXRjaGVkOiB0cnVlLCBzZWxlY3Rpb25zIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXRjaGVkOiB0cnVlIH07XG5cbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGlvbnNba2V5XSA9IChzZWxlY3Rpb25zW2tleV0gfHwgW10pLmNvbmNhdChbdmFsdWVdKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgcGF0dGVybiA9IGFyZ3NbMF07XG5cbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gc2V0RXZlcnkodmFsdWUsICh2KSA9PlxuICAgICAgICAgICAgbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHYsIHNlbGVjdG9yKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4geyBtYXRjaGVkLCBzZWxlY3Rpb25zIH07XG4gICAgICAgIH0sXG4gICAgICAgIGdldFNlbGVjdGlvbktleXM6ICgpID0+XG4gICAgICAgICAgYXJncy5sZW5ndGggPT09IDAgPyBbXSA6IGdldFNlbGVjdGlvbktleXMoYXJnc1swXSksXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG5jb25zdCBzZXRFdmVyeSA9IDxUPihzZXQ6IFNldDxUPiwgcHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXQpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkgY29udGludWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBgUC5tYXAoa2V5UGF0dGVybiwgdmFsdWVQYXR0ZXJuKWAgdGFrZXMgYSBzdWJwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgdGhlXG4gKiBrZXksIGEgc3VicGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0IHRoZSB2YWx1ZSBhbmQgcmV0dXJucyBhIHBhdHRlcm4gdGhhdFxuICogbWF0Y2hlcyBvbiBtYXBzIHdoZXJlIGFsbCBlbGVtZW50cyBpbnNpZGUgdGhlIG1hcCBtYXRjaCB0aG9zZSB0d29cbiAqIHN1YnBhdHRlcm5zLlxuICpcbiAqIFtSZWFkIGBQLm1hcGAgZG9jdW1lbnRhdGlvbiBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbWFwLXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKHsgdXNlcnM6IFAubWFwKFAubWFwKFAuc3RyaW5nLCBQLm51bWJlcikpIH0sIChtYXApID0+IGBtYXAncyB0eXBlIGlzIE1hcDxzdHJpbmcsIG51bWJlcj5gKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwPGlucHV0PigpOiBDaGFpbmFibGU8TWFwUDxpbnB1dCwgdW5rbm93biwgdW5rbm93bj4+O1xuZXhwb3J0IGZ1bmN0aW9uIG1hcDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBrZXkgZXh0ZW5kcyBQYXR0ZXJuPFdpdGhEZWZhdWx0PFVud3JhcE1hcEtleTxpbnB1dD4sIHVua25vd24+PixcbiAgY29uc3QgcHZhbHVlIGV4dGVuZHMgUGF0dGVybjxXaXRoRGVmYXVsdDxVbndyYXBNYXBWYWx1ZTxpbnB1dD4sIHVua25vd24+PlxuPihwYXR0ZXJuS2V5OiBwa2V5LCBwYXR0ZXJuVmFsdWU6IHB2YWx1ZSk6IENoYWluYWJsZTxNYXBQPGlucHV0LCBwa2V5LCBwdmFsdWU+PjtcbmV4cG9ydCBmdW5jdGlvbiBtYXA8XG4gIGlucHV0LFxuICBjb25zdCBwa2V5IGV4dGVuZHMgUGF0dGVybjxXaXRoRGVmYXVsdDxVbndyYXBNYXBLZXk8aW5wdXQ+LCB1bmtub3duPj4sXG4gIGNvbnN0IHB2YWx1ZSBleHRlbmRzIFBhdHRlcm48V2l0aERlZmF1bHQ8VW53cmFwTWFwVmFsdWU8aW5wdXQ+LCB1bmtub3duPj5cbj4oXG4gIC4uLmFyZ3M6IFtwYXR0ZXJuS2V5PzogcGtleSwgcGF0dGVyblZhbHVlPzogcHZhbHVlXVxuKTogQ2hhaW5hYmxlPE1hcFA8aW5wdXQsIHBrZXksIHB2YWx1ZT4+IHtcbiAgcmV0dXJuIGNoYWluYWJsZSh7XG4gICAgW21hdGNoZXJdKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2g6IDxVbmtub3duSW5wdXQ+KHZhbHVlOiBVbmtub3duSW5wdXQgfCBpbnB1dCkgPT4ge1xuICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTWFwKSkgcmV0dXJuIHsgbWF0Y2hlZDogZmFsc2UgfTtcblxuICAgICAgICAgIGxldCBzZWxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+ID0ge307XG5cbiAgICAgICAgICBpZiAodmFsdWUuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgc2VsZWN0aW9ucyB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gKHNlbGVjdGlvbnNba2V5XSB8fCBbXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hdGNoZWQ6IHRydWUgfTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFxcYFAubWFwXFxgIHdhc25cXCd0IGdpdmVuIGVub3VnaCBhcmd1bWVudHMuIEV4cGVjdGVkIChrZXksIHZhbHVlKSwgcmVjZWl2ZWQgJHthcmdzWzBdPy50b1N0cmluZygpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IFtwYXR0ZXJuS2V5LCBwYXR0ZXJuVmFsdWVdID0gYXJncztcblxuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBtYXBFdmVyeSh2YWx1ZSwgKHYsIGspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleU1hdGNoID0gbWF0Y2hQYXR0ZXJuKHBhdHRlcm5LZXksIGssIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTWF0Y2ggPSBtYXRjaFBhdHRlcm4ocGF0dGVyblZhbHVlLCB2LCBzZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4ga2V5TWF0Y2ggJiYgdmFsdWVNYXRjaDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7IG1hdGNoZWQsIHNlbGVjdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U2VsZWN0aW9uS2V5czogKCkgPT5cbiAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiBbLi4uZ2V0U2VsZWN0aW9uS2V5cyhhcmdzWzBdKSwgLi4uZ2V0U2VsZWN0aW9uS2V5cyhhcmdzWzFdKV0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG5jb25zdCBtYXBFdmVyeSA9IDxLLCBUPihcbiAgbWFwOiBNYXA8SywgVD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBrZXk6IEspID0+IGJvb2xlYW5cbikgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXAuZW50cmllcygpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5KSkgY29udGludWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBgUC5pbnRlcnNlY3Rpb24oLi4ucGF0dGVybnMpYCByZXR1cm5zIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzXG4gKiBvbmx5IGlmICoqZXZlcnkqKiBwYXR0ZXJucyBwcm92aWRlZCBpbiBwYXJhbWV0ZXIgbWF0Y2ggdGhlIGlucHV0LlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5pbnRlcnNlY3Rpb25gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BpbnRlcnNlY3Rpb24tcGF0dGVybnMpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoXG4gKiAgICAge1xuICogICAgICAgdXNlcjogUC5pbnRlcnNlY3Rpb24oXG4gKiAgICAgICAgIHsgZmlyc3RuYW1lOiBQLnN0cmluZyB9LFxuICogICAgICAgICB7IGxhc3RuYW1lOiBQLnN0cmluZyB9LFxuICogICAgICAgICB7IGFnZTogUC53aGVuKGFnZSA9PiBhZ2UgPiAyMSkgfVxuICogICAgICAgKVxuICogICAgIH0sXG4gKiAgICAgKHsgdXNlciB9KSA9PiAnd2lsbCBtYXRjaCB7IGZpcnN0bmFtZTogc3RyaW5nLCBsYXN0bmFtZTogc3RyaW5nLCBhZ2U6IG51bWJlciB9IGlmIGFnZSA+IDIxJ1xuICogICApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb248XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJucyBleHRlbmRzIHJlYWRvbmx5IFtQYXR0ZXJuPGlucHV0PiwgLi4uUGF0dGVybjxpbnB1dD5bXV1cbj4oLi4ucGF0dGVybnM6IHBhdHRlcm5zKTogQ2hhaW5hYmxlPEFuZFA8aW5wdXQsIHBhdHRlcm5zPj4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl06ICgpID0+ICh7XG4gICAgICBtYXRjaDogKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBzZWxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+ID0ge307XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoZWQgPSAocGF0dGVybnMgYXMgcmVhZG9ubHkgVW5rbm93blBhdHRlcm5bXSkuZXZlcnkoKHApID0+XG4gICAgICAgICAgbWF0Y2hQYXR0ZXJuKHAsIHZhbHVlLCBzZWxlY3RvcilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9O1xuICAgICAgfSxcbiAgICAgIGdldFNlbGVjdGlvbktleXM6ICgpID0+XG4gICAgICAgIGZsYXRNYXAocGF0dGVybnMgYXMgcmVhZG9ubHkgVW5rbm93blBhdHRlcm5bXSwgZ2V0U2VsZWN0aW9uS2V5cyksXG4gICAgICBtYXRjaGVyVHlwZTogJ2FuZCcsXG4gICAgfSksXG4gIH0pO1xufVxuXG4vKipcbiAqIGBQLnVuaW9uKC4uLnBhdHRlcm5zKWAgcmV0dXJucyBhIHBhdHRlcm4gd2hpY2ggbWF0Y2hlc1xuICogaWYgKiphdCBsZWFzdCBvbmUqKiBvZiB0aGUgcGF0dGVybnMgcHJvdmlkZWQgaW4gcGFyYW1ldGVyIG1hdGNoIHRoZSBpbnB1dC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAudW5pb25gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3B1bmlvbi1wYXR0ZXJucylcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChcbiAqICAgICB7IHR5cGU6IFAudW5pb24oJ2EnLCAnYicsICdjJykgfSxcbiAqICAgICAoeyB0eXBlIH0pID0+ICd3aWxsIG1hdGNoIHsgdHlwZTogXCJhXCIgfCBcImJcIiB8IFwiY1wiIH0nXG4gKiAgIClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uPFxuICBpbnB1dCxcbiAgY29uc3QgcGF0dGVybnMgZXh0ZW5kcyByZWFkb25seSBbUGF0dGVybjxpbnB1dD4sIC4uLlBhdHRlcm48aW5wdXQ+W11dXG4+KC4uLnBhdHRlcm5zOiBwYXR0ZXJucyk6IENoYWluYWJsZTxPclA8aW5wdXQsIHBhdHRlcm5zPj4ge1xuICByZXR1cm4gY2hhaW5hYmxlKHtcbiAgICBbbWF0Y2hlcl06ICgpID0+ICh7XG4gICAgICBtYXRjaDogPFVua25vd25JbnB1dD4odmFsdWU6IFVua25vd25JbnB1dCB8IGlucHV0KSA9PiB7XG4gICAgICAgIGxldCBzZWxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+ID0ge307XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgc2VsZWN0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIGZsYXRNYXAoXG4gICAgICAgICAgcGF0dGVybnMgYXMgcmVhZG9ubHkgVW5rbm93blBhdHRlcm5bXSxcbiAgICAgICAgICBnZXRTZWxlY3Rpb25LZXlzXG4gICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiBzZWxlY3RvcihrZXksIHVuZGVmaW5lZCkpO1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gKHBhdHRlcm5zIGFzIHJlYWRvbmx5IFVua25vd25QYXR0ZXJuW10pLnNvbWUoKHApID0+XG4gICAgICAgICAgbWF0Y2hQYXR0ZXJuKHAsIHZhbHVlLCBzZWxlY3RvcilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZCwgc2VsZWN0aW9ucyB9O1xuICAgICAgfSxcbiAgICAgIGdldFNlbGVjdGlvbktleXM6ICgpID0+XG4gICAgICAgIGZsYXRNYXAocGF0dGVybnMgYXMgcmVhZG9ubHkgVW5rbm93blBhdHRlcm5bXSwgZ2V0U2VsZWN0aW9uS2V5cyksXG4gICAgICBtYXRjaGVyVHlwZTogJ29yJyxcbiAgICB9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogYFAubm90KHBhdHRlcm4pYCByZXR1cm5zIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzIGlmIHRoZSBzdWIgcGF0dGVyblxuICogZG9lc24ndCBtYXRjaC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubm90YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbm90LXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2g8eyBhOiBzdHJpbmcgfCBudW1iZXIgfT4odmFsdWUpXG4gKiAgIC53aXRoKHsgYTogUC5ub3QoUC5zdHJpbmcpIH0sICh4KSA9PiAnd2lsbCBtYXRjaCB7IGE6IG51bWJlciB9J1xuICogICApXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vdDxcbiAgaW5wdXQsXG4gIGNvbnN0IHBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuPGlucHV0PiB8IFVua25vd25QYXR0ZXJuXG4+KHBhdHRlcm46IHBhdHRlcm4pOiBDaGFpbmFibGU8Tm90UDxpbnB1dCwgcGF0dGVybj4+IHtcbiAgcmV0dXJuIGNoYWluYWJsZSh7XG4gICAgW21hdGNoZXJdOiAoKSA9PiAoe1xuICAgICAgbWF0Y2g6IDxVbmtub3duSW5wdXQ+KHZhbHVlOiBVbmtub3duSW5wdXQgfCBpbnB1dCkgPT4gKHtcbiAgICAgICAgbWF0Y2hlZDogIW1hdGNoUGF0dGVybihwYXR0ZXJuLCB2YWx1ZSwgKCkgPT4ge30pLFxuICAgICAgfSksXG4gICAgICBnZXRTZWxlY3Rpb25LZXlzOiAoKSA9PiBbXSxcbiAgICAgIG1hdGNoZXJUeXBlOiAnbm90JyxcbiAgICB9KSxcbiAgfSk7XG59XG5cbi8qKlxuICogYFAud2hlbigodmFsdWUpID0+IGJvb2xlYW4pYCByZXR1cm5zIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzXG4gKiBpZiB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgaW5wdXQuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLndoZW5gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3B3aGVuLXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2g8eyBhZ2U6IG51bWJlciB9Pih2YWx1ZSlcbiAqICAgLndpdGgoeyBhZ2U6IFAud2hlbihhZ2UgPT4gYWdlID4gMjEpIH0sICh4KSA9PiAnd2lsbCBtYXRjaCBpZiB2YWx1ZS5hZ2UgPiAyMSdcbiAqICAgKVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlbjxpbnB1dCwgcHJlZGljYXRlIGV4dGVuZHMgKHZhbHVlOiBpbnB1dCkgPT4gdW5rbm93bj4oXG4gIHByZWRpY2F0ZTogcHJlZGljYXRlXG4pOiBHdWFyZFA8XG4gIGlucHV0LFxuICBwcmVkaWNhdGUgZXh0ZW5kcyAodmFsdWU6IGFueSkgPT4gdmFsdWUgaXMgaW5mZXIgbmFycm93ZWQgPyBuYXJyb3dlZCA6IG5ldmVyXG4+O1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW48aW5wdXQsIG5hcnJvd2VkIGV4dGVuZHMgaW5wdXQsIGV4Y2x1ZGVkPihcbiAgcHJlZGljYXRlOiAoaW5wdXQ6IGlucHV0KSA9PiBpbnB1dCBpcyBuYXJyb3dlZFxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbmFycm93ZWQsIGV4Y2x1ZGVkPjtcbmV4cG9ydCBmdW5jdGlvbiB3aGVuPGlucHV0LCBwcmVkaWNhdGUgZXh0ZW5kcyAodmFsdWU6IGlucHV0KSA9PiB1bmtub3duPihcbiAgcHJlZGljYXRlOiBwcmVkaWNhdGVcbik6IEd1YXJkUDxcbiAgaW5wdXQsXG4gIHByZWRpY2F0ZSBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBuYXJyb3dlZCA/IG5hcnJvd2VkIDogbmV2ZXJcbj4ge1xuICByZXR1cm4ge1xuICAgIFttYXRjaGVyXTogKCkgPT4gKHtcbiAgICAgIG1hdGNoOiA8VW5rbm93bklucHV0Pih2YWx1ZTogVW5rbm93bklucHV0IHwgaW5wdXQpID0+ICh7XG4gICAgICAgIG1hdGNoZWQ6IEJvb2xlYW4ocHJlZGljYXRlKHZhbHVlIGFzIGlucHV0KSksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgUC5zZWxlY3QoKWAgaXMgYSBwYXR0ZXJuIHdoaWNoIHdpbGwgYWx3YXlzIG1hdGNoLFxuICogYW5kIHdpbGwgaW5qZWN0IHRoZSBzZWxlY3RlZCBwaWVjZSBvZiBpbnB1dCBpbiB0aGUgaGFuZGxlciBmdW5jdGlvbi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc2VsZWN0YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwc2VsZWN0LXBhdHRlcm5zKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2g8eyBhZ2U6IG51bWJlciB9Pih2YWx1ZSlcbiAqICAgLndpdGgoeyBhZ2U6IFAuc2VsZWN0KCkgfSwgKGFnZSkgPT4gJ2FnZTogbnVtYmVyJ1xuICogICApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoKTogQ2hhaW5hYmxlPEFub255bW91c1NlbGVjdFAsICdzZWxlY3QnIHwgJ29yJyB8ICdhbmQnPjtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Q8XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJuT3JLZXkgZXh0ZW5kc1xuICAgIHwgc3RyaW5nXG4gICAgfCAodW5rbm93biBleHRlbmRzIGlucHV0ID8gVW5rbm93blBhdHRlcm4gOiBQYXR0ZXJuPGlucHV0Pilcbj4oXG4gIHBhdHRlcm5PcktleTogcGF0dGVybk9yS2V5XG4pOiBwYXR0ZXJuT3JLZXkgZXh0ZW5kcyBzdHJpbmdcbiAgPyBDaGFpbmFibGU8U2VsZWN0UDxwYXR0ZXJuT3JLZXksICdzZWxlY3QnIHwgJ29yJyB8ICdhbmQnPj5cbiAgOiBDaGFpbmFibGU8XG4gICAgICBTZWxlY3RQPHN5bWJvbHMuYW5vbnltb3VzU2VsZWN0S2V5LCBpbnB1dCwgcGF0dGVybk9yS2V5PixcbiAgICAgICdzZWxlY3QnIHwgJ29yJyB8ICdhbmQnXG4gICAgPjtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Q8XG4gIGlucHV0LFxuICBjb25zdCBwYXR0ZXJuIGV4dGVuZHMgdW5rbm93biBleHRlbmRzIGlucHV0ID8gVW5rbm93blBhdHRlcm4gOiBQYXR0ZXJuPGlucHV0PixcbiAgY29uc3QgayBleHRlbmRzIHN0cmluZ1xuPihcbiAga2V5OiBrLFxuICBwYXR0ZXJuOiBwYXR0ZXJuXG4pOiBDaGFpbmFibGU8U2VsZWN0UDxrLCBpbnB1dCwgcGF0dGVybj4sICdzZWxlY3QnIHwgJ29yJyB8ICdhbmQnPjtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3QoXG4gIC4uLmFyZ3M6IFtrZXlPclBhdHRlcm4/OiB1bmtub3duIHwgc3RyaW5nLCBwYXR0ZXJuPzogdW5rbm93bl1cbik6IENoYWluYWJsZTxTZWxlY3RQPHN0cmluZz4sICdzZWxlY3QnIHwgJ29yJyB8ICdhbmQnPiB7XG4gIGNvbnN0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgPyBhcmdzWzBdIDogdW5kZWZpbmVkO1xuICBjb25zdCBwYXR0ZXJuOiB1bmtub3duID1cbiAgICBhcmdzLmxlbmd0aCA9PT0gMlxuICAgICAgPyBhcmdzWzFdXG4gICAgICA6IHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogYXJnc1swXTtcbiAgcmV0dXJuIGNoYWluYWJsZSh7XG4gICAgW21hdGNoZXJdKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2g6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCBzZWxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgIFtrZXkgPz8gc3ltYm9scy5hbm9ueW1vdXNTZWxlY3RLZXldOiB2YWx1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBzZWxlY3Rpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXRjaGVkOlxuICAgICAgICAgICAgICBwYXR0ZXJuID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IG1hdGNoUGF0dGVybihwYXR0ZXJuLCB2YWx1ZSwgc2VsZWN0b3IpLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogc2VsZWN0aW9ucyxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBnZXRTZWxlY3Rpb25LZXlzOiAoKSA9PlxuICAgICAgICAgIFtrZXkgPz8gc3ltYm9scy5hbm9ueW1vdXNTZWxlY3RLZXldLmNvbmNhdChcbiAgICAgICAgICAgIHBhdHRlcm4gPT09IHVuZGVmaW5lZCA/IFtdIDogZ2V0U2VsZWN0aW9uS2V5cyhwYXR0ZXJuKVxuICAgICAgICAgICksXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1Vua25vd24oeDogdW5rbm93bik6IHggaXMgdW5rbm93biB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcjxUPih4OiBUIHwgbnVtYmVyKTogeCBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZzxUPih4OiBUIHwgc3RyaW5nKTogeCBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW48VD4oeDogVCB8IGJvb2xlYW4pOiB4IGlzIGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNCaWdJbnQ8VD4oeDogVCB8IGJpZ2ludCk6IHggaXMgYmlnaW50IHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnYmlnaW50Jztcbn1cblxuZnVuY3Rpb24gaXNTeW1ib2w8VD4oeDogVCB8IHN5bWJvbCk6IHggaXMgc3ltYm9sIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3ltYm9sJztcbn1cblxuZnVuY3Rpb24gaXNOdWxsaXNoPFQ+KHg6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogeCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc05vbk51bGxhYmxlKHg6IHVua25vd24pOiB4IGlzIHt9IHtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgeCAhPT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIEFueUNvbnN0cnVjdG9yID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG5mdW5jdGlvbiBpc0luc3RhbmNlT2Y8VCBleHRlbmRzIEFueUNvbnN0cnVjdG9yPihjbGFzc0NvbnN0cnVjdG9yOiBUKSB7XG4gIHJldHVybiAodmFsOiB1bmtub3duKTogdmFsIGlzIEluc3RhbmNlVHlwZTxUPiA9PlxuICAgIHZhbCBpbnN0YW5jZW9mIGNsYXNzQ29uc3RydWN0b3I7XG59XG5cbi8qKlxuICogYFAuYW55YCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4sIG1hdGNoaW5nICoqYW55IHZhbHVlKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmFueWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcF8td2lsZGNhcmQpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5hbnksICgpID0+ICd3aWxsIGFsd2F5cyBtYXRjaCcpXG4gKi9cbmV4cG9ydCBjb25zdCBhbnk6IEFueVBhdHRlcm4gPSBjaGFpbmFibGUod2hlbihpc1Vua25vd24pKTtcblxuLyoqXG4gKiBgUC5fYCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4sIG1hdGNoaW5nICoqYW55IHZhbHVlKiouXG4gKiBJdCdzIGFuIGFsaWFzIHRvIGBQLmFueWAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLl9gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BfLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuXywgKCkgPT4gJ3dpbGwgYWx3YXlzIG1hdGNoJylcbiAqL1xuZXhwb3J0IGNvbnN0IF8gPSBhbnk7XG5cbi8qKlxuICogYFAuc3RyaW5nLnN0YXJ0c1dpdGgoc3RhcnQpYCBpcyBhIHBhdHRlcm4sIG1hdGNoaW5nICoqc3RyaW5ncyoqIHN0YXJ0aW5nIHdpdGggYHN0YXJ0YC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3RyaW5nLnN0YXJ0c1dpdGhgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzdHJpbmdzdGFydHNXaXRoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuc3RyaW5nLnN0YXJ0c1dpdGgoJ0EnKSwgKCkgPT4gJ3ZhbHVlIHN0YXJ0cyB3aXRoIGFuIEEnKVxuICovXG5cbmNvbnN0IHN0YXJ0c1dpdGggPSA8aW5wdXQsIGNvbnN0IHN0YXJ0IGV4dGVuZHMgc3RyaW5nPihcbiAgc3RhcnQ6IHN0YXJ0XG4pOiBHdWFyZFA8aW5wdXQsIGAke3N0YXJ0fSR7c3RyaW5nfWA+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUuc3RhcnRzV2l0aChzdGFydCkpO1xuXG4vKipcbiAqIGBQLnN0cmluZy5lbmRzV2l0aChlbmQpYCBpcyBhIHBhdHRlcm4sIG1hdGNoaW5nICoqc3RyaW5ncyoqIGVuZGluZyB3aXRoIGBlbmRgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcuZW5kc1dpdGhgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzdHJpbmdlbmRzV2l0aClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5lbmRzV2l0aCgnIScpLCAoKSA9PiAndmFsdWUgZW5kcyB3aXRoIGFuICEnKVxuICovXG5jb25zdCBlbmRzV2l0aCA9IDxpbnB1dCwgY29uc3QgZW5kIGV4dGVuZHMgc3RyaW5nPihcbiAgZW5kOiBlbmRcbik6IEd1YXJkUDxpbnB1dCwgYCR7c3RyaW5nfSR7ZW5kfWA+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUuZW5kc1dpdGgoZW5kKSk7XG5cbi8qKlxuICogYFAuc3RyaW5nLm1pbkxlbmd0aChtaW4pYCBpcyBhIHBhdHRlcm4sIG1hdGNoaW5nICoqc3RyaW5ncyoqIHdpdGggYXQgbGVhc3QgYG1pbmAgY2hhcmFjdGVycy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3RyaW5nLm1pbkxlbmd0aGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ21pbkxlbmd0aClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5taW5MZW5ndGgoMTApLCAoKSA9PiAnc3RyaW5nIHdpdGggbW9yZSBsZW5ndGggPj0gMTAnKVxuICovXG5jb25zdCBtaW5MZW5ndGggPSA8Y29uc3QgbWluIGV4dGVuZHMgbnVtYmVyPihtaW46IG1pbikgPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPj0gbWluKTtcblxuLyoqXG4gKiBgUC5zdHJpbmcubGVuZ3RoKGxlbilgIGlzIGEgcGF0dGVybiwgbWF0Y2hpbmcgKipzdHJpbmdzKiogd2l0aCBleGFjdGx5IGBsZW5gIGNoYXJhY3RlcnMuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN0cmluZy5sZW5ndGhgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzdHJpbmdsZW5ndGgpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5zdHJpbmcubGVuZ3RoKDEwKSwgKCkgPT4gJ3N0cmluZ3Mgd2l0aCBsZW5ndGggPT09IDEwJylcbiAqL1xuY29uc3QgbGVuZ3RoID0gPGNvbnN0IGxlbiBleHRlbmRzIG51bWJlcj4obGVuOiBsZW4pID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSBsZW4pO1xuXG4vKipcbiAqIGBQLnN0cmluZy5tYXhMZW5ndGgobWF4KWAgaXMgYSBwYXR0ZXJuLCBtYXRjaGluZyAqKnN0cmluZ3MqKiB3aXRoIGF0IG1vc3QgYG1heGAgY2hhcmFjdGVycy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc3RyaW5nLm1heExlbmd0aGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZ21heExlbmd0aClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5tYXhMZW5ndGgoMTApLCAoKSA9PiAnc3RyaW5nIHdpdGggbW9yZSBsZW5ndGggPD0gMTAnKVxuICovXG5jb25zdCBtYXhMZW5ndGggPSA8Y29uc3QgbWF4IGV4dGVuZHMgbnVtYmVyPihtYXg6IG1heCkgPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4KTtcblxuLyoqXG4gKiBgUC5zdHJpbmcuaW5jbHVkZXMoc3Vic3RyKWAgaXMgYSBwYXR0ZXJuLCBtYXRjaGluZyAqKnN0cmluZ3MqKiBjb250YWluaW5nIGBzdWJzdHJgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcuaW5jbHVkZXNgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzdHJpbmdpbmNsdWRlcylcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5pbmNsdWRlcygnaHR0cCcpLCAoKSA9PiAndmFsdWUgY29udGFpbnMgaHR0cCcpXG4gKi9cbmNvbnN0IGluY2x1ZGVzID0gPGlucHV0LCBjb25zdCBzdWJzdHIgZXh0ZW5kcyBzdHJpbmc+KFxuICBzdWJzdHI6IHN1YnN0clxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgc3RyaW5nLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZS5pbmNsdWRlcyhzdWJzdHIpKTtcblxuLyoqXG4gKiBgUC5zdHJpbmcucmVnZXgoZXhwcilgIGlzIGEgcGF0dGVybiwgbWF0Y2hpbmcgKipzdHJpbmdzKiogdGhhdCBgZXhwcmAgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5zdHJpbmcucmVnZXhgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzdHJpbmdyZWdleClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZy5yZWdleCgvXmh0dHBzPzpcXC9cXC8vKSwgKCkgPT4gJ3VybCcpXG4gKi9cbmNvbnN0IHJlZ2V4ID0gPGlucHV0LCBjb25zdCBleHByIGV4dGVuZHMgc3RyaW5nIHwgUmVnRXhwPihcbiAgZXhwcjogZXhwclxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgc3RyaW5nLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzU3RyaW5nKHZhbHVlKSAmJiBCb29sZWFuKHZhbHVlLm1hdGNoKGV4cHIpKSk7XG5cbmNvbnN0IHN0cmluZ0NoYWluYWJsZSA9IDxwYXR0ZXJuIGV4dGVuZHMgTWF0Y2hlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+KFxuICBwYXR0ZXJuOiBwYXR0ZXJuXG4pOiBTdHJpbmdDaGFpbmFibGU8cGF0dGVybj4gPT5cbiAgT2JqZWN0LmFzc2lnbihjaGFpbmFibGUocGF0dGVybiksIHtcbiAgICBzdGFydHNXaXRoOiAoc3RyOiBzdHJpbmcpID0+XG4gICAgICBzdHJpbmdDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIHN0YXJ0c1dpdGgoc3RyKSkpLFxuICAgIGVuZHNXaXRoOiAoc3RyOiBzdHJpbmcpID0+XG4gICAgICBzdHJpbmdDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGVuZHNXaXRoKHN0cikpKSxcbiAgICBtaW5MZW5ndGg6IChtaW46IG51bWJlcikgPT5cbiAgICAgIHN0cmluZ0NoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbWluTGVuZ3RoKG1pbikpKSxcbiAgICBsZW5ndGg6IChsZW46IG51bWJlcikgPT5cbiAgICAgIHN0cmluZ0NoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbGVuZ3RoKGxlbikpKSxcbiAgICBtYXhMZW5ndGg6IChtYXg6IG51bWJlcikgPT5cbiAgICAgIHN0cmluZ0NoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbWF4TGVuZ3RoKG1heCkpKSxcbiAgICBpbmNsdWRlczogKHN0cjogc3RyaW5nKSA9PlxuICAgICAgc3RyaW5nQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBpbmNsdWRlcyhzdHIpKSksXG4gICAgcmVnZXg6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCByZWdleChzdHIpKSksXG4gIH0pIGFzIGFueTtcblxuLyoqXG4gKiBgUC5zdHJpbmdgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgYW55ICoqc3RyaW5nKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN0cmluZ2Agb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcHN0cmluZy13aWxkY2FyZClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLnN0cmluZywgKCkgPT4gJ3dpbGwgbWF0Y2ggb24gc3RyaW5ncycpXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmc6IFN0cmluZ1BhdHRlcm4gPSBzdHJpbmdDaGFpbmFibGUod2hlbihpc1N0cmluZykpO1xuXG4vKipcbiAqIGBQLm51bWJlci5iZXR3ZWVuKG1pbiwgbWF4KWAgbWF0Y2hlcyAqKm51bWJlcnMqKiBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCxcbiAqIGVxdWFsIHRvIG1pbiBvciBlcXVhbCB0byBtYXguXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5iZXR3ZWVuYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyYmV0d2VlbilcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5iZXR3ZWVuKDAsIDEwKSwgKCkgPT4gJzAgPD0gbnVtYmVycyA8PSAxMCcpXG4gKi9cbmNvbnN0IGJldHdlZW4gPSA8aW5wdXQsIGNvbnN0IG1pbiBleHRlbmRzIG51bWJlciwgY29uc3QgbWF4IGV4dGVuZHMgbnVtYmVyPihcbiAgbWluOiBtaW4sXG4gIG1heDogbWF4XG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIG1pbiA8PSB2YWx1ZSAmJiBtYXggPj0gdmFsdWUpO1xuXG4vKipcbiAqIGBQLm51bWJlci5sdChtYXgpYCBtYXRjaGVzICoqbnVtYmVycyoqIHNtYWxsZXIgdGhhbiBgbWF4YC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLmx0YCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVybHQpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIubHQoMTApLCAoKSA9PiAnbnVtYmVycyA8IDEwJylcbiAqL1xuY29uc3QgbHQgPSA8aW5wdXQsIGNvbnN0IG1heCBleHRlbmRzIG51bWJlcj4oXG4gIG1heDogbWF4XG4pOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlIDwgbWF4KTtcblxuLyoqXG4gKiBgUC5udW1iZXIuZ3QobWluKWAgbWF0Y2hlcyAqKm51bWJlcnMqKiBncmVhdGVyIHRoYW4gYG1pbmAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5ndGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmd0KVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLmd0KDEwKSwgKCkgPT4gJ251bWJlcnMgPiAxMCcpXG4gKi9cbmNvbnN0IGd0ID0gPGlucHV0LCBjb25zdCBtaW4gZXh0ZW5kcyBudW1iZXI+KFxuICBtaW46IG1pblxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+IG1pbik7XG5cbi8qKlxuICogYFAubnVtYmVyLmx0ZShtYXgpYCBtYXRjaGVzICoqbnVtYmVycyoqIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBgbWF4YC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLmx0ZWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmx0ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5sdGUoMTApLCAoKSA9PiAnbnVtYmVycyA8PSAxMCcpXG4gKi9cbmNvbnN0IGx0ZSA9IDxpbnB1dCwgY29uc3QgbWF4IGV4dGVuZHMgbnVtYmVyPihcbiAgbWF4OiBtYXhcbik6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgPD0gbWF4KTtcblxuLyoqXG4gKiBgUC5udW1iZXIuZ3RlKG1pbilgIG1hdGNoZXMgKipudW1iZXJzKiogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBtaW5gLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIuZ3RlYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVyZ3RlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLmd0ZSgxMCksICgpID0+ICdudW1iZXJzID49IDEwJylcbiAqL1xuY29uc3QgZ3RlID0gPGlucHV0LCBjb25zdCBtaW4gZXh0ZW5kcyBudW1iZXI+KFxuICBtaW46IG1pblxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+PSBtaW4pO1xuXG4vKipcbiAqIGBQLm51bWJlci5pbnQoKWAgbWF0Y2hlcyAqKmludGVnZXIqKiBudW1iZXJzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIuaW50KClgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJpbnQpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIuaW50KCksICgpID0+ICdhbiBpbnRlZ2VyJylcbiAqL1xuY29uc3QgaW50ID0gPGlucHV0PigpOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBudW1iZXIsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNOdW1iZXIodmFsdWUpICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpKTtcblxuLyoqXG4gKiBgUC5udW1iZXIuZmluaXRlYCBtYXRjaGVzICoqZmluaXRlIG51bWJlcnMqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubnVtYmVyLmZpbml0ZWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmZpbml0ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlci5maW5pdGUsICgpID0+ICdub3QgSW5maW5pdHknKVxuICovXG5jb25zdCBmaW5pdGUgPSA8aW5wdXQ+KCk6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG5cbi8qKlxuICogYFAubnVtYmVyLnBvc2l0aXZlKClgIG1hdGNoZXMgKipwb3NpdGl2ZSoqIG51bWJlcnMuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlci5wb3NpdGl2ZSgpYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVycG9zaXRpdmUpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5udW1iZXIucG9zaXRpdmUoKSwgKCkgPT4gJ251bWJlciA+IDAnKVxuICovXG5jb25zdCBwb3NpdGl2ZSA9IDxpbnB1dD4oKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgbnVtYmVyLCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+IDApO1xuXG4vKipcbiAqIGBQLm51bWJlci5uZWdhdGl2ZSgpYCBtYXRjaGVzICoqbmVnYXRpdmUqKiBudW1iZXJzLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udW1iZXIubmVnYXRpdmUoKWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcm5lZ2F0aXZlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAubnVtYmVyLm5lZ2F0aXZlKCksICgpID0+ICdudW1iZXIgPCAwJylcbiAqL1xuY29uc3QgbmVnYXRpdmUgPSA8aW5wdXQ+KCk6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIG51bWJlciwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgPCAwKTtcblxuY29uc3QgbnVtYmVyQ2hhaW5hYmxlID0gPHBhdHRlcm4gZXh0ZW5kcyBNYXRjaGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4oXG4gIHBhdHRlcm46IHBhdHRlcm5cbik6IE51bWJlckNoYWluYWJsZTxwYXR0ZXJuPiA9PlxuICBPYmplY3QuYXNzaWduKGNoYWluYWJsZShwYXR0ZXJuKSwge1xuICAgIGJldHdlZW46IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+XG4gICAgICBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGJldHdlZW4obWluLCBtYXgpKSksXG4gICAgbHQ6IChtYXg6IG51bWJlcikgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBsdChtYXgpKSksXG4gICAgZ3Q6IChtaW46IG51bWJlcikgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBndChtaW4pKSksXG4gICAgbHRlOiAobWF4OiBudW1iZXIpID0+IG51bWJlckNoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbHRlKG1heCkpKSxcbiAgICBndGU6IChtaW46IG51bWJlcikgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBndGUobWluKSkpLFxuICAgIGludDogKCkgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBpbnQoKSkpLFxuICAgIGZpbml0ZTogKCkgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBmaW5pdGUoKSkpLFxuICAgIHBvc2l0aXZlOiAoKSA9PiBudW1iZXJDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIHBvc2l0aXZlKCkpKSxcbiAgICBuZWdhdGl2ZTogKCkgPT4gbnVtYmVyQ2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBuZWdhdGl2ZSgpKSksXG4gIH0pIGFzIGFueTtcblxuLyoqXG4gKiBgUC5udW1iZXJgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgYW55ICoqbnVtYmVyKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLm51bWJlcmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlci13aWxkY2FyZClcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLm51bWJlciwgKCkgPT4gJ3dpbGwgbWF0Y2ggb24gbnVtYmVycycpXG4gKi9cbmV4cG9ydCBjb25zdCBudW1iZXI6IE51bWJlclBhdHRlcm4gPSBudW1iZXJDaGFpbmFibGUod2hlbihpc051bWJlcikpO1xuXG4vKipcbiAqIGBQLmJpZ2ludC5iZXR3ZWVuKG1pbiwgbWF4KWAgbWF0Y2hlcyAqKmJpZ2ludCoqIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLFxuICogZXF1YWwgdG8gbWluIG9yIGVxdWFsIHRvIG1heC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50LmJldHdlZW5gIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BudW1iZXJiZXR3ZWVuKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50LmJldHdlZW4oMCwgMTApLCAoKSA9PiAnMCA8PSBiaWdpbnRzIDw9IDEwJylcbiAqL1xuY29uc3QgYmV0d2VlbkJpZ0ludCA9IDxcbiAgaW5wdXQsXG4gIGNvbnN0IG1pbiBleHRlbmRzIGJpZ2ludCxcbiAgY29uc3QgbWF4IGV4dGVuZHMgYmlnaW50XG4+KFxuICBtaW46IG1pbixcbiAgbWF4OiBtYXhcbik6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIGJpZ2ludCwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc0JpZ0ludCh2YWx1ZSkgJiYgbWluIDw9IHZhbHVlICYmIG1heCA+PSB2YWx1ZSk7XG5cbi8qKlxuICogYFAuYmlnaW50Lmx0KG1heClgIG1hdGNoZXMgKipiaWdpbnQqKiBzbWFsbGVyIHRoYW4gYG1heGAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJpZ2ludC5sdGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmx0KVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50Lmx0KDEwKSwgKCkgPT4gJ2JpZ2ludHMgPCAxMCcpXG4gKi9cbmNvbnN0IGx0QmlnSW50ID0gPGlucHV0LCBjb25zdCBtYXggZXh0ZW5kcyBiaWdpbnQ+KFxuICBtYXg6IG1heFxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiB2YWx1ZSA8IG1heCk7XG5cbi8qKlxuICogYFAuYmlnaW50Lmd0KG1pbilgIG1hdGNoZXMgKipiaWdpbnQqKiBncmVhdGVyIHRoYW4gYG1pbmAuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJpZ2ludC5ndGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcG51bWJlcmd0KVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50Lmd0KDEwKSwgKCkgPT4gJ2JpZ2ludHMgPiAxMCcpXG4gKi9cbmNvbnN0IGd0QmlnSW50ID0gPGlucHV0LCBjb25zdCBtaW4gZXh0ZW5kcyBiaWdpbnQ+KFxuICBtaW46IG1pblxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiB2YWx1ZSA+IG1pbik7XG5cbi8qKlxuICogYFAuYmlnaW50Lmx0ZShtYXgpYCBtYXRjaGVzICoqYmlnaW50Kiogc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGBtYXhgLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5iaWdpbnQubHRlYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwbnVtYmVybHRlKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgbWF0Y2godmFsdWUpXG4gKiAgIC53aXRoKFAuYmlnaW50Lmx0ZSgxMCksICgpID0+ICdiaWdpbnRzIDw9IDEwJylcbiAqL1xuY29uc3QgbHRlQmlnSW50ID0gPGlucHV0LCBjb25zdCBtYXggZXh0ZW5kcyBiaWdpbnQ+KFxuICBtYXg6IG1heFxuKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiB2YWx1ZSA8PSBtYXgpO1xuXG4vKipcbiAqIGBQLmJpZ2ludC5ndGUobWluKWAgbWF0Y2hlcyAqKmJpZ2ludCoqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgbWluYC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50Lmd0ZWAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGJpZ2ludGd0ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLmJpZ2ludC5ndGUoMTApLCAoKSA9PiAnYmlnaW50cyA+PSAxMCcpXG4gKi9cbmNvbnN0IGd0ZUJpZ0ludCA9IDxpbnB1dCwgY29uc3QgbWluIGV4dGVuZHMgYmlnaW50PihcbiAgbWluOiBtaW5cbik6IEd1YXJkRXhjbHVkZVA8aW5wdXQsIGJpZ2ludCwgbmV2ZXI+ID0+XG4gIHdoZW4oKHZhbHVlKSA9PiBpc0JpZ0ludCh2YWx1ZSkgJiYgdmFsdWUgPj0gbWluKTtcblxuLyoqXG4gKiBgUC5iaWdpbnQucG9zaXRpdmUoKWAgbWF0Y2hlcyAqKnBvc2l0aXZlKiogYmlnaW50cy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuYmlnaW50LnBvc2l0aXZlKClgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BiaWdpbnRwb3NpdGl2ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogIG1hdGNoKHZhbHVlKVxuICogICAud2l0aChQLmJpZ2ludC5wb3NpdGl2ZSgpLCAoKSA9PiAnYmlnaW50ID4gMCcpXG4gKi9cbmNvbnN0IHBvc2l0aXZlQmlnSW50ID0gPGlucHV0PigpOiBHdWFyZEV4Y2x1ZGVQPGlucHV0LCBiaWdpbnQsIG5ldmVyPiA9PlxuICB3aGVuKCh2YWx1ZSkgPT4gaXNCaWdJbnQodmFsdWUpICYmIHZhbHVlID4gMCk7XG5cbi8qKlxuICogYFAuYmlnaW50Lm5lZ2F0aXZlKClgIG1hdGNoZXMgKipuZWdhdGl2ZSoqIGJpZ2ludHMuXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLmJpZ2ludC5uZWdhdGl2ZSgpYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNwYmlnaW50bmVnYXRpdmUpXG4gKlxuICogQGV4YW1wbGVcbiAqICBtYXRjaCh2YWx1ZSlcbiAqICAgLndpdGgoUC5iaWdpbnQubmVnYXRpdmUoKSwgKCkgPT4gJ2JpZ2ludCA8IDAnKVxuICovXG5jb25zdCBuZWdhdGl2ZUJpZ0ludCA9IDxpbnB1dD4oKTogR3VhcmRFeGNsdWRlUDxpbnB1dCwgYmlnaW50LCBuZXZlcj4gPT5cbiAgd2hlbigodmFsdWUpID0+IGlzQmlnSW50KHZhbHVlKSAmJiB2YWx1ZSA8IDApO1xuXG5jb25zdCBiaWdpbnRDaGFpbmFibGUgPSA8cGF0dGVybiBleHRlbmRzIE1hdGNoZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PihcbiAgcGF0dGVybjogcGF0dGVyblxuKTogQmlnSW50Q2hhaW5hYmxlPHBhdHRlcm4+ID0+XG4gIE9iamVjdC5hc3NpZ24oY2hhaW5hYmxlKHBhdHRlcm4pLCB7XG4gICAgYmV0d2VlbjogKG1pbjogYmlnaW50LCBtYXg6IGJpZ2ludCkgPT5cbiAgICAgIGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgYmV0d2VlbkJpZ0ludChtaW4sIG1heCkpKSxcbiAgICBsdDogKG1heDogYmlnaW50KSA9PiBiaWdpbnRDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGx0QmlnSW50KG1heCkpKSxcbiAgICBndDogKG1pbjogYmlnaW50KSA9PiBiaWdpbnRDaGFpbmFibGUoaW50ZXJzZWN0aW9uKHBhdHRlcm4sIGd0QmlnSW50KG1pbikpKSxcbiAgICBsdGU6IChtYXg6IGJpZ2ludCkgPT5cbiAgICAgIGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbHRlQmlnSW50KG1heCkpKSxcbiAgICBndGU6IChtaW46IGJpZ2ludCkgPT5cbiAgICAgIGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgZ3RlQmlnSW50KG1pbikpKSxcbiAgICBwb3NpdGl2ZTogKCkgPT4gYmlnaW50Q2hhaW5hYmxlKGludGVyc2VjdGlvbihwYXR0ZXJuLCBwb3NpdGl2ZUJpZ0ludCgpKSksXG4gICAgbmVnYXRpdmU6ICgpID0+IGJpZ2ludENoYWluYWJsZShpbnRlcnNlY3Rpb24ocGF0dGVybiwgbmVnYXRpdmVCaWdJbnQoKSkpLFxuICB9KSBhcyBhbnk7XG5cbi8qKlxuICogYFAuYmlnaW50YCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4sIG1hdGNoaW5nIGFueSAqKmJpZ2ludCoqLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5iaWdpbnRgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI251bWJlci13aWxkY2FyZClcbiAqXG4gKiBAZXhhbXBsZVxuICogICAud2l0aChQLmJpZ2ludCwgKCkgPT4gJ3dpbGwgbWF0Y2ggb24gYmlnaW50cycpXG4gKi9cbmV4cG9ydCBjb25zdCBiaWdpbnQ6IEJpZ0ludFBhdHRlcm4gPSBiaWdpbnRDaGFpbmFibGUod2hlbihpc0JpZ0ludCkpO1xuXG4vKipcbiAqIGBQLmJvb2xlYW5gIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgYW55ICoqYm9vbGVhbioqLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5ib29sZWFuYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNib29sZWFuLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC53aXRoKFAuYm9vbGVhbiwgKCkgPT4gJ3dpbGwgbWF0Y2ggb24gYm9vbGVhbnMnKVxuICovXG5leHBvcnQgY29uc3QgYm9vbGVhbjogQm9vbGVhblBhdHRlcm4gPSBjaGFpbmFibGUod2hlbihpc0Jvb2xlYW4pKTtcblxuLyoqXG4gKiBgUC5zeW1ib2xgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgYW55ICoqc3ltYm9sKiouXG4gKlxuICogW1JlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQLnN5bWJvbGAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jc3ltYm9sLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC53aXRoKFAuc3ltYm9sLCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBzeW1ib2xzJylcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bWJvbDogU3ltYm9sUGF0dGVybiA9IGNoYWluYWJsZSh3aGVuKGlzU3ltYm9sKSk7XG5cbi8qKlxuICogYFAubnVsbGlzaGAgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLCBtYXRjaGluZyAqKm51bGwqKiBvciAqKnVuZGVmaW5lZCoqLlxuICpcbiAqIFtSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUC5udWxsaXNoYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNudWxsaXNoLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC53aXRoKFAubnVsbGlzaCwgKHgpID0+IGAke3h9IGlzIG51bGwgb3IgdW5kZWZpbmVkYClcbiAqL1xuZXhwb3J0IGNvbnN0IG51bGxpc2g6IE51bGxpc2hQYXR0ZXJuID0gY2hhaW5hYmxlKHdoZW4oaXNOdWxsaXNoKSk7XG5cbi8qKlxuICogYFAubm9uTnVsbGFibGVgIGlzIGEgd2lsZGNhcmQgcGF0dGVybiwgbWF0Y2hpbmcgZXZlcnl0aGluZyBleGNlcHQgKipudWxsKiogb3IgKip1bmRlZmluZWQqKi5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAubm9uTnVsbGFibGVgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI25vbk51bGxhYmxlLXdpbGRjYXJkKVxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC53aXRoKFAubm9uTnVsbGFibGUsICh4KSA9PiBgJHt4fSBpc24ndCBudWxsIG5vciB1bmRlZmluZWRgKVxuICovXG5leHBvcnQgY29uc3Qgbm9uTnVsbGFibGU6IE5vbk51bGxhYmxlUGF0dGVybiA9IGNoYWluYWJsZSh3aGVuKGlzTm9uTnVsbGFibGUpKTtcblxuLyoqXG4gKiBgUC5pbnN0YW5jZU9mKFNvbWVDbGFzcylgIGlzIGEgcGF0dGVybiBtYXRjaGluZyBpbnN0YW5jZXMgb2YgYSBnaXZlbiBjbGFzcy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuaW5zdGFuY2VPZmAgb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vZ3ZlcmduYXVkL3RzLXBhdHRlcm4jcGluc3RhbmNlb2YtcGF0dGVybnMpXG4gKlxuICogIEBleGFtcGxlXG4gKiAgIC53aXRoKFAuaW5zdGFuY2VPZihTb21lQ2xhc3MpLCAoKSA9PiAnd2lsbCBtYXRjaCBvbiBTb21lQ2xhc3MgaW5zdGFuY2VzJylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlT2Y8VCBleHRlbmRzIEFueUNvbnN0cnVjdG9yPihcbiAgY2xhc3NDb25zdHJ1Y3RvcjogVFxuKTogQ2hhaW5hYmxlPEd1YXJkUDx1bmtub3duLCBJbnN0YW5jZVR5cGU8VD4+PiB7XG4gIHJldHVybiBjaGFpbmFibGUod2hlbihpc0luc3RhbmNlT2YoY2xhc3NDb25zdHJ1Y3RvcikpKTtcbn1cblxuLyoqXG4gKiBgUC5zaGFwZShzb21lUGF0dGVybilgIGxldHMgeW91IGNhbGwgbWV0aG9kcyBsaWtlIGAub3B0aW9uYWwoKWAsIGAuYW5kYCwgYC5vcmAgYW5kIGAuc2VsZWN0KClgXG4gKiBPbiBzdHJ1Y3R1cmFsIHBhdHRlcm5zLCBsaWtlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFAuc2hhcGVgIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d2ZXJnbmF1ZC90cy1wYXR0ZXJuI3BzaGFwZS1wYXR0ZXJucylcbiAqXG4gKiAgQGV4YW1wbGVcbiAqICAgLndpdGgoXG4gKiAgICAge1xuICogICAgICAgc3RhdGU6IFAuc2hhcGUoeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0pLm9wdGlvbmFsKCkuc2VsZWN0KClcbiAqICAgICB9LFxuICogICAgIChzdGF0ZSkgPT4gJ21hdGNoIHRoZSBzdWNjZXNzIHN0YXRlLCBvciB1bmRlZmluZWQuJ1xuICogICApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFwZTxpbnB1dCwgY29uc3QgcGF0dGVybiBleHRlbmRzIFBhdHRlcm48aW5wdXQ+PihcbiAgcGF0dGVybjogcGF0dGVyblxuKTogQ2hhaW5hYmxlPEd1YXJkUDxpbnB1dCwgSW52ZXJ0UGF0dGVybjxwYXR0ZXJuLCBpbnB1dD4+PjtcbmV4cG9ydCBmdW5jdGlvbiBzaGFwZShwYXR0ZXJuOiBVbmtub3duUGF0dGVybikge1xuICByZXR1cm4gY2hhaW5hYmxlKHdoZW4oaXNNYXRjaGluZyhwYXR0ZXJuKSkpO1xufVxuIiwgIi8qKlxuICogRXJyb3Igd2hlbiB0aGUgZ2l2ZW4gaW5wdXQgdmFsdWUgZG9lcyBub3QgbWF0Y2ggYW55IGluY2x1ZGVkIHBhdHRlcm5cbiAqIGFuZCAuZXhoYXVzdGl2ZSgpIHdhcyBzcGVjaWZpZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE5vbkV4aGF1c3RpdmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlucHV0OiB1bmtub3duKSB7XG4gICAgbGV0IGRpc3BsYXllZFZhbHVlO1xuICAgIHRyeSB7XG4gICAgICBkaXNwbGF5ZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkaXNwbGF5ZWRWYWx1ZSA9IGlucHV0O1xuICAgIH1cbiAgICBzdXBlcihgUGF0dGVybiBtYXRjaGluZyBlcnJvcjogbm8gcGF0dGVybiBtYXRjaGVzIHZhbHVlICR7ZGlzcGxheWVkVmFsdWV9YCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQYXR0ZXJuIH0gZnJvbSAnLi90eXBlcy9QYXR0ZXJuJztcbmltcG9ydCB7IE1hdGNoIH0gZnJvbSAnLi90eXBlcy9NYXRjaCc7XG5pbXBvcnQgKiBhcyBzeW1ib2xzIGZyb20gJy4vaW50ZXJuYWxzL3N5bWJvbHMnO1xuaW1wb3J0IHsgbWF0Y2hQYXR0ZXJuIH0gZnJvbSAnLi9pbnRlcm5hbHMvaGVscGVycyc7XG5pbXBvcnQgeyBOb25FeGhhdXN0aXZlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbnR5cGUgTWF0Y2hTdGF0ZTxvdXRwdXQ+ID1cbiAgfCB7IG1hdGNoZWQ6IHRydWU7IHZhbHVlOiBvdXRwdXQgfVxuICB8IHsgbWF0Y2hlZDogZmFsc2U7IHZhbHVlOiB1bmRlZmluZWQgfTtcblxuY29uc3QgdW5tYXRjaGVkOiBNYXRjaFN0YXRlPG5ldmVyPiA9IHtcbiAgbWF0Y2hlZDogZmFsc2UsXG4gIHZhbHVlOiB1bmRlZmluZWQsXG59O1xuXG4vKipcbiAqIGBtYXRjaGAgY3JlYXRlcyBhICoqcGF0dGVybiBtYXRjaGluZyBleHByZXNzaW9uKiouXG4gKiAgKiBVc2UgYC53aXRoKHBhdHRlcm4sIGhhbmRsZXIpYCB0byBwYXR0ZXJuIG1hdGNoIG9uIHRoZSBpbnB1dC5cbiAqICAqIFVzZSBgLmV4aGF1c3RpdmUoKWAgb3IgYC5vdGhlcndpc2UoKCkgPT4gZGVmYXVsdFZhbHVlKWAgdG8gZW5kIHRoZSBleHByZXNzaW9uIGFuZCBnZXQgdGhlIHJlc3VsdC5cbiAqXG4gKiBbUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYG1hdGNoYCBvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndmVyZ25hdWQvdHMtcGF0dGVybiNtYXRjaClcbiAqXG4gKiBAZXhhbXBsZVxuICogIGRlY2xhcmUgbGV0IGlucHV0OiBcIkFcIiB8IFwiQlwiO1xuICpcbiAqICByZXR1cm4gbWF0Y2goaW5wdXQpXG4gKiAgICAud2l0aChcIkFcIiwgKCkgPT4gXCJJdCdzIGFuIEEhXCIpXG4gKiAgICAud2l0aChcIkJcIiwgKCkgPT4gXCJJdCdzIGEgQiFcIilcbiAqICAgIC5leGhhdXN0aXZlKCk7XG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2g8Y29uc3QgaW5wdXQsIG91dHB1dCA9IHN5bWJvbHMudW5zZXQ+KFxuICB2YWx1ZTogaW5wdXRcbik6IE1hdGNoPGlucHV0LCBvdXRwdXQ+IHtcbiAgcmV0dXJuIG5ldyBNYXRjaEV4cHJlc3Npb24odmFsdWUsIHVubWF0Y2hlZCkgYXMgYW55O1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG1hdGNoIGV4cHJlc3Npb24uIEl0IGZvbGxvd3MgdGhlXG4gKiBidWlsZGVyIHBhdHRlcm4sIHdlIGNoYWluIG1ldGhvZHMgdG8gYWRkIGZlYXR1cmVzIHRvIHRoZSBleHByZXNzaW9uXG4gKiB1bnRpbCB3ZSBjYWxsIGAuZXhoYXVzdGl2ZWAsIGAub3RoZXJ3aXNlYCBvciB0aGUgdW5zYWZlIGAucnVuYFxuICogbWV0aG9kIHRvIGV4ZWN1dGUgaXQuXG4gKlxuICogVGhlIHR5cGVzIG9mIHRoaXMgY2xhc3MgYXJlbid0IHB1YmxpYywgdGhlIHB1YmxpYyB0eXBlIGRlZmluaXRpb25cbiAqIGNhbiBiZSBmb3VuZCBpbiBzcmMvdHlwZXMvTWF0Y2gudHMuXG4gKi9cbmNsYXNzIE1hdGNoRXhwcmVzc2lvbjxpbnB1dCwgb3V0cHV0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5wdXQ6IGlucHV0LCBwcml2YXRlIHN0YXRlOiBNYXRjaFN0YXRlPG91dHB1dD4pIHt9XG5cbiAgd2l0aCguLi5hcmdzOiBhbnlbXSk6IE1hdGNoRXhwcmVzc2lvbjxpbnB1dCwgb3V0cHV0PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubWF0Y2hlZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBoYW5kbGVyOiAoc2VsZWN0aW9uOiB1bmtub3duLCB2YWx1ZTogaW5wdXQpID0+IG91dHB1dCA9XG4gICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG5cbiAgICBjb25zdCBwYXR0ZXJuczogUGF0dGVybjxpbnB1dD5bXSA9IFthcmdzWzBdXTtcbiAgICBsZXQgcHJlZGljYXRlOiAoKHZhbHVlOiBpbnB1dCkgPT4gdW5rbm93bikgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGFyZ3NbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGNhc2Ugd2l0aCBndWFyZCBhcyBzZWNvbmQgYXJndW1lbnRcbiAgICAgIHByZWRpY2F0ZSA9IGFyZ3NbMV07XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+IDIpIHtcbiAgICAgIC8vIGNhc2Ugd2l0aCBzZXZlcmFsIHBhdHRlcm5zXG4gICAgICBwYXR0ZXJucy5wdXNoKC4uLmFyZ3Muc2xpY2UoMSwgYXJncy5sZW5ndGggLSAxKSk7XG4gICAgfVxuXG4gICAgbGV0IGhhc1NlbGVjdGlvbnMgPSBmYWxzZTtcbiAgICBsZXQgc2VsZWN0ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3Qgc2VsZWN0ID0gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgaGFzU2VsZWN0aW9ucyA9IHRydWU7XG4gICAgICBzZWxlY3RlZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGNvbnN0IG1hdGNoZWQgPVxuICAgICAgcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHRoaXMuaW5wdXQsIHNlbGVjdCkpICYmXG4gICAgICAocHJlZGljYXRlID8gQm9vbGVhbihwcmVkaWNhdGUodGhpcy5pbnB1dCkpIDogdHJ1ZSk7XG5cbiAgICBjb25zdCBzZWxlY3Rpb25zID0gaGFzU2VsZWN0aW9uc1xuICAgICAgPyBzeW1ib2xzLmFub255bW91c1NlbGVjdEtleSBpbiBzZWxlY3RlZFxuICAgICAgICA/IHNlbGVjdGVkW3N5bWJvbHMuYW5vbnltb3VzU2VsZWN0S2V5XVxuICAgICAgICA6IHNlbGVjdGVkXG4gICAgICA6IHRoaXMuaW5wdXQ7XG5cbiAgICBjb25zdCBzdGF0ZSA9IG1hdGNoZWRcbiAgICAgID8ge1xuICAgICAgICAgIG1hdGNoZWQ6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgdmFsdWU6IGhhbmRsZXIoc2VsZWN0aW9ucywgdGhpcy5pbnB1dCksXG4gICAgICAgIH1cbiAgICAgIDogdW5tYXRjaGVkO1xuXG4gICAgcmV0dXJuIG5ldyBNYXRjaEV4cHJlc3Npb24odGhpcy5pbnB1dCwgc3RhdGUpO1xuICB9XG5cbiAgd2hlbihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogaW5wdXQpID0+IHVua25vd24sXG4gICAgaGFuZGxlcjogKHNlbGVjdGlvbjogaW5wdXQsIHZhbHVlOiBpbnB1dCkgPT4gb3V0cHV0XG4gICk6IE1hdGNoRXhwcmVzc2lvbjxpbnB1dCwgb3V0cHV0PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubWF0Y2hlZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBtYXRjaGVkID0gQm9vbGVhbihwcmVkaWNhdGUodGhpcy5pbnB1dCkpO1xuXG4gICAgcmV0dXJuIG5ldyBNYXRjaEV4cHJlc3Npb248aW5wdXQsIG91dHB1dD4oXG4gICAgICB0aGlzLmlucHV0LFxuICAgICAgbWF0Y2hlZFxuICAgICAgICA/IHsgbWF0Y2hlZDogdHJ1ZSwgdmFsdWU6IGhhbmRsZXIodGhpcy5pbnB1dCwgdGhpcy5pbnB1dCkgfVxuICAgICAgICA6IHVubWF0Y2hlZFxuICAgICk7XG4gIH1cblxuICBvdGhlcndpc2UoaGFuZGxlcjogKHZhbHVlOiBpbnB1dCkgPT4gb3V0cHV0KTogb3V0cHV0IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5tYXRjaGVkKSByZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICByZXR1cm4gaGFuZGxlcih0aGlzLmlucHV0KTtcbiAgfVxuXG4gIGV4aGF1c3RpdmUodW5leHBlY3RlZFZhbHVlSGFuZGxlciA9IGRlZmF1bHRDYXRjaGVyKTogb3V0cHV0IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5tYXRjaGVkKSByZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICByZXR1cm4gdW5leHBlY3RlZFZhbHVlSGFuZGxlcih0aGlzLmlucHV0KTtcbiAgfVxuXG4gIHJ1bigpOiBvdXRwdXQge1xuICAgIHJldHVybiB0aGlzLmV4aGF1c3RpdmUoKTtcbiAgfVxuXG4gIHJldHVyblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENhdGNoZXIoaW5wdXQ6IHVua25vd24pOiBuZXZlciB7XG4gIHRocm93IG5ldyBOb25FeGhhdXN0aXZlRXJyb3IoaW5wdXQpO1xufVxuIiwgImltcG9ydCB7IG1hdGNoIH0gZnJvbSAndHMtcGF0dGVybidcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2hlbGwgaGVscGVyIHdpdGggdGhlIGdpdmVuIHNoZWxsIHR5cGVcbiAqXG4gKiBAcGFyYW0gc2hlbGxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNoZWxsIHRvIHVzZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHNoID0gc2hlbGwoJ2Jhc2gnKVxuICpcbiAqIGNvbnN0IGNvbiA9IGRhZy5jb250YWluZXIoKVxuICogICAud2l0aEV4ZWMoc2goJ2VjaG8gaGVsbG8gd29ybGQhJykpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsKHNoZWxsTmFtZTogJ3NoJyB8ICdiYXNoJyB8ICd6c2gnKSB7XG5cdHJldHVybiAoaW5wdXQ6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuXHRcdGNvbnN0IGlucHV0QXIgPSBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogW2lucHV0XVxuXHRcdGNvbnN0IHRyaW1tZWRJbnB1dCA9IGlucHV0QXIubWFwKChpKSA9PlxuXHRcdFx0aVxuXHRcdFx0XHQudHJpbSgpXG5cdFx0XHRcdC5zcGxpdCgnXFxuJylcblx0XHRcdFx0Lm1hcCgobCkgPT4gbC50cmltKCkpXG5cdFx0XHRcdC5qb2luKCdcXG4nKVxuXHRcdClcblxuXHRcdHJldHVybiBtYXRjaChzaGVsbE5hbWUpXG5cdFx0XHQud2l0aCgnc2gnLCAoKSA9PiBbJ3NoJywgJy1jJywgYHNldCAtZXU7ICR7dHJpbW1lZElucHV0fWBdKVxuXHRcdFx0LndpdGgoJ2Jhc2gnLCAoKSA9PiBbJ2Jhc2gnLCAnLWMnLCBgc2V0IC1ldW8gcGlwZWZhaWw7ICR7dHJpbW1lZElucHV0fWBdKVxuXHRcdFx0LndpdGgoJ3pzaCcsICgpID0+IFsnenNoJywgJy1jJywgYHNldCAtZXVvIHBpcGVmYWlsOyAke3RyaW1tZWRJbnB1dH1gXSlcblx0XHRcdC5leGhhdXN0aXZlKClcblx0fVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IHVwIH0gZnJvbSAnZW1wYXRoaWMvZmluZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcG9Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG5cdGN3ZCA9IGN3ZCA/PyBwcm9jZXNzLmN3ZCgpXG5cblx0Y29uc3QgbG9ja2ZpbGUgPSB1cCgncG5wbS1sb2NrLnlhbWwnLCB7IGN3ZCB9KVxuXHRpZiAoIWxvY2tmaWxlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZGV0ZXJtaW5lIHJlcG8gcm9vdCBwYXRoOiB1bmFibGUgdG8gZmluZCBwbnBtLWxvY2sueWFtbCcpXG5cdH1cblxuXHRyZXR1cm4gcGF0aC5kaXJuYW1lKGxvY2tmaWxlKVxufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byB0aGUgZGFnZ2VyIG1vZHVsZS5cbiAqXG4gKiBSZXF1aXJlcyBgcG5wbS1sb2NrLnlhbWxgIHRvIGV4aXN0IGluIHRoZSByZXBvIHJvb3QuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAqKkRlZmF1bHQ6KiogYHByb2Nlc3MuY3dkKClgXG4gKlxuICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhlIGRhZ2dlciBtb2R1bGUgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlUGF0aChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjd2QgPSBjd2QgPz8gcHJvY2Vzcy5jd2QoKVxuXG5cdGNvbnN0IGxvY2tmaWxlID0gdXAoJ3BucG0tbG9jay55YW1sJywgeyBjd2QgfSlcblx0aWYgKCFsb2NrZmlsZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGRldGVybWluZSByZXBvIHJvb3QgcGF0aDogdW5hYmxlIHRvIGZpbmQgcG5wbS1sb2NrLnlhbWwnKVxuXHR9XG5cdGNvbnN0IHJlcG9Sb290ID0gcGF0aC5kaXJuYW1lKGxvY2tmaWxlKVxuXG5cdGNvbnN0IGRhZ2dlckpzb24gPSB1cCgnZGFnZ2VyLmpzb24nLCB7IGN3ZCwgc3RvcDogcmVwb1Jvb3QgfSlcblx0aWYgKCFkYWdnZXJKc29uKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZGV0ZXJtaW5lIGRhZ2dlci5qc29uIHBhdGg6IHVuYWJsZSB0byBmaW5kIGRhZ2dlci5qc29uJylcblx0fVxuXG5cdHJldHVybiBwYXRoLnJlbGF0aXZlKHJlcG9Sb290LCBwYXRoLmRpcm5hbWUoZGFnZ2VySnNvbikpXG59XG4iLCAiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgd2FsayBmcm9tIFwiZW1wYXRoaWMvd2Fsa1wiO1xuLyoqXG4qIEZpbmQgYW4gaXRlbSBieSBuYW1lLCB3YWxraW5nIHBhcmVudCBkaXJlY3RvcmllcyB1bnRpbCBmb3VuZC5cbipcbiogQHBhcmFtIG5hbWUgVGhlIGl0ZW0gbmFtZSB0byBmaW5kLlxuKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaXRlbSwgaWYgZm91bmQuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVwKG5hbWUsIG9wdGlvbnMpIHtcblx0bGV0IGRpciwgdG1wO1xuXHRsZXQgc3RhcnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY3dkIHx8IFwiXCI7XG5cdGZvciAoZGlyIG9mIHdhbGsudXAoc3RhcnQsIG9wdGlvbnMpKSB7XG5cdFx0dG1wID0gam9pbihkaXIsIG5hbWUpO1xuXHRcdGlmIChleGlzdHNTeW5jKHRtcCkpIHJldHVybiB0bXA7XG5cdH1cbn1cbi8qKlxuKiBHZXQgdGhlIGZpcnN0IHBhdGggdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgbmFtZXMgcHJvdmlkZWQuXG4qXG4qID4gW05PVEVdXG4qID4gVGhlIG9yZGVyIG9mIHtAbGluayBuYW1lc30gaXMgcmVzcGVjdGVkLlxuKlxuKiBAcGFyYW0gbmFtZXMgVGhlIGl0ZW0gbmFtZXMgdG8gZmluZC5cbiogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IGl0ZW0gZm91bmQsIGlmIGFueS5cbiovXG5leHBvcnQgZnVuY3Rpb24gYW55KG5hbWVzLCBvcHRpb25zKSB7XG5cdGxldCBkaXIsIHN0YXJ0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmN3ZCB8fCBcIlwiO1xuXHRsZXQgaiA9IDAsIGxlbiA9IG5hbWVzLmxlbmd0aCwgdG1wO1xuXHRmb3IgKGRpciBvZiB3YWxrLnVwKHN0YXJ0LCBvcHRpb25zKSkge1xuXHRcdGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuXHRcdFx0dG1wID0gam9pbihkaXIsIG5hbWVzW2pdKTtcblx0XHRcdGlmIChleGlzdHNTeW5jKHRtcCkpIHJldHVybiB0bXA7XG5cdFx0fVxuXHR9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGFic29sdXRlIH0gZnJvbSBcImVtcGF0aGljL3Jlc29sdmVcIjtcbi8qKlxuKiBHZXQgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBvZiB7QGxpbmsgYmFzZX0uXG4qIFN0b3BzIGF0IHtAbGluayBPcHRpb25zWydzdG9wJ119IGVsc2Ugc3lzdGVtIHJvb3QgKFwiL1wiKS5cbipcbiogQHJldHVybnMgQW4gYXJyYXkgb2YgYWJzb2x1dGUgcGF0aHMgb2YgYWxsIHBhcmVudCBkaXJlY3Rvcmllcy5cbiovXG5leHBvcnQgZnVuY3Rpb24gdXAoYmFzZSwgb3B0aW9ucykge1xuXHRsZXQgeyBzdG9wLCBjd2QgfSA9IG9wdGlvbnMgfHwge307XG5cdGxldCB0bXAgPSBhYnNvbHV0ZShiYXNlLCBjd2QpLCByb290ID0gIXN0b3A7XG5cdGxldCBwcmV2LCBhcnIgPSBbXTtcblx0aWYgKHN0b3ApIHN0b3AgPSBhYnNvbHV0ZShzdG9wLCBjd2QpO1xuXHR3aGlsZSAocm9vdCB8fCB0bXAgIT09IHN0b3ApIHtcblx0XHRhcnIucHVzaCh0bXApO1xuXHRcdHRtcCA9IGRpcm5hbWUocHJldiA9IHRtcCk7XG5cdFx0aWYgKHRtcCA9PT0gcHJldikgYnJlYWs7XG5cdH1cblx0cmV0dXJuIGFycjtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuLyoqXG4qIFJlc29sdmUgYW4gYWJzb2x1dGUgcGF0aCBmcm9tIHtAbGluayByb290fSwgYnV0IG9ubHlcbiogaWYge0BsaW5rIGlucHV0fSBpc24ndCBhbHJlYWR5IGFic29sdXRlLlxuKlxuKiBAcGFyYW0gaW5wdXQgVGhlIHBhdGggdG8gcmVzb2x2ZS5cbiogQHBhcmFtIHJvb3QgVGhlIGJhc2UgcGF0aDsgZGVmYXVsdCA9IHByb2Nlc3MuY3dkKClcbiogQHJldHVybnMgVGhlIHJlc29sdmVkIGFic29sdXRlIHBhdGguXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGFic29sdXRlKGlucHV0LCByb290KSB7XG5cdHJldHVybiBpc0Fic29sdXRlKGlucHV0KSA/IGlucHV0IDogcmVzb2x2ZShyb290IHx8IFwiLlwiLCBpbnB1dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZnJvbShyb290LCBpZGVudCwgc2lsZW50KSB7XG5cdHRyeSB7XG5cdFx0bGV0IHIgPSByb290IGluc3RhbmNlb2YgVVJMIHx8IHJvb3Quc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgPyBqb2luKGZpbGVVUkxUb1BhdGgocm9vdCksIFwibm9vcC5qc1wiKSA6IGpvaW4oYWJzb2x1dGUocm9vdCksIFwibm9vcC5qc1wiKTtcblx0XHRyZXR1cm4gY3JlYXRlUmVxdWlyZShyKS5yZXNvbHZlKGlkZW50KTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKCFzaWxlbnQpIHRocm93IGVycjtcblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIGN3ZChpZGVudCwgc2lsZW50KSB7XG5cdHJldHVybiBmcm9tKHJlc29sdmUoKSwgaWRlbnQsIHNpbGVudCk7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIHRvIGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZyBsaXRlcmFsIHR5cGUuXG4gKiBlLmcuLCAnaGVsbG8nIC0+ICdIZWxsbydcbiAqL1xudHlwZSBDYXBpdGFsaXplU3RyaW5nPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIEZpcnN0fSR7aW5mZXIgUmVzdH1gXG5cdD8gYCR7VXBwZXJjYXNlPEZpcnN0Pn0ke1Jlc3R9YFxuXHQ6IFNcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmFuc2Zvcm1zIGEgc25ha2VfY2FzZSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIGNhbWVsQ2FzZS5cbiAqIGUuZy4sICdTT01FX0FQSV9LRVknIC0+ICdzb21lQXBpS2V5J1xuICogICAgICAgJ0hFTExPX1dPUkxEJyAgLT4gJ2hlbGxvV29ybGQnXG4gKiAgICAgICAnV09SRCcgICAgICAgICAtPiAnd29yZCdcbiAqL1xudHlwZSBTbmFrZVRvQ2FtZWxDYXNlPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFR9XyR7aW5mZXIgVX1gXG5cdD8gYCR7TG93ZXJjYXNlPFQ+fSR7Q2FwaXRhbGl6ZVN0cmluZzxTbmFrZVRvQ2FtZWxDYXNlPFU+Pn1gIC8vIExvd2VyY2FzZSBmaXJzdCBwYXJ0LCBjYXBpdGFsaXplIGFuZCByZWN1cnNlIG9uIHRoZSByZXN0XG5cdDogTG93ZXJjYXNlPFM+IC8vIEJhc2UgY2FzZTogTm8gdW5kZXJzY29yZSwganVzdCBsb3dlcmNhc2UgdGhlIHdob2xlIHRoaW5nXG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgZnJvbSBzbmFrZV9jYXNlLCBVUFBFUl9TTkFLRV9DQVNFLCBQYXNjYWxDYXNlLFxuICogb3IgQUxMX0NBUFMgdG8gY2FtZWxDYXNlIGF0IHJ1bnRpbWUuXG4gKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgY2FtZWxDYXNlIG9yIGxvd2VyY2FzZSwgaXQgcmVtYWlucyB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgaW5wdXQgc3RyaW5nIGluIHNuYWtlX2Nhc2UgZm9ybWF0LlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBzdHJpbmcgaW4gY2FtZWxDYXNlIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNuYWtlVG9DYW1lbChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICghc3RyKSB7XG5cdFx0cmV0dXJuICcnXG5cdH1cblxuXHQvLyBDYXNlIDE6IFN0cmluZyBjb250YWlucyB1bmRlcnNjb3JlcyAoc25ha2VfY2FzZSlcblx0aWYgKHN0ci5pbmNsdWRlcygnXycpKSB7XG5cdFx0bGV0IHJlc3VsdCA9ICcnXG5cdFx0Y29uc3QgcGFydHMgPSBzdHIuc3BsaXQoJ18nKVxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHBhcnQgPSBwYXJ0c1tpXVxuXHRcdFx0aWYgKHBhcnQpIHtcblx0XHRcdFx0Ly8gU2tpcCBlbXB0eSBwYXJ0cyBmcm9tIG11bHRpcGxlIHVuZGVyc2NvcmVzXG5cdFx0XHRcdGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gRmlyc3Qgbm9uLWVtcHR5IHBhcnQ6IGxvd2VyY2FzZSB0aGUgd2hvbGUgcGFydFxuXHRcdFx0XHRcdHJlc3VsdCArPSBwYXJ0LnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBTdWJzZXF1ZW50IG5vbi1lbXB0eSBwYXJ0czogY2FwaXRhbGl6ZSBmaXJzdCBsZXR0ZXIsIHJlc3QgbG93ZXJjYXNlXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHBhcnRbMF0hLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBIYW5kbGUgY2FzZSBsaWtlIFwiX1NPTUVfV09SRF9cIiAtPiBcInNvbWVXb3JkXCJcblx0XHQvLyBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2FzICdfJyBhbmQgcmVzdWx0IGlzIGVtcHR5LFxuXHRcdC8vIGl0IG1lYW5zIHRoZSBzdHJpbmcgd2FzIG9ubHkgdW5kZXJzY29yZXMsIHJldHVybiAnJ1xuXHRcdC8vIElmIHRoZSBmaXJzdCBwYXJ0IHdhcyBlbXB0eSAoJ19XT1JEJyksIHJlc3VsdCBzdGFydHMgbG93ZXJjYXNlIGNvcnJlY3RseS5cblx0XHRyZXR1cm4gcmVzdWx0XG5cdH1cblxuXHQvLyBDYXNlIDI6IFN0cmluZyBkb2VzIE5PVCBjb250YWluIHVuZGVyc2NvcmVzXG5cdC8vIENoZWNrIGlmIGl0J3MgQUxMX0NBUFMgKGFsbG93aW5nIGZvciBudW1iZXJzKVxuXHRjb25zdCBpc0FsbENhcHMgPSAvXltBLVowLTldKyQvLnRlc3Qoc3RyKVxuXHRpZiAoaXNBbGxDYXBzKSB7XG5cdFx0Ly8gZS5nLiwgXCJXT1JEXCIsIFwiVE9LRU4xMjNcIiAtPiBcIndvcmRcIiwgXCJ0b2tlbjEyM1wiXG5cdFx0cmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpXG5cdH1cblxuXHQvLyBDaGVjayBpZiBpdCdzIFBhc2NhbENhc2Ugb3IgYWxyZWFkeSBjYW1lbENhc2UvbG93ZXJjYXNlXG5cdC8vIElmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYWxyZWFkeSBsb3dlcmNhc2UsIGFzc3VtZSBpdCdzIGNhbWVsQ2FzZSBvciBsb3dlcmNhc2Vcblx0aWYgKHN0clswXSA9PT0gc3RyWzBdIS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0Ly8gZS5nLiwgXCJoZWxsb1dvcmxkXCIsIFwid29yZFwiIC0+IHN0YXlzIHRoZSBzYW1lXG5cdFx0cmV0dXJuIHN0clxuXHR9XG5cblx0Ly8gT3RoZXJ3aXNlLCBhc3N1bWUgaXQncyBQYXNjYWxDYXNlOiBMb3dlcmNhc2Ugb25seSB0aGUgZmlyc3QgY2hhcmFjdGVyXG5cdC8vIGUuZy4sIFwiSGVsbG9Xb3JsZFwiLCBcIlNvbWVWYWx1ZVwiIC0+IFwiaGVsbG9Xb3JsZFwiLCBcInNvbWVWYWx1ZVwiXG5cdHJldHVybiBzdHJbMF0hLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSlcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QncyBrZXlzIGZyb20gc25ha2VfY2FzZSBvciBVUFBFUl9TTkFLRV9DQVNFIHRvIGNhbWVsQ2FzZS5cbiAqIFRoZSByZXR1cm4gdHlwZSBwcmVjaXNlbHkgbWFwcyB0aGUgaW5wdXQga2V5cyB0byB0aGVpciBjYW1lbENhc2UgdmVyc2lvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGlucHV0IG9iamVjdCwgZXhwZWN0ZWQgdG8gaGF2ZSBzdHJpbmcga2V5cy5cbiAqIEBwYXJhbSBpbnB1dCBUaGUgb2JqZWN0IHdpdGggc25ha2VfY2FzZSBrZXlzLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWVzIGJ1dCBjYW1lbENhc2Uga2V5cywgd2l0aCBhIHNwZWNpZmljIGluZmVycmVkIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9DYW1lbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG5cdGlucHV0OiBUXG4pOiB7IFtLIGluIGtleW9mIFQgYXMgU25ha2VUb0NhbWVsQ2FzZTxLICYgc3RyaW5nPl06IFRbS10gfSB7XG5cdGNvbnN0IG91dHB1dDogYW55ID0ge31cblxuXHRmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuXHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5wdXQsIGtleSkpIHtcblx0XHRcdGNvbnN0IGNhbWVsQ2FzZUtleSA9IHNuYWtlVG9DYW1lbChrZXkpXG5cdFx0XHRvdXRwdXRbY2FtZWxDYXNlS2V5XSA9IGlucHV0W2tleV1cblx0XHR9XG5cdH1cblxuXHQvLyBXZSB1c2UgYSB0eXBlIGFzc2VydGlvbiBoZXJlLiBXaGlsZSBvdXIgcnVudGltZSBsb2dpYyBjcmVhdGVzIHRoZSBjb3JyZWN0XG5cdC8vIHNoYXBlLCBUeXBlU2NyaXB0J3MgYW5hbHlzaXMgd2l0aGluIHRoZSBsb29wIGlzbid0IHBvd2VyZnVsIGVub3VnaCB0b1xuXHQvLyBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGF0ICdvdXRwdXQnIHBlcmZlY3RseSBtYXRjaGVzIHRoZSBjb21wbGV4IG1hcHBlZCB0eXBlLlxuXHQvLyBUaGUgcmV0dXJuIHR5cGUgYW5ub3RhdGlvbiBndWFyYW50ZWVzIHRoZSB0eXBlIGZvciB0aGUgY2FsbGVyLlxuXHRyZXR1cm4gb3V0cHV0IGFzIHsgW0sgaW4ga2V5b2YgVCBhcyBTbmFrZVRvQ2FtZWxDYXNlPEsgJiBzdHJpbmc+XTogVFtLXSB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgbG93ZXJjYXNlIEEtWlxudHlwZSBJc0xvd2VyPEMgZXh0ZW5kcyBzdHJpbmc+ID1cblx0TG93ZXJjYXNlPEM+IGV4dGVuZHMgVXBwZXJjYXNlPEM+ID8gZmFsc2UgOiBDIGV4dGVuZHMgTG93ZXJjYXNlPEM+ID8gdHJ1ZSA6IGZhbHNlXG4vLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlIEEtWlxudHlwZSBJc1VwcGVyPEMgZXh0ZW5kcyBzdHJpbmc+ID1cblx0TG93ZXJjYXNlPEM+IGV4dGVuZHMgVXBwZXJjYXNlPEM+ID8gZmFsc2UgOiBDIGV4dGVuZHMgVXBwZXJjYXNlPEM+ID8gdHJ1ZSA6IGZhbHNlXG4vLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYSBkaWdpdCAwLTlcbnR5cGUgSXNEaWdpdDxDIGV4dGVuZHMgc3RyaW5nPiA9IEMgZXh0ZW5kcyBgJHtudW1iZXJ9YCA/IHRydWUgOiBmYWxzZVxuXG4vLyBSZWN1cnNpdmUgaW5uZXIgaGVscGVyIGZvciBDYW1lbFRvU25ha2VDYXNlXG4vLyBQcmV2Q2hhciB0cmFja3MgdGhlICpwcmV2aW91cyogY2hhcmFjdGVyIGZyb20gdGhlIG9yaWdpbmFsIHN0cmluZ1xudHlwZSBDYW1lbFRvU25ha2VJbm5lcjxTIGV4dGVuZHMgc3RyaW5nLCBQcmV2Q2hhciBleHRlbmRzIHN0cmluZyA9ICcnPiA9XG5cdC8vIEJhc2UgY2FzZTogSWYgdGhlIGlucHV0IHN0cmluZyBTIGlzIGVtcHR5LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLlxuXHRTIGV4dGVuZHMgJydcblx0XHQ/ICcnXG5cdFx0OiAvLyBSZWN1cnNpdmUgc3RlcDogSWYgUyBoYXMgY29udGVudC4uLlxuXHRcdFx0UyBleHRlbmRzIGAke2luZmVyIEZpcnN0fSR7aW5mZXIgUmVzdH1gXG5cdFx0XHQ/IC8vIC0tLSBMb2dpYyBiYXNlZCBvbiB0aGUgJ0ZpcnN0JyBjaGFyYWN0ZXIgLS0tXG5cblx0XHRcdFx0Ly8gMS4gSXMgJ0ZpcnN0JyBhbiB1cHBlcmNhc2UgbGV0dGVyP1xuXHRcdFx0XHRJc1VwcGVyPEZpcnN0PiBleHRlbmRzIHRydWVcblx0XHRcdFx0PyAvLyAxYS4gV2FzICdQcmV2Q2hhcicgbG93ZXJjYXNlIG9yIGEgZGlnaXQ/IChSZXF1aXJlcyB1bmRlcnNjb3JlKVxuXHRcdFx0XHRcdElzTG93ZXI8UHJldkNoYXI+IGV4dGVuZHMgdHJ1ZVxuXHRcdFx0XHRcdD8gYF8ke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHRcdFx0XHRcdDogSXNEaWdpdDxQcmV2Q2hhcj4gZXh0ZW5kcyB0cnVlXG5cdFx0XHRcdFx0XHQ/IGBfJHtVcHBlcmNhc2U8Rmlyc3Q+fSR7Q2FtZWxUb1NuYWtlSW5uZXI8UmVzdCwgRmlyc3Q+fWBcblx0XHRcdFx0XHRcdDogLy8gMWIuICdQcmV2Q2hhcicgd2FzIHVwcGVyY2FzZSwgc3ltYm9sLCBvciBzdGFydC4gQ2hlY2sgZm9yIGFjcm9ueW0gZW5kaW5nLlxuXHRcdFx0XHRcdFx0XHRSZXN0IGV4dGVuZHMgYCR7aW5mZXIgTmV4dENoYXJ9JHtzdHJpbmd9YCAvLyBMb29rIGFoZWFkXG5cdFx0XHRcdFx0XHRcdD8gSXNMb3dlcjxOZXh0Q2hhcj4gZXh0ZW5kcyB0cnVlIC8vIElzIHRoZSAqbmV4dCogY2hhciBsb3dlcmNhc2U/XG5cdFx0XHRcdFx0XHRcdFx0PyBgXyR7VXBwZXJjYXNlPEZpcnN0Pn0ke0NhbWVsVG9TbmFrZUlubmVyPFJlc3QsIEZpcnN0Pn1gIC8vIFllcyAoZS5nLiwgQVBJX0tleSlcblx0XHRcdFx0XHRcdFx0XHQ6IGAke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YCAvLyBObyAoZS5nLiwgSFRUUClcblx0XHRcdFx0XHRcdFx0OiAvLyAnRmlyc3QnIGlzIHRoZSBsYXN0IGNoYXJhY3RlciBvciBmb2xsb3dlZCBieSBub24tbG93ZXJjYXNlLlxuXHRcdFx0XHRcdFx0XHRcdGAke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHRcdFx0XHQ6IC8vIDIuIElzICdGaXJzdCcgYSBkaWdpdD8gKE9ubHkgY2hlY2tlZCBpZiBub3QgdXBwZXJjYXNlKVxuXHRcdFx0XHRcdElzRGlnaXQ8Rmlyc3Q+IGV4dGVuZHMgdHJ1ZVxuXHRcdFx0XHRcdD8gLy8gMmEuIFdhcyAnUHJldkNoYXInIGEgbG93ZXJjYXNlIGxldHRlcj8gKFJlcXVpcmVzIHVuZGVyc2NvcmUpXG5cdFx0XHRcdFx0XHRJc0xvd2VyPFByZXZDaGFyPiBleHRlbmRzIHRydWVcblx0XHRcdFx0XHRcdD8gYF8ke0ZpcnN0fSR7Q2FtZWxUb1NuYWtlSW5uZXI8UmVzdCwgRmlyc3Q+fWBcblx0XHRcdFx0XHRcdDogLy8gJ1ByZXZDaGFyJyB3YXMgbm90IGxvd2VyY2FzZSAoZGlnaXQsIHVwcGVyY2FzZSwgc3ltYm9sLCBzdGFydClcblx0XHRcdFx0XHRcdFx0YCR7Rmlyc3R9JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YFxuXHRcdFx0XHRcdDogLy8gMy4gJ0ZpcnN0JyBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlciBvciBhIHN5bWJvbC5cblx0XHRcdFx0XHRcdC8vICAgIChTeW1ib2xzIGFyZSBoYW5kbGVkIGxpa2UgbG93ZXJjYXNlIGhlcmUgLSBubyB1bmRlcnNjb3JlIG5lZWRlZCBiZWZvcmUgdGhlbSlcblx0XHRcdFx0XHRcdGAke1VwcGVyY2FzZTxGaXJzdD59JHtDYW1lbFRvU25ha2VJbm5lcjxSZXN0LCBGaXJzdD59YCAvLyBVcHBlcmNhc2UgbGV0dGVyLCBhcHBlbmQgc3ltYm9sIGRpcmVjdGx5XG5cdFx0XHQ6IC8vIFRoaXMgY2FzZSBzaG91bGQgdGVjaG5pY2FsbHkgbm90IGJlIHJlYWNoYWJsZSBpZiBTIGlzIG5vdCAnJywgYnV0IGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MuXG5cdFx0XHRcdCcnXG5cbi8qKlxuICogVHlwZSBoZWxwZXIgdG8gY29udmVydCBhIGNhbWVsQ2FzZS9QYXNjYWxDYXNlIHN0cmluZyBsaXRlcmFsIHR5cGVcbiAqIHRvIGFuIFVQUEVSX1NOQUtFX0NBU0Ugc3RyaW5nIGxpdGVyYWwgdHlwZS4gSGFuZGxlcyBjb21tb24gY2FzZXNcbiAqIGluY2x1ZGluZyB0cmFuc2l0aW9ucyBmcm9tIGxvd2VyIHRvIHVwcGVyLCBsZXR0ZXJzIHRvIGRpZ2l0cywgYW5kIGJhc2ljIGFjcm9ueW1zLlxuICpcbiAqIEV4YW1wbGVzOlxuICogICAndXNlcklkJyAtPiAnVVNFUl9JRCdcbiAqICAgJ3VzZXJOYW1lJyAtPiAnVVNFUl9OQU1FJ1xuICogICAnaXNBY3RpdmUnIC0+ICdJU19BQ1RJVkUnXG4gKiAgICdBUElLZXknIC0+ICdBUElfS0VZJ1xuICogICAndmVyc2lvbjEwJyAtPiAnVkVSU0lPTl8xMCdcbiAqICAgJ2FwaVYyQ2xpZW50JyAtPiAnQVBJX1YyX0NMSUVOVCdcbiAqL1xudHlwZSBDYW1lbFRvU25ha2VDYXNlPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIEZpcnN0fSR7aW5mZXIgUmVzdH1gXG5cdD8gLy8gVXBwZXJjYXNlIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3RlciwgdGhlbiBwcm9jZXNzIHRoZSByZXN0IHVzaW5nIHRoZSBpbm5lciBoZWxwZXJcblx0XHRgJHtVcHBlcmNhc2U8Rmlyc3Q+fSR7Q2FtZWxUb1NuYWtlSW5uZXI8UmVzdCwgRmlyc3Q+fWBcblx0OiAvLyBIYW5kbGUgc2luZ2xlIGNoYXJhY3RlciBvciBlbXB0eSBzdHJpbmdcblx0XHRVcHBlcmNhc2U8Uz5cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlIHN0cmluZyB0byBVUFBFUl9TTkFLRV9DQVNFLlxuICogSGFuZGxlcyBhY3JvbnltcyBhbmQgbnVtYmVycyB3aXRoaW4gdGhlIHN0cmluZy5cbiAqXG4gKiAqKkV4YW1wbGVzOioqXG4gKiBgYGBcbiAqICAgJ2hlbGxvV29ybGQnIC0+ICdIRUxMT19XT1JMRCdcbiAqICAgJ0hlbGxvV29ybGQnIC0+ICdIRUxMT19XT1JMRCdcbiAqICAgJ3NvbWVBUElLZXknIC0+ICdTT01FX0FQSV9LRVknXG4gKiAgICdnZXRIdHRwUmVzcG9uc2VDb2RlJyAtPiAnR0VUX0hUVFBfUkVTUE9OU0VfQ09ERSdcbiAqICAgJ3ZlcnNpb24xMCcgLT4gJ1ZFUlNJT05fMTAnIC8vIEZpeGVkXG4gKiAgICd2ZXJzaW9uMTBBbHBoYScgLT4gJ1ZFUlNJT05fMTBfQUxQSEEnIC8vIEZpeGVkXG4gKiAgICdhcGlWMkNsaWVudCcgLT4gJ0FQSV9WMl9DTElFTlQnXG4gKiAgICdyZWxlYXNlVjEwJyAtPiAnUkVMRUFTRV9WMTAnXG4gKiAgICd2ZXJzaW9uMkRhdGEnIC0+ICdWRVJTSU9OXzJfREFUQScgLy8gRml4ZWRcbiAqICAgJ3dvcmQnIC0+ICdXT1JEJ1xuICpgYGBcbiAqIEBwYXJhbSBzdHIgVGhlIGlucHV0IHN0cmluZyBpbiBjYW1lbENhc2Ugb3IgUGFzY2FsQ2FzZSBmb3JtYXQuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHN0cmluZyBpbiBVUFBFUl9TTkFLRV9DQVNFIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9TbmFrZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICghc3RyKSB7XG5cdFx0cmV0dXJuICcnXG5cdH1cblxuXHQvLyBUaGUgc2VxdWVuY2UgbWF0dGVyczpcblx0Y29uc3QgcmVzdWx0ID0gc3RyXG5cdFx0Ly8gMS4gQWRkIF8gYmVmb3JlIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhIGxvd2VyY2FzZSBsZXR0ZXIsXG5cdFx0Ly8gICAgYnV0IG9ubHkgaWYgdGhlIHVwcGVyY2FzZSBsZXR0ZXIgaXMgbm90IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGFuZFxuXHRcdC8vICAgIGlzIHByZWNlZGVkIGJ5IGFub3RoZXIgdXBwZXJjYXNlIGxldHRlciAoaGFuZGxlcyBhY3JvbnltcyBsaWtlIEFQSUtleSAtPiBBUElfS2V5KS5cblx0XHQucmVwbGFjZSgvKFtBLVpdKShbQS1aXVthLXpdKS9nLCAnJDFfJDInKVxuXHRcdC8vIDIuIEFkZCBfIGJlZm9yZSBhbiB1cHBlcmNhc2UgbGV0dGVyIHRoYXQgaXMgcHJlY2VkZWQgYnkgYSBsb3dlcmNhc2UgbGV0dGVyIG9yIGEgZGlnaXQuXG5cdFx0Ly8gICAgKGhhbmRsZXMgaGVsbG9Xb3JsZCAtPiBoZWxsb19Xb3JsZCwgdmVyc2lvbjEwVXBkYXRlIC0+IHZlcnNpb24xMF9VcGRhdGUsIGFwaVYyQ2xpZW50IC0+IGFwaV9WMkNsaWVudClcblx0XHQucmVwbGFjZSgvKFthLXpcXGRdKShbQS1aXSkvZywgJyQxXyQyJylcblx0XHQvLyAzLiBBZGQgXyBiZXR3ZWVuIGEgbG93ZXJjYXNlIGxldHRlciBhbmQgYSBudW1iZXIuXG5cdFx0Ly8gICAgKGhhbmRsZXMgdmVyc2lvbjEwIC0+IHZlcnNpb25fMTAsIGJ1dCBOT1QgVjEwIC0+IFZfMTAgYmVjYXVzZSBWIGlzIHVwcGVyY2FzZSlcblx0XHQucmVwbGFjZSgvKFthLXpdKShcXGQpL2csICckMV8kMicpXG5cblx0Ly8gQ29udmVydCB0aGUgZW50aXJlIHJlc3VsdCB0byB1cHBlcmNhc2Vcblx0cmV0dXJuIHJlc3VsdC50b1VwcGVyQ2FzZSgpXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0J3Mga2V5cyBmcm9tIGNhbWVsQ2FzZS9QYXNjYWxDYXNlIHRvIFVQUEVSX1NOQUtFX0NBU0UuXG4gKiBQcm92aWRlcyBjb21waWxlLXRpbWUgdHlwZSBzYWZldHkgZm9yIHRoZSBjb252ZXJ0ZWQga2V5cyBiYXNlZCBvbiBjb21tb24gcGF0dGVybnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGlucHV0IG9iamVjdC5cbiAqIEBwYXJhbSBpbnB1dCBUaGUgb2JqZWN0IHdpdGggY2FtZWxDYXNlL1Bhc2NhbENhc2Uga2V5cy5cbiAqIEByZXR1cm5zIEEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBidXQgVVBQRVJfU05BS0VfQ0FTRSBrZXlzLFxuICogICAgICAgICAgd2l0aCBhbiBpbmZlcnJlZCB0eXBlIHJlZmxlY3RpbmcgdGhlIGtleSB0cmFuc2Zvcm1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1NuYWtlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pihcblx0aW5wdXQ6IFRcblx0Ly8gQXBwbHkgdGhlIG1hcHBlZCB0eXBlIHdpdGgga2V5IHJlbWFwcGluZyB1c2luZyB0aGUgdHlwZSBoZWxwZXJcbik6IHsgW0sgaW4ga2V5b2YgVCBhcyBDYW1lbFRvU25ha2VDYXNlPEsgJiBzdHJpbmc+XTogVFtLXSB9IHtcblx0Y29uc3Qgb3V0cHV0OiBhbnkgPSB7fSAvLyBJbml0aWFsaXplIGFzICdhbnknIG9yICd7fSdcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuXHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5wdXQsIGtleSkpIHtcblx0XHRcdGNvbnN0IHNuYWtlQ2FzZUtleSA9IGNhbWVsVG9TbmFrZShrZXkpIC8vIFJ1bnRpbWUgY29udmVyc2lvblxuXHRcdFx0b3V0cHV0W3NuYWtlQ2FzZUtleV0gPSBpbnB1dFtrZXldXG5cdFx0fVxuXHR9XG5cblx0Ly8gVHlwZSBhc3NlcnRpb246IFdlIHRydXN0IHRoZSBydW50aW1lIGBjYW1lbFRvU25ha2VgIGxvZ2ljIHByb2R1Y2VzIGtleXNcblx0Ly8gbWF0Y2hpbmcgdGhlIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IHRoZSBgQ2FtZWxUb1NuYWtlQ2FzZWAgdHlwZSBoZWxwZXIuXG5cdC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgVFMgY2FuJ3QgcGVyZmVjdGx5IHZlcmlmeSB0aGUgcnVudGltZSBsb2dpY1xuXHQvLyBhZ2FpbnN0IHRoZSBjb21wbGV4IHR5cGUtbGV2ZWwgbG9naWMgZm9yIGFsbCBwb3NzaWJsZSBpbnB1dHMuXG5cdHJldHVybiBvdXRwdXQgYXMgeyBbSyBpbiBrZXlvZiBUIGFzIENhbWVsVG9TbmFrZUNhc2U8SyAmIHN0cmluZz5dOiBUW0tdIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQUNPLElBQU1BLEVBQVksQ0FFeEIsZ0JBQWlCLENBRWhCLE9BQVEsQ0FDUCxtQkFDQSxVQUNBLGFBQ0EsZUFDQSxlQUNBLGFBQ0EsV0FDQSxZQUNBLGVBQ0EsYUFDQSxZQUNBLE9BQ0QsQ0FDRCxDQUNELEVDbkJBLE9BQVMscUJBQUFDLE1BQXlCLG1CQWlCM0IsSUFBTUMsRUFBYSxJQUFJRCxFQVF2QixTQUFTRSxFQUFrQkMsRUFBMEIsQ0FDM0QsSUFBTUMsRUFBVUQsRUFBSyxTQUFTLEVBQUUsUUFBUSxpQkFBa0IsRUFBRSxFQUV0REUsRUFDTEQsRUFBUSxNQUFNLGlEQUFpRCxHQUMvREEsRUFBUSxNQUFNLDhCQUE4QixFQUU3QyxHQUFJLENBQUNDLEdBQWUsT0FBT0EsRUFBWSxDQUFDLEVBQU0sSUFDN0MsZUFBUSxLQUFLLDBEQUEyREQsQ0FBTyxFQUN4RSxDQUFDLEVBS1QsSUFBTUUsRUFIWUQsRUFBWSxDQUFDLEVBSTdCLFFBQVEsZUFBZ0IsRUFBRSxFQUMxQixRQUFRLGFBQWMsRUFBRSxFQUUxQixPQUFLQyxFQUFpQixLQUFLLEVBSXBCQSxFQUNMLE1BQU0sR0FBRyxFQUNULElBQUtDLEdBRVlBLEVBQU0sTUFBTSxNQUFNLEVBQUUsQ0FBQyxHQUNyQixLQUFLLEdBQUssRUFDM0IsRUFDQSxPQUFRQyxHQUFTQSxFQUFLLE9BQVMsQ0FBQyxFQVYxQixDQUFDLENBV1YsQ0FPTyxTQUFT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QixPQUFPLEVBR3ZDLFFBQVEsb0JBQXFCLE9BQU8sRUFHcEMsUUFBUSxlQUFnQixPQUFPLEVBR25CLFlBQVksRUFqQmxCLEVBa0JULENBV08sU0FBU0MsR0FDZkMsRUFFMkQsQ0FDM0QsSUFBTUMsRUFBYyxDQUFDLEVBRXJCLFFBQVdDLEtBQU9GLEVBQ2pCLEdBQUksT0FBTyxVQUFVLGVBQWUsS0FBS0EsRUFBT0UsQ0FBRyxFQUFHLENBQ3JELElBQU1DLEVBQWVOLEdBQWFLLENBQUcsRUFDckNELEVBQU9FLENBQVksRUFBSUgsRUFBTUUsQ0FBRyxDQUNqQyxDQU9ELE9BQU9ELENBQ1IiLAogICJuYW1lcyI6IFsiY29uc3RhbnRzIiwgIkFzeW5jTG9jYWxTdG9yYWdlIiwgImVudlN0b3JhZ2UiLCAiZXh0cmFjdFBhcmFtTmFtZXMiLCAiZnVuYyIsICJmdW5jU3RyIiwgInBhcmFtc01hdGNoIiwgImNsZWFuZWRQYXJhbXNTdHIiLCAicGFyYW0iLCAibmFtZSIsICJQYXJhbXNUb0VudiIsICJfdGFyZ2V0IiwgInByb3BlcnR5S2V5IiwgImRlc2NyaXB0b3IiLCAib3JpZ2luYWxNZXRob2QiLCAicGFyYW1OYW1lcyIsICJhcmdzIiwgInBhcmVudENvbnRleHQiLCAibmV3RW52IiwgImN1cnJlbnRQYXJhbXMiLCAiaW5kZXgiLCAibWVyZ2VkRW52IiwgImNvbnRleHRUb1N0b3JlIiwgIm1hdGNoZXIiLCAiU3ltYm9sIiwgImZvciIsICJpc1ZhcmlhZGljIiwgImFub255bW91c1NlbGVjdEtleSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJCb29sZWFuIiwgImlzTWF0Y2hlciIsICJ4IiwgInN5bWJvbHMiLCAibWF0Y2hQYXR0ZXJuIiwgInBhdHRlcm4iLCAic2VsZWN0IiwgIm1hdGNoZWQiLCAic2VsZWN0aW9ucyIsICJtYXRjaCIsICJPYmplY3QiLCAia2V5cyIsICJmb3JFYWNoIiwgImtleSIsICJBcnJheSIsICJpc0FycmF5IiwgInN0YXJ0UGF0dGVybnMiLCAiZW5kUGF0dGVybnMiLCAidmFyaWFkaWNQYXR0ZXJucyIsICJpIiwgInN1YnBhdHRlcm4iLCAicHVzaCIsICJsZW5ndGgiLCAiRXJyb3IiLCAic3RhcnRWYWx1ZXMiLCAic2xpY2UiLCAiZW5kVmFsdWVzIiwgIm1pZGRsZVZhbHVlcyIsICJJbmZpbml0eSIsICJldmVyeSIsICJzdWJQYXR0ZXJuIiwgIlJlZmxlY3QiLCAib3duS2V5cyIsICJrIiwgIm1hdGNoZXJUeXBlIiwgImlzIiwgImdldFNlbGVjdGlvbktleXMiLCAiX3BhdHRlcm4kc3ltYm9scyRtYXRjIiwgIl9wYXR0ZXJuJHN5bWJvbHMkbWF0YzIiLCAiX3BhdHRlcm4kc3ltYm9scyRtYXRjMyIsICJjYWxsIiwgImZsYXRNYXAiLCAidmFsdWVzIiwgInhzIiwgImYiLCAicmVkdWNlIiwgImFjYyIsICJjb25jYXQiLCAiY2hhaW5hYmxlIiwgInBhdHRlcm4iLCAiT2JqZWN0IiwgImFzc2lnbiIsICJvcHRpb25hbCIsICJhbmQiLCAicDIiLCAiaW50ZXJzZWN0aW9uIiwgIm9yIiwgInVuaW9uIiwgInNlbGVjdCIsICJrZXkiLCAib3B0aW9uYWwiLCAicGF0dGVybiIsICJjaGFpbmFibGUiLCAibWF0Y2hlciIsICJtYXRjaCIsICJ2YWx1ZSIsICJzZWxlY3Rpb25zIiwgInNlbGVjdG9yIiwgImtleSIsICJnZXRTZWxlY3Rpb25LZXlzIiwgImZvckVhY2giLCAidW5kZWZpbmVkIiwgIm1hdGNoZWQiLCAibWF0Y2hQYXR0ZXJuIiwgIm1hdGNoZXJUeXBlIiwgImludGVyc2VjdGlvbiIsICJwYXR0ZXJucyIsICJjaGFpbmFibGUiLCAibWF0Y2hlciIsICJtYXRjaCIsICJ2YWx1ZSIsICJzZWxlY3Rpb25zIiwgInNlbGVjdG9yIiwgImtleSIsICJtYXRjaGVkIiwgImV2ZXJ5IiwgInAiLCAibWF0Y2hQYXR0ZXJuIiwgImdldFNlbGVjdGlvbktleXMiLCAiZmxhdE1hcCIsICJtYXRjaGVyVHlwZSIsICJ1bmlvbiIsICJmb3JFYWNoIiwgInVuZGVmaW5lZCIsICJzb21lIiwgIndoZW4iLCAicHJlZGljYXRlIiwgIkJvb2xlYW4iLCAic2VsZWN0IiwgImFyZ3MiLCAicGF0dGVybiIsICJsZW5ndGgiLCAic3ltYm9scyIsICJjb25jYXQiLCAiaXNOdW1iZXIiLCAieCIsICJpc1N0cmluZyIsICJpc0JpZ0ludCIsICJhbnkiLCAic3RyaW5nQ2hhaW5hYmxlIiwgInBhdHRlcm4iLCAiT2JqZWN0IiwgImFzc2lnbiIsICJjaGFpbmFibGUiLCAic3RhcnRzV2l0aCIsICJzdHIiLCAiaW50ZXJzZWN0aW9uIiwgInN0YXJ0IiwgIndoZW4iLCAidmFsdWUiLCAiaXNTdHJpbmciLCAiZW5kc1dpdGgiLCAiZW5kIiwgIm1pbkxlbmd0aCIsICJtaW4iLCAibGVuZ3RoIiwgImxlbiIsICJtYXhMZW5ndGgiLCAibWF4IiwgImluY2x1ZGVzIiwgInN1YnN0ciIsICJyZWdleCIsICJleHByIiwgIkJvb2xlYW4iLCAibWF0Y2giLCAic3RyaW5nIiwgIm51bWJlckNoYWluYWJsZSIsICJiZXR3ZWVuIiwgImlzTnVtYmVyIiwgImx0IiwgImd0IiwgImx0ZSIsICJndGUiLCAiaW50IiwgIk51bWJlciIsICJpc0ludGVnZXIiLCAiZmluaXRlIiwgImlzRmluaXRlIiwgInBvc2l0aXZlIiwgIm5lZ2F0aXZlIiwgIm51bWJlciIsICJiaWdpbnRDaGFpbmFibGUiLCAiYmV0d2VlbkJpZ0ludCIsICJpc0JpZ0ludCIsICJiaWdpbnQiLCAiYm9vbGVhbiIsICJ4IiwgInN5bWJvbCIsICJudWxsaXNoIiwgIm5vbk51bGxhYmxlIiwgIk5vbkV4aGF1c3RpdmVFcnJvciIsICJFcnJvciIsICJjb25zdHJ1Y3RvciIsICJpbnB1dCIsICJkaXNwbGF5ZWRWYWx1ZSIsICJKU09OIiwgInN0cmluZ2lmeSIsICJlIiwgInN1cGVyIiwgInRoaXMiLCAidW5tYXRjaGVkIiwgIm1hdGNoZWQiLCAidmFsdWUiLCAidW5kZWZpbmVkIiwgIm1hdGNoIiwgIk1hdGNoRXhwcmVzc2lvbiIsICJzdGF0ZSIsICJ3aXRoIiwgImFyZ3MiLCAiaGFuZGxlciIsICJsZW5ndGgiLCAicGF0dGVybnMiLCAicHJlZGljYXRlIiwgInB1c2giLCAic2xpY2UiLCAiaGFzU2VsZWN0aW9ucyIsICJzZWxlY3RlZCIsICJzZWxlY3QiLCAia2V5IiwgInNvbWUiLCAicGF0dGVybiIsICJtYXRjaFBhdHRlcm4iLCAic3ltYm9scyIsICJ3aGVuIiwgIkJvb2xlYW4iLCAib3RoZXJ3aXNlIiwgImV4aGF1c3RpdmUiLCAidW5leHBlY3RlZFZhbHVlSGFuZGxlciIsICJkZWZhdWx0Q2F0Y2hlciIsICJydW4iLCAicmV0dXJuVHlwZSIsICJzaGVsbCIsICJzaGVsbE5hbWUiLCAiaW5wdXQiLCAidHJpbW1lZElucHV0IiwgImkiLCAibCIsICJ6IiwgInBhdGgiLCAiam9pbiIsICJleGlzdHNTeW5jIiwgImRpcm5hbWUiLCAiaXNBYnNvbHV0ZSIsICJqb2luIiwgInJlc29sdmUiLCAiYWJzb2x1dGUiLCAiaW5wdXQiLCAicm9vdCIsICJpc0Fic29sdXRlIiwgInJlc29sdmUiLCAidXAiLCAiYmFzZSIsICJvcHRpb25zIiwgInN0b3AiLCAiY3dkIiwgInRtcCIsICJhYnNvbHV0ZSIsICJyb290IiwgInByZXYiLCAiYXJyIiwgImRpcm5hbWUiLCAidXAiLCAibmFtZSIsICJvcHRpb25zIiwgImRpciIsICJ0bXAiLCAic3RhcnQiLCAiam9pbiIsICJleGlzdHNTeW5jIiwgImdldE1vZHVsZVBhdGgiLCAiY3dkIiwgImxvY2tmaWxlIiwgInVwIiwgInJlcG9Sb290IiwgInBhdGgiLCAiZGFnZ2VySnNvbiIsICJzbmFrZVRvQ2FtZWwiLCAic3RyIiwgInJlc3VsdCIsICJwYXJ0cyIsICJpIiwgInBhcnQiLCAiY29udmVydFRvQ2FtZWwiLCAiaW5wdXQiLCAib3V0cHV0IiwgImtleSIsICJjYW1lbENhc2VLZXkiLCAiY2FtZWxUb1NuYWtlIiwgInN0ciIsICJjb252ZXJ0VG9TbmFrZSIsICJpbnB1dCIsICJvdXRwdXQiLCAia2V5IiwgInNuYWtlQ2FzZUtleSJdCn0K
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/constants.ts", "../src/env.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/internals/symbols.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/internals/helpers.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/is-matching.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/patterns.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/errors.ts", "../../../node_modules/.pnpm/ts-pattern@5.6.2/node_modules/ts-pattern/src/match.ts", "../src/shell.ts", "../src/path.ts", "../../../node_modules/.pnpm/empathic@1.0.0/node_modules/empathic/find.mjs", "../../../node_modules/.pnpm/empathic@1.0.0/node_modules/empathic/walk.mjs", "../../../node_modules/.pnpm/empathic@1.0.0/node_modules/empathic/resolve.mjs", "../src/convert/snake-to-camel.ts", "../src/convert/camel-to-snake.ts"],
4
- "sourcesContent": ["/** various constants for dagger modules in my repos */\nexport const constants = {\n\t/** constants for workers-monorepo */\n\tworkersMonorepo: {\n\t\t/** default source ignore list */\n\t\tignore: [\n\t\t\t'**/node_modules/',\n\t\t\t'**/.env',\n\t\t\t'**/.secret',\n\t\t\t'**/Earthfile',\n\t\t\t'**/.wrangler',\n\t\t\t'**/.dev.vars',\n\t\t\t'**/.turbo/',\n\t\t\t'**/dist/',\n\t\t\t'**/dist2/',\n\t\t\t'**/.DS_Store',\n\t\t\t'**/.astro/',\n\t\t\t'**/.next/',\n\t\t\t'*.env',\n\t\t] satisfies string[],\n\t},\n} as const\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncLocalStorage } from 'node:async_hooks'\n\nimport type { Secret } from '@dagger.io/dagger'\n\n/**\n * Structure stored in AsyncLocalStorage, containing both the fully merged\n * environment variables and the set of variables explicitly passed to the\n * current decorated function call.\n */\nexport interface EnvContext {\n\tcurrentParams: Set<string>\n\tmergedEnv: Record<string, Secret | string | undefined>\n}\n\n/**\n * Store for environment variables accessible via AsyncLocalStorage\n */\nexport const envStorage = new AsyncLocalStorage<EnvContext>()\n\n/**\n * Helper to extract parameter names from a function's source code.\n * Note: This approach using Function.toString() can be fragile and might\n * break with code minification or complex function definitions.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function extractParamNames(func: Function): string[] {\n\tconst funcStr = func.toString().replace(/(\\r\\n|\\n|\\r)/gm, '')\n\t// Regex to find parameter list within parentheses, handles various function definition styles\n\tconst paramsMatch =\n\t\tfuncStr.match(/(?:async\\s*)?(?:function\\s*[\\w\\s]*)?\\(([^)]*)\\)/) ??\n\t\tfuncStr.match(/^\\s*(?:async\\s*)?\\(([^)]*)\\)/) // Arrow function support\n\n\tif (!paramsMatch || typeof paramsMatch[1] === 'undefined') {\n\t\tconsole.warn('Could not extract parameter names from function string:', funcStr)\n\t\treturn []\n\t}\n\tconst paramsStr = paramsMatch[1]\n\n\t// Remove comments, default values, and type annotations to isolate names\n\tconst cleanedParamsStr = paramsStr\n\t\t.replace(/\\/\\*.*?\\*\\//g, '') // Remove block comments\n\t\t.replace(/\\/\\/.*?$/gm, '') // Remove line comments\n\n\tif (!cleanedParamsStr.trim()) {\n\t\treturn [] // No parameters\n\t}\n\n\treturn cleanedParamsStr\n\t\t.split(',')\n\t\t.map((param) => {\n\t\t\t// Remove type annotations (e.g., \": Secret\") and default initializers (e.g., \"= 'default'\")\n\t\t\tconst namePart = param.split(/[:=]/)[0]\n\t\t\treturn namePart?.trim() ?? ''\n\t\t})\n\t\t.filter((name) => name.length > 0) // Filter out empty strings from trailing commas etc.\n}\n\n/**\n * Decorator factory that wraps a method to capture its arguments based on\n * extracted parameter names and store them in AsyncLocalStorage.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function ParamsToEnv(): MethodDecorator {\n\treturn function (_target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n\t\tif (typeof descriptor === 'undefined' || typeof descriptor.value !== 'function') {\n\t\t\tthrow new Error(\n\t\t\t\t`@ParamsToEnv decorator can only be applied to methods, not: ${String(propertyKey)}`\n\t\t\t)\n\t\t}\n\t\tconst originalMethod = descriptor.value\n\n\t\tlet paramNames: string[] | null = null // Cache parameter names lazily\n\n\t\tdescriptor.value = function (...args: any[]): any {\n\t\t\tconst parentContext = envStorage.getStore()\n\n\t\t\tif (paramNames === null) {\n\t\t\t\tparamNames = extractParamNames(originalMethod)\n\t\t\t\t// Basic validation: Check if the number of extracted names matches the number of arguments received.\n\t\t\t\t// This might be inaccurate if optional parameters aren't passed.\n\t\t\t\tif (paramNames.length !== args.length && typeof propertyKey === 'string') {\n\t\t\t\t\t// Log a warning but attempt to proceed. The context might be incomplete.\n\t\t\t\t\t// Note: Disabling this for now because optional parameters trigger this warning.\n\t\t\t\t\t// console.warn(\n\t\t\t\t\t// \t`Parameter name extraction/argument count mismatch for ${propertyKey}: ` +\n\t\t\t\t\t// \t\t`Extracted ${paramNames.length} names (${paramNames.join(', ')}), received ${args.length} args. ` +\n\t\t\t\t\t// \t\t`Context in AsyncLocalStorage may be incomplete or incorrect.`\n\t\t\t\t\t// )\n\t\t\t\t\t// Optionally, you could try to pad paramNames or truncate args, but it's risky.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst newEnv: Record<string, Secret | string | undefined> = {}\n\t\t\tconst currentParams = new Set<string>() // Track params for current method\n\t\t\tparamNames?.forEach((name, index) => {\n\t\t\t\t// Check if the param name matches the ENV_VAR pattern\n\t\t\t\tif (/^[A-Z0-9_]+$/.test(name)) {\n\t\t\t\t\t// Add all matching defined parameter names to currentParams\n\t\t\t\t\tcurrentParams.add(name)\n\t\t\t\t\t// Only add to newEnv if argument was actually passed\n\t\t\t\t\tif (index < args.length) {\n\t\t\t\t\t\tnewEnv[name] = args[index]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If paramNames.length > args.length, some names won't get a value, which is expected for optional params.\n\t\t\t})\n\n\t\t\t// merge parent context with new context (new takes precedence)\n\t\t\tconst parentMergedEnv = parentContext?.mergedEnv ?? {}\n\t\t\tconst mergedEnv = { ...parentMergedEnv, ...newEnv }\n\n\t\t\t// Prepare context object for storage\n\t\t\tconst contextToStore: EnvContext = {\n\t\t\t\tcurrentParams,\n\t\t\t\tmergedEnv,\n\t\t\t}\n\n\t\t\t// run the original method within the AsyncLocalStorage context using the merged env\n\t\t\treturn envStorage.run(contextToStore, () => {\n\t\t\t\t// The original method is called with its original arguments\n\t\t\t\treturn originalMethod.apply(this, args)\n\t\t\t})\n\t\t}\n\t}\n}\n", "/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\n// can't be a symbol because this key has to be enumerable.\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n", "/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Reflect.ownKeys(pattern).every((k): boolean => {\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(subPattern, value[k], select)\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n", "import { MatchedValue, Pattern, UnknownProperties } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\n\n/**\n * This constraint allows using additional properties\n * in object patterns. See \"should allow targetting unknown properties\"\n * unit test in `is-matching.test.ts`.\n */\ntype PatternConstraint<T> = T extends readonly any[]\n ? P.Pattern<T>\n : T extends object\n ? P.Pattern<T> & UnknownProperties\n : P.Pattern<T>;\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<const p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<const T, const P extends PatternConstraint<T>>(\n pattern: P,\n value: T\n): value is P.infer<P>;\n\nexport function isMatching<const p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n", "/**\n * The `P` module contains patterns for primitive types, wildcards and\n * other pattern-matching utilities.\n *\n * @module\n */\n\nimport { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n ArrayChainable,\n Variadic,\n NonNullablePattern,\n} from './types/Pattern';\n\nexport type {\n /**\n * `Pattern<T>` is the type of all patterns\n * that can match a value of type `T`.\n */\n Pattern,\n\n /**\n * `unstable_Fn` can be used to created a\n * a Matchable instance – a custom type that\n * can be used as a pattern.\n *\n * @experimental This feature is unstable.\n */\n Fn as unstable_Fn,\n};\n\nexport { matcher };\n\n/**\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * @experimental This feature is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * @experimental This feature is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<pattern> = InvertPattern<NoInfer<pattern>, unknown>;\n\n/**\n * `P.narrow<Input, Pattern>` will narrow the input type to only keep\n * the set of values that are compatible with the provided pattern type.\n *\n * [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#pnarrow)\n *\n * @example\n * type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']\n * const Pattern = ['a', P.union('a', 'b')] as const\n *\n * type Narrowed = P.narrow<Input, typeof Pattern>\n * // ^? ['a', 'a' | 'b']\n */\nexport type narrow<input, pattern extends Pattern<any>> = ExtractPreciseValue<\n input,\n InvertPattern<pattern, input>\n>;\n\nfunction chainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): Chainable<pattern> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<pattern>;\n}\n\nconst variadic = <pattern extends {}>(pattern: pattern): Variadic<pattern> =>\n Object.assign(pattern, {\n [Symbol.iterator](): Iterator<pattern, void, undefined> {\n let i = 0;\n const variadicPattern = Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n const values: IteratorResult<pattern, void>[] = [\n { value: variadicPattern, done: false },\n { done: true, value: undefined },\n ];\n return {\n next: () => values[i++] ?? values.at(-1)!,\n };\n },\n });\n\nfunction arrayChainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): ArrayChainable<pattern> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: pattern): Chainable<SetP<input, pattern>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: pattern]): Chainable<SetP<input, pattern>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.map(keyPattern, valuePattern)` takes a subpattern to match against the\n * key, a subpattern to match against the value and returns a pattern that\n * matches on maps where all elements inside the map match those two\n * subpatterns.\n *\n * [Read `P.map` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#pmap-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.map(P.map(P.string, P.number)) }, (map) => `map's type is Map<string, number>`)\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<AndP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<OrP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<\n input,\n const pattern extends Pattern<input> | UnknownPattern\n>(pattern: pattern): Chainable<NotP<input, pattern>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(\n key: k,\n pattern: pattern\n): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\nfunction isNonNullable(x: unknown): x is {} {\n return x !== null && x !== undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#p_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#p_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.length(len)` is a pattern, matching **strings** with exactly `len` characters.\n *\n * [Read the documentation for `P.string.length` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringlength)\n *\n * @example\n * match(value)\n * .with(P.string.length(10), () => 'strings with length === 10')\n */\nconst length = <const len extends number>(len: len) =>\n when((value) => isString(value) && value.length === len);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): StringChainable<pattern> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n length: (len: number) =>\n stringChainable(intersection(pattern, length(len))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **numbers** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nconst between = <input, const min extends number, const max extends number>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **numbers** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nconst lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **numbers** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nconst gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **numbers** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nconst lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **numbers** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nconst gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int()` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int(), () => 'an integer')\n */\nconst int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nconst finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive()` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive(), () => 'number > 0')\n */\nconst positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative()` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative(), () => 'number < 0')\n */\nconst negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): NumberChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= bigints <= 10')\n */\nconst betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'bigints < 10')\n */\nconst ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'bigints > 10')\n */\nconst gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nconst lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nconst gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive()` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive()` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive(), () => 'bigint > 0')\n */\nconst positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative()` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative()` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative(), () => 'bigint < 0')\n */\nconst negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): BigIntChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#number-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, (x) => `${x} is null or undefined`)\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.nonNullable` is a wildcard pattern, matching everything except **null** or **undefined**.\n *\n * [Read the documentation for `P.nonNullable` on GitHub](https://github.com/gvergnaud/ts-pattern#nonNullable-wildcard)\n *\n * @example\n * .with(P.nonNullable, (x) => `${x} isn't null nor undefined`)\n */\nexport const nonNullable: NonNullablePattern = chainable(when(isNonNullable));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const pattern extends Pattern<input>>(\n pattern: pattern\n): Chainable<GuardP<input, InvertPattern<pattern, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n", "/**\n * Error when the given input value does not match any included pattern\n * and .exhaustive() was specified\n */\nexport class NonExhaustiveError extends Error {\n constructor(public input: unknown) {\n let displayedValue;\n try {\n displayedValue = JSON.stringify(input);\n } catch (e) {\n displayedValue = input;\n }\n super(`Pattern matching error: no pattern matches value ${displayedValue}`);\n }\n}\n", "import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\nimport { NonExhaustiveError } from './errors';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(): output {\n if (this.state.matched) return this.state.value;\n\n throw new NonExhaustiveError(this.input);\n }\n\n run(): output {\n return this.exhaustive();\n }\n\n returnType() {\n return this;\n }\n}\n", "import { match } from 'ts-pattern'\n\n/**\n * Create a new shell helper with the given shell type\n *\n * @param shellName - The name of the shell to use\n *\n * @example\n *\n * ```ts\n * const sh = shell('bash')\n *\n * const con = dag.container()\n * .withExec(sh('echo hello world!'))\n * ```\n */\nexport function shell(shellName: 'sh' | 'bash' | 'zsh') {\n\treturn (input: string | string[]): string[] => {\n\t\tconst inputAr = Array.isArray(input) ? input : [input]\n\t\tconst trimmedInput = inputAr.map((i) =>\n\t\t\ti\n\t\t\t\t.trim()\n\t\t\t\t.split('\\n')\n\t\t\t\t.map((l) => l.trim())\n\t\t\t\t.join('\\n')\n\t\t)\n\n\t\treturn match(shellName)\n\t\t\t.with('sh', () => ['sh', '-c', `set -eu; ${trimmedInput}`])\n\t\t\t.with('bash', () => ['bash', '-c', `set -euo pipefail; ${trimmedInput}`])\n\t\t\t.with('zsh', () => ['zsh', '-c', `set -euo pipefail; ${trimmedInput}`])\n\t\t\t.exhaustive()\n\t}\n}\n", "import path from 'node:path'\nimport { up } from 'empathic/find'\n\nexport function getRepoRoot(cwd?: string): string {\n\tcwd = cwd ?? process.cwd()\n\n\tconst lockfile = up('pnpm-lock.yaml', { cwd })\n\tif (!lockfile) {\n\t\tthrow new Error('could not determine repo root path: unable to find pnpm-lock.yaml')\n\t}\n\n\treturn path.dirname(lockfile)\n}\n\n/**\n * Get the path to the dagger module.\n *\n * Requires `pnpm-lock.yaml` to exist in the repo root.\n *\n * @param cwd - The current working directory. **Default:** `process.cwd()`\n *\n * @returns The path to the dagger module relative to the repo root\n */\nexport function getModulePath(cwd?: string): string {\n\tcwd = cwd ?? process.cwd()\n\n\tconst lockfile = up('pnpm-lock.yaml', { cwd })\n\tif (!lockfile) {\n\t\tthrow new Error('could not determine repo root path: unable to find pnpm-lock.yaml')\n\t}\n\tconst repoRoot = path.dirname(lockfile)\n\n\tconst daggerJson = up('dagger.json', { cwd, stop: repoRoot })\n\tif (!daggerJson) {\n\t\tthrow new Error('could not determine dagger.json path: unable to find dagger.json')\n\t}\n\n\treturn path.relative(repoRoot, path.dirname(daggerJson))\n}\n", "import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport * as walk from \"empathic/walk\";\nexport function up(name, options) {\n\tlet dir, tmp;\n\tlet start = options && options.cwd || \"\";\n\tfor (dir of walk.up(start, options)) {\n\t\ttmp = join(dir, name);\n\t\tif (existsSync(tmp)) return tmp;\n\t}\n}\nexport function any(names, options) {\n\tlet dir, start = options && options.cwd || \"\";\n\tlet j = 0, len = names.length, tmp;\n\tfor (dir of walk.up(start, options)) {\n\t\tfor (j = 0; j < len; j++) {\n\t\t\ttmp = join(dir, names[j]);\n\t\t\tif (existsSync(tmp)) return tmp;\n\t\t}\n\t}\n}\n", "import { dirname } from \"node:path\";\nimport { absolute } from \"empathic/resolve\";\nexport function up(base, options) {\n\tlet { stop, cwd } = options || {};\n\tlet tmp = absolute(base, cwd), root = !stop;\n\tlet prev, arr = [];\n\tif (stop) stop = absolute(stop, cwd);\n\twhile (root || tmp !== stop) {\n\t\tarr.push(tmp);\n\t\ttmp = dirname(prev = tmp);\n\t\tif (tmp === prev) break;\n\t}\n\treturn arr;\n}\n", "import { createRequire } from \"node:module\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nexport function absolute(input, root) {\n\treturn isAbsolute(input) ? input : resolve(root || \".\", input);\n}\nexport function from(root, ident, silent) {\n\ttry {\n\t\tlet r = root instanceof URL || root.startsWith(\"file://\") ? join(fileURLToPath(root), \"noop.js\") : join(absolute(root), \"noop.js\");\n\t\treturn createRequire(r).resolve(ident);\n\t} catch (err) {\n\t\tif (!silent) throw err;\n\t}\n}\nexport function cwd(ident, silent) {\n\treturn from(resolve(), ident, silent);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Helper type to capitalize the first letter of a string literal type.\n * e.g., 'hello' -> 'Hello'\n */\ntype CapitalizeString<S extends string> = S extends `${infer First}${infer Rest}`\n\t? `${Uppercase<First>}${Rest}`\n\t: S\n\n/**\n * Recursively transforms a snake_case string literal type to camelCase.\n * e.g., 'SOME_API_KEY' -> 'someApiKey'\n * 'HELLO_WORLD' -> 'helloWorld'\n * 'WORD' -> 'word'\n */\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n\t? `${Lowercase<T>}${CapitalizeString<SnakeToCamelCase<U>>}` // Lowercase first part, capitalize and recurse on the rest\n\t: Lowercase<S> // Base case: No underscore, just lowercase the whole thing\n\n/**\n * Converts a string from snake_case, UPPER_SNAKE_CASE, PascalCase,\n * or ALL_CAPS to camelCase at runtime.\n * If the string is already camelCase or lowercase, it remains unchanged.\n *\n * @param str The input string in snake_case format.\n * @returns The converted string in camelCase format.\n */\nexport function snakeToCamel(str: string): string {\n\tif (!str) {\n\t\treturn ''\n\t}\n\n\t// Case 1: String contains underscores (snake_case)\n\tif (str.includes('_')) {\n\t\tlet result = ''\n\t\tconst parts = str.split('_')\n\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\tconst part = parts[i]\n\t\t\tif (part) {\n\t\t\t\t// Skip empty parts from multiple underscores\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\t// First non-empty part: lowercase the whole part\n\t\t\t\t\tresult += part.toLowerCase()\n\t\t\t\t} else {\n\t\t\t\t\t// Subsequent non-empty parts: capitalize first letter, rest lowercase\n\t\t\t\t\tresult += part[0]!.toUpperCase() + part.slice(1).toLowerCase()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Handle case like \"_SOME_WORD_\" -> \"someWord\"\n\t\t// If the first character of the original string was '_' and result is empty,\n\t\t// it means the string was only underscores, return ''\n\t\t// If the first part was empty ('_WORD'), result starts lowercase correctly.\n\t\treturn result\n\t}\n\n\t// Case 2: String does NOT contain underscores\n\t// Check if it's ALL_CAPS (allowing for numbers)\n\tconst isAllCaps = /^[A-Z0-9]+$/.test(str)\n\tif (isAllCaps) {\n\t\t// e.g., \"WORD\", \"TOKEN123\" -> \"word\", \"token123\"\n\t\treturn str.toLowerCase()\n\t}\n\n\t// Check if it's PascalCase or already camelCase/lowercase\n\t// If the first letter is already lowercase, assume it's camelCase or lowercase\n\tif (str[0] === str[0]!.toLowerCase()) {\n\t\t// e.g., \"helloWorld\", \"word\" -> stays the same\n\t\treturn str\n\t}\n\n\t// Otherwise, assume it's PascalCase: Lowercase only the first character\n\t// e.g., \"HelloWorld\", \"SomeValue\" -> \"helloWorld\", \"someValue\"\n\treturn str[0]!.toLowerCase() + str.slice(1)\n}\n\n/**\n * Converts an object's keys from snake_case or UPPER_SNAKE_CASE to camelCase.\n * The return type precisely maps the input keys to their camelCase versions.\n *\n * @template T The type of the input object, expected to have string keys.\n * @param input The object with snake_case keys.\n * @returns A new object with the same values but camelCase keys, with a specific inferred type.\n */\nexport function convertToCamel<T extends Record<string, any>>(\n\tinput: T\n): { [K in keyof T as SnakeToCamelCase<K & string>]: T[K] } {\n\tconst output: any = {}\n\n\tfor (const key in input) {\n\t\tif (Object.prototype.hasOwnProperty.call(input, key)) {\n\t\t\tconst camelCaseKey = snakeToCamel(key)\n\t\t\toutput[camelCaseKey] = input[key]\n\t\t}\n\t}\n\n\t// We use a type assertion here. While our runtime logic creates the correct\n\t// shape, TypeScript's analysis within the loop isn't powerful enough to\n\t// automatically verify that 'output' perfectly matches the complex mapped type.\n\t// The return type annotation guarantees the type for the caller.\n\treturn output as { [K in keyof T as SnakeToCamelCase<K & string>]: T[K] }\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// Helper to check if a character is lowercase A-Z\ntype IsLower<C extends string> =\n\tLowercase<C> extends Uppercase<C> ? false : C extends Lowercase<C> ? true : false\n// Helper to check if a character is uppercase A-Z\ntype IsUpper<C extends string> =\n\tLowercase<C> extends Uppercase<C> ? false : C extends Uppercase<C> ? true : false\n// Helper to check if a character is a digit 0-9\ntype IsDigit<C extends string> = C extends `${number}` ? true : false\n\n// Recursive inner helper for CamelToSnakeCase\n// PrevChar tracks the *previous* character from the original string\ntype CamelToSnakeInner<S extends string, PrevChar extends string = ''> =\n\t// Base case: If the input string S is empty, return an empty string.\n\tS extends ''\n\t\t? ''\n\t\t: // Recursive step: If S has content...\n\t\t\tS extends `${infer First}${infer Rest}`\n\t\t\t? // --- Logic based on the 'First' character ---\n\n\t\t\t\t// 1. Is 'First' an uppercase letter?\n\t\t\t\tIsUpper<First> extends true\n\t\t\t\t? // 1a. Was 'PrevChar' lowercase or a digit? (Requires underscore)\n\t\t\t\t\tIsLower<PrevChar> extends true\n\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t: IsDigit<PrevChar> extends true\n\t\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t\t: // 1b. 'PrevChar' was uppercase, symbol, or start. Check for acronym ending.\n\t\t\t\t\t\t\tRest extends `${infer NextChar}${string}` // Look ahead\n\t\t\t\t\t\t\t? IsLower<NextChar> extends true // Is the *next* char lowercase?\n\t\t\t\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // Yes (e.g., API_Key)\n\t\t\t\t\t\t\t\t: `${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // No (e.g., HTTP)\n\t\t\t\t\t\t\t: // 'First' is the last character or followed by non-lowercase.\n\t\t\t\t\t\t\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t: // 2. Is 'First' a digit? (Only checked if not uppercase)\n\t\t\t\t\tIsDigit<First> extends true\n\t\t\t\t\t? // 2a. Was 'PrevChar' a lowercase letter? (Requires underscore)\n\t\t\t\t\t\tIsLower<PrevChar> extends true\n\t\t\t\t\t\t? `_${First}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t\t: // 'PrevChar' was not lowercase (digit, uppercase, symbol, start)\n\t\t\t\t\t\t\t`${First}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t: // 3. 'First' must be a lowercase letter or a symbol.\n\t\t\t\t\t\t// (Symbols are handled like lowercase here - no underscore needed before them)\n\t\t\t\t\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // Uppercase letter, append symbol directly\n\t\t\t: // This case should technically not be reachable if S is not '', but included for completeness.\n\t\t\t\t''\n\n/**\n * Type helper to convert a camelCase/PascalCase string literal type\n * to an UPPER_SNAKE_CASE string literal type. Handles common cases\n * including transitions from lower to upper, letters to digits, and basic acronyms.\n *\n * Examples:\n * 'userId' -> 'USER_ID'\n * 'userName' -> 'USER_NAME'\n * 'isActive' -> 'IS_ACTIVE'\n * 'APIKey' -> 'API_KEY'\n * 'version10' -> 'VERSION_10'\n * 'apiV2Client' -> 'API_V2_CLIENT'\n */\ntype CamelToSnakeCase<S extends string> = S extends `${infer First}${infer Rest}`\n\t? // Uppercase the very first character, then process the rest using the inner helper\n\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t: // Handle single character or empty string\n\t\tUppercase<S>\n\n/**\n * Converts a camelCase or PascalCase string to UPPER_SNAKE_CASE.\n * Handles acronyms and numbers within the string.\n *\n * **Examples:**\n * ```\n * 'helloWorld' -> 'HELLO_WORLD'\n * 'HelloWorld' -> 'HELLO_WORLD'\n * 'someAPIKey' -> 'SOME_API_KEY'\n * 'getHttpResponseCode' -> 'GET_HTTP_RESPONSE_CODE'\n * 'version10' -> 'VERSION_10' // Fixed\n * 'version10Alpha' -> 'VERSION_10_ALPHA' // Fixed\n * 'apiV2Client' -> 'API_V2_CLIENT'\n * 'releaseV10' -> 'RELEASE_V10'\n * 'version2Data' -> 'VERSION_2_DATA' // Fixed\n * 'word' -> 'WORD'\n *```\n * @param str The input string in camelCase or PascalCase format.\n * @returns The converted string in UPPER_SNAKE_CASE format.\n */\nexport function camelToSnake(str: string): string {\n\tif (!str) {\n\t\treturn ''\n\t}\n\n\t// The sequence matters:\n\tconst result = str\n\t\t// 1. Add _ before an uppercase letter that is followed by a lowercase letter,\n\t\t// but only if the uppercase letter is not the start of the string and\n\t\t// is preceded by another uppercase letter (handles acronyms like APIKey -> API_Key).\n\t\t.replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n\t\t// 2. Add _ before an uppercase letter that is preceded by a lowercase letter or a digit.\n\t\t// (handles helloWorld -> hello_World, version10Update -> version10_Update, apiV2Client -> api_V2Client)\n\t\t.replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n\t\t// 3. Add _ between a lowercase letter and a number.\n\t\t// (handles version10 -> version_10, but NOT V10 -> V_10 because V is uppercase)\n\t\t.replace(/([a-z])(\\d)/g, '$1_$2')\n\n\t// Convert the entire result to uppercase\n\treturn result.toUpperCase()\n}\n\n/**\n * Converts an object's keys from camelCase/PascalCase to UPPER_SNAKE_CASE.\n * Provides compile-time type safety for the converted keys based on common patterns.\n *\n * @template T The type of the input object.\n * @param input The object with camelCase/PascalCase keys.\n * @returns A new object with the same values but UPPER_SNAKE_CASE keys,\n * with an inferred type reflecting the key transformation.\n */\nexport function convertToSnake<T extends Record<string, any>>(\n\tinput: T\n\t// Apply the mapped type with key remapping using the type helper\n): { [K in keyof T as CamelToSnakeCase<K & string>]: T[K] } {\n\tconst output: any = {} // Initialize as 'any' or '{}'\n\n\tfor (const key in input) {\n\t\tif (Object.prototype.hasOwnProperty.call(input, key)) {\n\t\t\tconst snakeCaseKey = camelToSnake(key) // Runtime conversion\n\t\t\toutput[snakeCaseKey] = input[key]\n\t\t}\n\t}\n\n\t// Type assertion: We trust the runtime `camelToSnake` logic produces keys\n\t// matching the structure defined by the `CamelToSnakeCase` type helper.\n\t// This is needed because TS can't perfectly verify the runtime logic\n\t// against the complex type-level logic for all possible inputs.\n\treturn output as { [K in keyof T as CamelToSnakeCase<K & string>]: T[K] }\n}\n"],
5
- "mappings": "AACO,IAAMA,EAAY,CAExB,gBAAiB,CAEhB,OAAQ,CACP,mBACA,UACA,aACA,eACA,eACA,eACA,aACA,WACA,YACA,eACA,aACA,YACA,OACD,CACD,CACD,ECpBA,OAAS,qBAAAC,MAAyB,mBAiB3B,IAAMC,EAAa,IAAID,EAQvB,SAASE,EAAkBC,EAA0B,CAC3D,IAAMC,EAAUD,EAAK,SAAS,EAAE,QAAQ,iBAAkB,EAAE,EAEtDE,EACLD,EAAQ,MAAM,iDAAiD,GAC/DA,EAAQ,MAAM,8BAA8B,EAE7C,GAAI,CAACC,GAAe,OAAOA,EAAY,CAAC,EAAM,IAC7C,eAAQ,KAAK,0DAA2DD,CAAO,EACxE,CAAC,EAKT,IAAME,EAHYD,EAAY,CAAC,EAI7B,QAAQ,eAAgB,EAAE,EAC1B,QAAQ,aAAc,EAAE,EAE1B,OAAKC,EAAiB,KAAK,EAIpBA,EACL,MAAM,GAAG,EACT,IAAKC,GAEYA,EAAM,MAAM,MAAM,EAAE,CAAC,GACrB,KAAK,GAAK,EAC3B,EACA,OAAQC,GAASA,EAAK,OAAS,CAAC,EAV1B,CAAC,CAWV,CAOO,SAASC,GAA+B,CAC9C,OAAO,SAAUC,EAAcC,EAA8BC,EAAgC,CAC5F,GAAI,OAAOA,EAAe,KAAe,OAAOA,EAAW,OAAU,WACpE,MAAM,IAAI,MACT,+DAA+D,OAAOD,CAAW,CAAC,EACnF,EAED,IAAME,EAAiBD,EAAW,MAE9BE,EAA8B,KAElCF,EAAW,MAAQ,YAAaG,EAAkB,CACjD,IAAMC,EAAgBf,EAAW,SAAS,EAEtCa,IAAe,OAClBA,EAAaZ,EAAkBW,CAAc,EAGzCC,EAAW,OAAWC,EAAK,QAYhC,IAAME,EAAsD,CAAC,EACvDC,EAAgB,IAAI,IAC1BJ,GAAY,QAAQ,CAACN,EAAMW,IAAU,CAEhC,eAAe,KAAKX,CAAI,IAE3BU,EAAc,IAAIV,CAAI,EAElBW,EAAQJ,EAAK,SAChBE,EAAOT,CAAI,EAAIO,EAAKI,CAAK,GAI5B,CAAC,EAID,IAAMC,EAAY,CAAE,GADIJ,GAAe,WAAa,CAAC,EACb,GAAGC,CAAO,EAG5CI,EAA6B,CAClC,cAAAH,EACA,UAAAE,CACD,EAGA,OAAOnB,EAAW,IAAIoB,EAAgB,IAE9BR,EAAe,MAAM,KAAME,CAAI,CACtC,CACF,CACD,CACD,CC9GO,IAAMO,EAAUC,OAAOC,IAAI,qBAAA,EAMrBC,EAAaF,OAAOC,IAAI,wBAAA,EAIxBE,EAAqB,mCCdrBC,EAAYC,GACvBC,GAAQD,GAA0B,OAAVA,GAAU,UAGvBE,EACXC,GAEgBA,GAAAA,CAAAA,CAAAA,EACYC,CAAAA,EAYjBC,EAAeA,CAC1BC,EACAN,EACAO,IAAAA,CAEA,GAAIL,EAAUI,CAAAA,EAAU,CACtB,IAAMZ,EAAUY,EAAQF,CAAAA,EAAAA,EAAAA,CAClBI,QAAEA,EAAOC,WAAEA,CAAAA,EAAef,EAAQgB,MAAMV,CAAAA,EAI9C,OAHIQ,GAAWC,GACbE,OAAOC,KAAKH,CAAAA,EAAYI,QAASC,GAAQP,EAAOO,EAAKL,EAAWK,CAAAA,CAAAA,CAAAA,EAE3DN,CACT,CAEA,GAAIT,EAASO,CAAAA,EAAU,CACrB,GAAA,CAAKP,EAASC,CAAAA,EAAQ,MAAA,GAGtB,GAAIe,MAAMC,QAAQV,CAAAA,EAAU,CAC1B,GAAA,CAAKS,MAAMC,QAAQhB,CAAAA,EAAQ,MAAA,GAC3B,IAAIiB,EAAgB,CAAA,EAChBC,EAAc,CAAA,EACdC,EAAiC,CAAA,EAErC,QAAWC,KAAKd,EAAQM,KAAAA,EAAQ,CAC9B,IAAMS,EAAaf,EAAQc,CAAAA,EACvBlB,EAAUmB,CAAAA,GAAeA,EAAWjB,CAAAA,EACtCe,EAAiBG,KAAKD,CAAAA,EACbF,EAAiBI,OAC1BL,EAAYI,KAAKD,CAAAA,EAEjBJ,EAAcK,KAAKD,CAAAA,CAEvB,CAEA,GAAIF,EAAiBI,OAAQ,CAC3B,GAAIJ,EAAiBI,OAAS,EAC5B,MAAU,IAAAC,MACR,0FAAA,EAIJ,GAAIxB,EAAMuB,OAASN,EAAcM,OAASL,EAAYK,OACpD,MAAA,GAGF,IAAME,EAAczB,EAAM0B,MAAM,EAAGT,EAAcM,MAAAA,EAC3CI,EACJT,EAAYK,SAAW,EAAI,CAAA,EAAKvB,EAAM0B,MAAAA,CAAOR,EAAYK,MAAAA,EACrDK,EAAe5B,EAAM0B,MACzBT,EAAcM,OACdL,EAAYK,SAAW,EAAIM,IAAAA,CAAYX,EAAYK,MAAAA,EAGrD,OACEN,EAAca,MAAM,CAACC,EAAYX,IAC/Bf,EAAa0B,EAAYN,EAAYL,CAAAA,EAAIb,CAAAA,CAAAA,GAE3CW,EAAYY,MAAM,CAACC,EAAYX,IAC7Bf,EAAa0B,EAAYJ,EAAUP,CAAAA,EAAIb,CAAAA,CAAAA,IAExCY,EAAiBI,SAAW,GAEzBlB,EAAac,EAAiB,CAAA,EAAIS,EAAcrB,CAAAA,EAExD,CAEA,OAAOD,EAAQiB,SAAWvB,EAAMuB,QAC5BjB,EAAQwB,MAAM,CAACC,EAAYX,IACzBf,EAAa0B,EAAY/B,EAAMoB,CAAAA,EAAIb,CAAAA,CAAAA,CAG3C,CAEA,OAAOyB,QAAQC,QAAQ3B,CAAAA,EAASwB,MAAOI,GAAAA,CACrC,IAAMH,EAAazB,EAAQ4B,CAAAA,EAE3B,OACGA,KAAKlC,GAnFLE,EAFPC,EAqFuC4B,CAAAA,GAnFhB5B,EAAEC,CAAAA,EAAAA,EAAmB+B,cAAgB,aAoFtD9B,EAAa0B,EAAY/B,EAAMkC,CAAAA,EAAI3B,CAAAA,EAtFzCJ,IAAAA,CAsF+C,CAAA,CAG/C,CAEA,OAAOQ,OAAOyB,GAAGpC,EAAOM,CAAAA,CAAO,EAIpB+B,EAAoB/B,GAAAA,CAAAA,IAELgC,EAAAC,EAAAC,EAD1B,OAAIzC,EAASO,CAAAA,EACPJ,EAAUI,CAAAA,GACZgC,GAAAC,GAAOC,EAAAlC,EAAQF,CAAAA,EAAAA,GAAmBiC,mBAAgB,KAAhBA,OAA3BE,EAAAE,KAAAD,CAAAA,IAA+CF,KAAAA,EAAI,CAAA,EAExDvB,MAAMC,QAAQV,CAAAA,EAAiBoC,EAAQpC,EAAS+B,CAAAA,EAC7CK,EAAQ/B,OAAOgC,OAAOrC,CAAAA,EAAU+B,CAAAA,EAElC,CAAA,CAAA,EAIIK,EAAUA,CACrBE,EACAC,IACQD,EAAGE,OAAY,CAACC,EAAK5C,IAAM4C,EAAIC,OAAOH,EAAE1C,CAAAA,CAAAA,EAAK,CAAA,CAAA,EEAvD,SAAS8C,EACPC,EAAAA,CAEA,OAAOC,OAAOC,OAAOF,EAAS,CAC5BG,SAAUA,IAAMA,EAASH,CAAAA,EACzBI,IAAMC,GAAYC,EAAaN,EAASK,CAAAA,EACxCE,GAAKF,GAAYG,EAAMR,EAASK,CAAAA,EAChCI,OAASC,GACPA,IADOA,OACaD,EAAOT,CAAAA,EAAWS,EAAOC,EAAKV,CAAAA,CAAAA,CAAAA,CAExD,CAyCgB,SAAAW,EAGdC,EAAAA,CACA,OAAOC,EAAU,CACfC,CAACA,CAAAA,EAAO,KACC,CACLC,MAAsBC,GAAAA,CACpB,IAAIC,EAAwC,CAAA,EACtCC,EAAWA,CAACC,EAAaH,IAAAA,CAC7BC,EAAWE,CAAAA,EAAOH,CACpB,EACA,OAAIA,IAAJ,QACEI,EAAiBR,CAAAA,EAASS,QAASF,GACjCD,EAASC,EAAAA,MAAKG,CAAAA,EAET,CAAEC,QAAAA,GAAeN,WAAAA,CAAAA,GAGnB,CAAEM,QADOC,EAAaZ,EAASI,EAAOE,CAAAA,EAC3BD,WAAAA,CAAAA,CAAAA,EAEpBG,iBAAkBA,IAAMA,EAAiBR,CAAAA,EACzCa,YAAa,UAAA,EAAA,CAAA,CAIrB,CA6NgB,SAAAC,KAGXC,EAAAA,CACH,OAAOC,EAAU,CACfC,CAACA,CAAAA,EAAU,KAAA,CACTC,MAAQC,GAAAA,CACN,IAAIC,EAAwC,CAAA,EACtCC,EAAWA,CAACC,EAAaH,IAAAA,CAC7BC,EAAWE,CAAAA,EAAOH,CAAAA,EAKpB,MAAO,CAAEI,QAHQR,EAAuCS,MAAOC,GAC7DC,EAAaD,EAAGN,EAAOE,CAAAA,CAAAA,EAEPD,WAAAA,CAAAA,CAAAA,EAEpBO,iBAAkBA,IAChBC,EAAQb,EAAuCY,CAAAA,EACjDE,YAAa,KAAA,EAAA,CAAA,CAGnB,CAegB,SAAAC,KAGXf,EAAAA,CACH,OAAOC,EAAU,CACfC,CAACA,CAAAA,EAAU,KAAA,CACTC,MAAsBC,GAAAA,CACpB,IAAIC,EAAwC,CAAA,EACtCC,EAAWA,CAACC,EAAaH,IAAAA,CAC7BC,EAAWE,CAAAA,EAAOH,CACpB,EAQA,OAPAS,EACEb,EACAY,CAAAA,EACAI,QAAST,GAAQD,EAASC,EAAAA,MAAKU,CAAAA,EAI1B,CAAET,QAHQR,EAAuCkB,KAAMR,GAC5DC,EAAaD,EAAGN,EAAOE,CAAAA,CAAAA,EAEPD,WAAAA,CAAAA,CAAAA,EAEpBO,iBAAkBA,IAChBC,EAAQb,EAAuCY,CAAAA,EACjDE,YAAa,IAAA,EAAA,CAAA,CAGnB,CAiDM,SAAUK,EACdC,EAAAA,CAKA,MAAO,CACLlB,CAACA,CAAAA,EAAU,KAAA,CACTC,MAAsBC,IAA2B,CAC/CI,QAASa,EAAQD,EAAUhB,CAAAA,CAAAA,EAAAA,EAAAA,CAInC,CAmCgB,SAAAkB,KACXC,EAAAA,CAEH,IAAMhB,EACe,OAAZgB,EAAK,CAAA,GAAO,SAAWA,EAAK,CAAA,EAAA,OAC/BC,EACJD,EAAKE,SAAW,EACZF,EAAK,CAAA,EACc,OAAZA,EAAK,CAAA,GAAO,SAAP,OAEZA,EAAK,CAAA,EACX,OAAOtB,EAAU,CACfC,CAACA,CAAAA,EAAQ,KACA,CACLC,MAAQC,GAAAA,CACN,IAAIC,EAAsC,CACxC,CAACE,GAAOmB,CAAAA,EAA6BtB,CAAAA,EAKvC,MAAO,CACLI,QACEgB,IADFhB,QAGMG,EAAaa,EAASpB,EAPbE,CAACC,EAAaH,IAAAA,CAC7BC,EAAWE,CAAAA,EAAOH,CAAAA,CAAAA,EAOlBC,WAAYA,CAAAA,CAAAA,EAGhBO,iBAAkBA,IAChB,CAACL,GAAOmB,CAAAA,EAA4BC,OAClCH,IADkCG,OACV,CAAA,EAAKf,EAAiBY,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,CAK1D,CAMA,SAASI,EAAYC,EAAAA,CACnB,OAAoB,OAANA,GAAM,QACtB,CAEA,SAASC,EAAYD,EAAAA,CACnB,OAAoB,OAANA,GAAM,QACtB,CAMA,SAASE,EAAYF,EAAAA,CACnB,OAAoB,OAANA,GAAM,QACtB,CA8BO,IAAMG,GAAkB/B,EAAUkB,EAhDzC,SAAmBU,EAAAA,CACjB,MAAA,EACF,CAAA,CAAA,EA8CO,IA2GDI,EACJC,GAEAC,OAAOC,OAAOC,EAAUH,CAAAA,EAAU,CAChCI,WAAaC,GAAAA,CACXN,OAAAA,EAAgBO,EAAaN,GAvFjCO,EAuFqDF,EArFrDG,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAML,WAAWG,CAAAA,CAAAA,EAAAA,CAAAA,EAFpDA,IAAAA,CAuF2D,EACzDI,SAAWN,GAAAA,CACTN,OAAAA,EAAgBO,EAAaN,GA3EjCY,EA2EmDP,EAzEnDG,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAME,SAASC,CAAAA,CAAAA,EAAAA,CAAAA,EAFlDA,IAAAA,CA2EyD,EACvDC,UAAYC,GACVf,EAAgBO,EAAaN,GAhEUc,GAC3CN,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAMM,QAAUD,CAAAA,GA+DCA,CAAAA,CAAAA,CAAAA,EAClDC,OAASC,GACPjB,EAAgBO,EAAaN,GAtDOgB,GACxCR,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAMM,SAAWC,CAAAA,GAqDHA,CAAAA,CAAAA,CAAAA,EAC/CC,UAAYC,GACVnB,EAAgBO,EAAaN,GA5CUkB,GAC3CV,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAMM,QAAUG,CAAAA,GA2CCA,CAAAA,CAAAA,CAAAA,EAClDC,SAAWd,GAAAA,CACTN,OAAAA,EAAgBO,EAAaN,GAjCjCoB,EAiCmDf,EA/BnDG,EAAMC,GAAUC,EAASD,CAAAA,GAAUA,EAAMU,SAASC,CAAAA,CAAAA,EAAAA,CAAAA,EAFlDA,IAAAA,CAiCyD,EACvDC,MAAQhB,GAAAA,CAAgBN,OAAAA,EAAgBO,EAAaN,GApBvDsB,EAoBsEjB,EAlBtEG,EAAMC,GAAUC,EAASD,CAAAA,GAAUc,EAAQd,EAAMe,MAAMF,CAAAA,CAAAA,EAAAA,CAAAA,EAFvDA,IAAAA,CAqBC,CAAA,CAAA,EAWUG,GAAwB1B,EAAgBS,EAAKE,CAAAA,CAAAA,EA0HpDgB,EACJ1B,GAEAC,OAAOC,OAAOC,EAAUH,CAAAA,EAAU,CAChC2B,QAASA,CAACb,EAAaI,IACrBQ,EAAgBpB,EAAaN,GAnHnB2B,CACdb,EACAI,IAEAV,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUK,GAAOL,GAASS,GAAOT,CAAAA,GA+GRK,EAAKI,CAAAA,CAAAA,CAAAA,EACrDW,GAAKX,GAAgBQ,EAAgBpB,EAAaN,GApGpDkB,GAEAV,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,EAAQS,CAAAA,GAkGqBA,CAAAA,CAAAA,CAAAA,EAC9DY,GAAKhB,GAAgBY,EAAgBpB,EAAaN,GAvFpDc,GAEAN,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,EAAQK,CAAAA,GAqFqBA,CAAAA,CAAAA,CAAAA,EAC9DiB,IAAMb,GAAgBQ,EAAgBpB,EAAaN,GA1ErDkB,GAEAV,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,GAASS,CAAAA,GAwEsBA,CAAAA,CAAAA,CAAAA,EAChEc,IAAMlB,GAAgBY,EAAgBpB,EAAaN,GA7DrDc,GAEAN,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,GAASK,CAAAA,GA2DsBA,CAAAA,CAAAA,CAAAA,EAChEmB,IAAKA,IAAMP,EAAgBpB,EAAaN,EAhD1CQ,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUyB,OAAOC,UAAU1B,CAAAA,CAAAA,CAAAA,CAAAA,EAiDlD2B,OAAQA,IAAMV,EAAgBpB,EAAaN,EArC7CQ,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUyB,OAAOG,SAAS5B,CAAAA,CAAAA,CAAAA,CAAAA,EAsCjD6B,SAAUA,IAAMZ,EAAgBpB,EAAaN,EA1B/CQ,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,EAAQ,CAAA,CAAA,CAAA,EA2BzC8B,SAAUA,IAAMb,EAAgBpB,EAAaN,EAf/CQ,EAAMC,GAAUmB,EAASnB,CAAAA,GAAUA,EAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,EA2BhC+B,GAAwBd,EAAgBlB,EAAKoB,CAAAA,CAAAA,EAsGpDa,EACJzC,GAEAC,OAAOC,OAAOC,EAAUH,CAAAA,EAAU,CAChC2B,QAASA,CAACb,EAAaI,IACrBuB,EAAgBnC,EAAaN,GA/Fb0C,CAKpB5B,EACAI,IAEAV,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUK,GAAOL,GAASS,GAAOT,CAAAA,GAuFFK,EAAKI,CAAAA,CAAAA,CAAAA,EAC3DW,GAAKX,GAAgBuB,EAAgBnC,EAAaN,GA5EpDkB,GAEAV,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,EAAQS,CAAAA,GA0E2BA,CAAAA,CAAAA,CAAAA,EACpEY,GAAKhB,GAAgB2B,EAAgBnC,EAAaN,GA/DpDc,GAEAN,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,EAAQK,CAAAA,GA6D2BA,CAAAA,CAAAA,CAAAA,EACpEiB,IAAMb,GACJuB,EAAgBnC,EAAaN,GAnDjCkB,GAEAV,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,GAASS,CAAAA,GAiDQA,CAAAA,CAAAA,CAAAA,EAClDc,IAAMlB,GACJ2B,EAAgBnC,EAAaN,GAvCjCc,GAEAN,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,GAASK,CAAAA,GAqCQA,CAAAA,CAAAA,CAAAA,EAClDwB,SAAUA,IAAMG,EAAgBnC,EAAaN,EA1B/CQ,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,EAAQ,CAAA,CAAA,CAAA,EA2BzC8B,SAAUA,IAAME,EAAgBnC,EAAaN,EAf/CQ,EAAMC,GAAUkC,EAASlC,CAAAA,GAAUA,EAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,EA0BhCmC,GAAwBH,EAAgBjC,EAAKmC,CAAAA,CAAAA,EAU7CE,GAA0B1C,EAAUK,EAtcjD,SAAsBsC,EAAAA,CACpB,OAAoB,OAANA,GAAM,SACtB,CAAA,CAAA,EA8caC,GAAwB5C,EAAUK,EAxc/C,SAAqBsC,EAAAA,CACnB,OAAoB,OAANA,GAAM,QACtB,CAAA,CAAA,EAgdaE,GAA0B7C,EAAUK,EA9cjD,SAAsBsC,EAAAA,CACpB,OAAOA,GAAAA,IACT,CAAA,CAAA,EAsdaG,GAAkC9C,EAAUK,EApdzD,SAAuBsC,EAAAA,CACrB,OAAOA,GAAAA,IACT,CAAA,CAAA,EC9oBM,IAAOI,EAAP,cAAkCC,KAAAA,CACtCC,YAAmBC,EAAAA,CACjB,IAAIC,EACJ,GAAA,CACEA,EAAiBC,KAAKC,UAAUH,CAAAA,CAClC,MAASI,CACPH,EAAiBD,CACnB,CACAK,MAAM,oDAAoDJ,CAAAA,EAAAA,EAAkBK,KAP3DN,MAAAA,OAAAM,KAAKN,MAALA,CAQnB,CAAA,ECHIO,EAA+B,CACnCC,QAAAA,GACAC,MAAAA,MAAOC,EAmBO,SAAAC,EACdF,EAAAA,CAEA,OAAO,IAAIG,EAAgBH,EAAOF,CAAAA,CACpC,CAWA,IAAMK,EAAN,MAAMA,CAAAA,CACJb,YAAoBC,EAAsBa,EAAAA,CAAyBP,KAA/CN,MAAAA,OAAAM,KAAsBO,MAAAA,OAAtBP,KAAKN,MAALA,EAAsBM,KAAKO,MAALA,CAA4B,CAEtEC,QAAQC,EAAAA,CACN,GAAIT,KAAKO,MAAML,QAAS,OAAA,KAExB,IAAMQ,EACJD,EAAKA,EAAKE,OAAS,CAAA,EAEfC,EAA6B,CAACH,EAAK,CAAA,CAAA,EACrCI,EAEAJ,EAAKE,SAAW,GAAwB,OAAZF,EAAK,CAAA,GAAO,WAE1CI,EAAYJ,EAAK,CAAA,EACRA,EAAKE,OAAS,GAEvBC,EAASE,KAAAA,GAAQL,EAAKM,MAAM,EAAGN,EAAKE,OAAS,CAAA,CAAA,EAG/C,IAAIK,EAAAA,GACAC,EAAoC,CAAA,EAClCC,EAASA,CAACC,EAAahB,IAAAA,CAC3Ba,EAAAA,GACAC,EAASE,CAAAA,EAAOhB,CAClB,EAYMI,EAAAA,CATJK,EAASQ,KAAMC,GAAYC,EAAaD,EAASrB,KAAKN,MAAOwB,CAAAA,CAAAA,GAC5DL,GAAAA,CAAoBA,EAAUb,KAAKN,KAAAA,EAalCO,EAJA,CACEC,QAAAA,GACAC,MAAOO,EATMM,EACfO,KAA8BN,EAC5BA,EAASM,CAAAA,EACTN,EACFjB,KAAKN,MAKwBM,KAAKN,KAAAA,CAAAA,EAItC,OAAW,IAAAY,EAAgBN,KAAKN,MAAOa,CAAAA,CACzC,CAEAiB,KACEX,EACAH,EAAAA,CAEA,GAAIV,KAAKO,MAAML,QAAS,OAAWF,KAEnC,IAAME,EAAUuB,EAAQZ,EAAUb,KAAKN,KAAAA,EAEvC,OAAO,IAAIY,EACTN,KAAKN,MACLQ,EACI,CAAEA,QAAAA,GAAeC,MAAOO,EAAQV,KAAKN,MAAOM,KAAKN,KAAAA,CAAAA,EACjDO,CAAAA,CAER,CAEAyB,UAAUhB,EAAAA,CACR,OAAIV,KAAKO,MAAML,QAAgBF,KAAKO,MAAMJ,MACnCO,EAAQV,KAAKN,KAAAA,CACtB,CAEAiC,YAAAA,CACE,GAAI3B,KAAKO,MAAML,QAAS,OAAWF,KAACO,MAAMJ,MAE1C,MAAU,IAAAZ,EAAmBS,KAAKN,KAAAA,CACpC,CAEAkC,KAAAA,CACE,OAAW5B,KAAC2B,WAAAA,CACd,CAEAE,YAAAA,CACE,OAAO7B,IACT,CAAA,EC9GK,SAAS8B,EAAMC,EAAkC,CACvD,OAAQC,GAAuC,CAE9C,IAAMC,GADU,MAAM,QAAQD,CAAK,EAAIA,EAAQ,CAACA,CAAK,GACxB,IAAKE,GACjCA,EACE,KAAK,EACL,MAAM;AAAA,CAAI,EACV,IAAKC,GAAMA,EAAE,KAAK,CAAC,EACnB,KAAK;AAAA,CAAI,CACZ,EAEA,OAAOC,EAAML,CAAS,EACpB,KAAK,KAAM,IAAM,CAAC,KAAM,KAAM,YAAYE,CAAY,EAAE,CAAC,EACzD,KAAK,OAAQ,IAAM,CAAC,OAAQ,KAAM,sBAAsBA,CAAY,EAAE,CAAC,EACvE,KAAK,MAAO,IAAM,CAAC,MAAO,KAAM,sBAAsBA,CAAY,EAAE,CAAC,EACrE,WAAW,CACd,CACD,CCjCA,OAAOI,MAAU,YCAjB,OAAS,QAAAC,MAAY,YACrB,OAAS,cAAAC,MAAkB,UCD3B,OAAS,WAAAC,MAAe,YCCxB,OAAS,cAAAC,EAAY,QAAAC,GAAM,WAAAC,MAAe,YAEnC,SAASC,EAASC,EAAOC,EAAM,CACrC,OAAOC,EAAWF,CAAK,EAAIA,EAAQG,EAAQF,GAAQ,IAAKD,CAAK,CAC9D,CDHO,SAASI,EAAGC,EAAMC,EAAS,CACjC,GAAI,CAAE,KAAAC,EAAM,IAAAC,CAAI,EAAIF,GAAW,CAAC,EAC5BG,EAAMC,EAASL,EAAMG,CAAG,EAAGG,EAAO,CAACJ,EACnCK,EAAMC,EAAM,CAAC,EAEjB,IADIN,IAAMA,EAAOG,EAASH,EAAMC,CAAG,IAC5BG,GAAQF,IAAQF,KACtBM,EAAI,KAAKJ,CAAG,EACZA,EAAMK,EAAQF,EAAOH,CAAG,EACpBA,IAAQG,IAAZ,CAED,OAAOC,CACR,CDVO,SAASE,EAAGC,EAAMC,EAAS,CACjC,IAAIC,EAAKC,EACLC,EAAQH,GAAWA,EAAQ,KAAO,GACtC,IAAKC,KAAYH,EAAGK,EAAOH,CAAO,EAEjC,GADAE,EAAME,EAAKH,EAAKF,CAAI,EAChBM,EAAWH,CAAG,EAAG,OAAOA,CAE9B,CDaO,SAASI,GAAcC,EAAsB,CACnDA,EAAMA,GAAO,QAAQ,IAAI,EAEzB,IAAMC,EAAWC,EAAG,iBAAkB,CAAE,IAAAF,CAAI,CAAC,EAC7C,GAAI,CAACC,EACJ,MAAM,IAAI,MAAM,mEAAmE,EAEpF,IAAME,EAAWC,EAAK,QAAQH,CAAQ,EAEhCI,EAAaH,EAAG,cAAe,CAAE,IAAAF,EAAK,KAAMG,CAAS,CAAC,EAC5D,GAAI,CAACE,EACJ,MAAM,IAAI,MAAM,kEAAkE,EAGnF,OAAOD,EAAK,SAASD,EAAUC,EAAK,QAAQC,CAAU,CAAC,CACxD,CIVO,SAASC,GAAaC,EAAqB,CACjD,GAAI,CAACA,EACJ,MAAO,GAIR,GAAIA,EAAI,SAAS,GAAG,EAAG,CACtB,IAAIC,EAAS,GACPC,EAAQF,EAAI,MAAM,GAAG,EAC3B,QAASG,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAK,CACtC,IAAMC,EAAOF,EAAMC,CAAC,EAChBC,IAECH,EAAO,SAAW,EAErBA,GAAUG,EAAK,YAAY,EAG3BH,GAAUG,EAAK,CAAC,EAAG,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,EAGhE,CAKA,OAAOH,CACR,CAKA,MADkB,cAAc,KAAKD,CAAG,EAGhCA,EAAI,YAAY,EAKpBA,EAAI,CAAC,IAAMA,EAAI,CAAC,EAAG,YAAY,EAE3BA,EAKDA,EAAI,CAAC,EAAG,YAAY,EAAIA,EAAI,MAAM,CAAC,CAC3C,CAUO,SAASK,GACfC,EAC2D,CAC3D,IAAMC,EAAc,CAAC,EAErB,QAAWC,KAAOF,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAOE,CAAG,EAAG,CACrD,IAAMC,EAAeV,GAAaS,CAAG,EACrCD,EAAOE,CAAY,EAAIH,EAAME,CAAG,CACjC,CAOD,OAAOD,CACR,CCfO,SAASG,GAAaC,EAAqB,CACjD,OAAKA,EAKUA,EAIb,QAAQ,uBAAwB,OAAO,EAGvC,QAAQ,oBAAqB,OAAO,EAGpC,QAAQ,eAAgB,OAAO,EAGnB,YAAY,EAjBlB,EAkBT,CAWO,SAASC,GACfC,EAE2D,CAC3D,IAAMC,EAAc,CAAC,EAErB,QAAWC,KAAOF,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAOE,CAAG,EAAG,CACrD,IAAMC,EAAeN,GAAaK,CAAG,EACrCD,EAAOE,CAAY,EAAIH,EAAME,CAAG,CACjC,CAOD,OAAOD,CACR",
6
- "names": ["constants", "AsyncLocalStorage", "envStorage", "extractParamNames", "func", "funcStr", "paramsMatch", "cleanedParamsStr", "param", "name", "ParamsToEnv", "_target", "propertyKey", "descriptor", "originalMethod", "paramNames", "args", "parentContext", "newEnv", "currentParams", "index", "mergedEnv", "contextToStore", "matcher", "Symbol", "for", "isVariadic", "anonymousSelectKey", "isObject", "value", "Boolean", "isMatcher", "x", "symbols", "matchPattern", "pattern", "select", "matched", "selections", "match", "Object", "keys", "forEach", "key", "Array", "isArray", "startPatterns", "endPatterns", "variadicPatterns", "i", "subpattern", "push", "length", "Error", "startValues", "slice", "endValues", "middleValues", "Infinity", "every", "subPattern", "Reflect", "ownKeys", "k", "matcherType", "is", "getSelectionKeys", "_pattern$symbols$matc", "_pattern$symbols$matc2", "_pattern$symbols$matc3", "call", "flatMap", "values", "xs", "f", "reduce", "acc", "concat", "chainable", "pattern", "Object", "assign", "optional", "and", "p2", "intersection", "or", "union", "select", "key", "optional", "pattern", "chainable", "matcher", "match", "value", "selections", "selector", "key", "getSelectionKeys", "forEach", "undefined", "matched", "matchPattern", "matcherType", "intersection", "patterns", "chainable", "matcher", "match", "value", "selections", "selector", "key", "matched", "every", "p", "matchPattern", "getSelectionKeys", "flatMap", "matcherType", "union", "forEach", "undefined", "some", "when", "predicate", "Boolean", "select", "args", "pattern", "length", "symbols", "concat", "isNumber", "x", "isString", "isBigInt", "any", "stringChainable", "pattern", "Object", "assign", "chainable", "startsWith", "str", "intersection", "start", "when", "value", "isString", "endsWith", "end", "minLength", "min", "length", "len", "maxLength", "max", "includes", "substr", "regex", "expr", "Boolean", "match", "string", "numberChainable", "between", "isNumber", "lt", "gt", "lte", "gte", "int", "Number", "isInteger", "finite", "isFinite", "positive", "negative", "number", "bigintChainable", "betweenBigInt", "isBigInt", "bigint", "boolean", "x", "symbol", "nullish", "nonNullable", "NonExhaustiveError", "Error", "constructor", "input", "displayedValue", "JSON", "stringify", "e", "super", "this", "unmatched", "matched", "value", "undefined", "match", "MatchExpression", "state", "with", "args", "handler", "length", "patterns", "predicate", "push", "slice", "hasSelections", "selected", "select", "key", "some", "pattern", "matchPattern", "symbols", "when", "Boolean", "otherwise", "exhaustive", "run", "returnType", "shell", "shellName", "input", "trimmedInput", "i", "l", "z", "path", "join", "existsSync", "dirname", "isAbsolute", "join", "resolve", "absolute", "input", "root", "isAbsolute", "resolve", "up", "base", "options", "stop", "cwd", "tmp", "absolute", "root", "prev", "arr", "dirname", "up", "name", "options", "dir", "tmp", "start", "join", "existsSync", "getModulePath", "cwd", "lockfile", "up", "repoRoot", "path", "daggerJson", "snakeToCamel", "str", "result", "parts", "i", "part", "convertToCamel", "input", "output", "key", "camelCaseKey", "camelToSnake", "str", "convertToSnake", "input", "output", "key", "snakeCaseKey"]
3
+ "sources": ["../src/constants.ts", "../src/env.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/internals/symbols.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/internals/helpers.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/is-matching.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/patterns.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/errors.ts", "../../../node_modules/.pnpm/ts-pattern@5.7.0/node_modules/ts-pattern/src/match.ts", "../src/shell.ts", "../src/path.ts", "../../../node_modules/.pnpm/empathic@1.1.0/node_modules/empathic/find.mjs", "../../../node_modules/.pnpm/empathic@1.1.0/node_modules/empathic/walk.mjs", "../../../node_modules/.pnpm/empathic@1.1.0/node_modules/empathic/resolve.mjs", "../src/convert/snake-to-camel.ts", "../src/convert/camel-to-snake.ts"],
4
+ "sourcesContent": ["/** various constants for dagger modules in my repos */\nexport const constants = {\n\t/** constants for workers-monorepo */\n\tworkersMonorepo: {\n\t\t/** default source ignore list */\n\t\tignore: [\n\t\t\t'**/node_modules/',\n\t\t\t'**/.env',\n\t\t\t'**/.secret',\n\t\t\t'**/.wrangler',\n\t\t\t'**/.dev.vars',\n\t\t\t'**/.turbo/',\n\t\t\t'**/dist/',\n\t\t\t'**/dist2/',\n\t\t\t'**/.DS_Store',\n\t\t\t'**/.astro/',\n\t\t\t'**/.next/',\n\t\t\t'*.env',\n\t\t] satisfies string[],\n\t},\n} as const\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncLocalStorage } from 'node:async_hooks'\n\nimport type { Secret } from '@dagger.io/dagger'\n\n/**\n * Structure stored in AsyncLocalStorage, containing both the fully merged\n * environment variables and the set of variables explicitly passed to the\n * current decorated function call.\n */\nexport interface EnvContext {\n\tcurrentParams: Set<string>\n\tmergedEnv: Record<string, Secret | string | undefined>\n}\n\n/**\n * Store for environment variables accessible via AsyncLocalStorage\n */\nexport const envStorage = new AsyncLocalStorage<EnvContext>()\n\n/**\n * Helper to extract parameter names from a function's source code.\n * Note: This approach using Function.toString() can be fragile and might\n * break with code minification or complex function definitions.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function extractParamNames(func: Function): string[] {\n\tconst funcStr = func.toString().replace(/(\\r\\n|\\n|\\r)/gm, '')\n\t// Regex to find parameter list within parentheses, handles various function definition styles\n\tconst paramsMatch =\n\t\tfuncStr.match(/(?:async\\s*)?(?:function\\s*[\\w\\s]*)?\\(([^)]*)\\)/) ??\n\t\tfuncStr.match(/^\\s*(?:async\\s*)?\\(([^)]*)\\)/) // Arrow function support\n\n\tif (!paramsMatch || typeof paramsMatch[1] === 'undefined') {\n\t\tconsole.warn('Could not extract parameter names from function string:', funcStr)\n\t\treturn []\n\t}\n\tconst paramsStr = paramsMatch[1]\n\n\t// Remove comments, default values, and type annotations to isolate names\n\tconst cleanedParamsStr = paramsStr\n\t\t.replace(/\\/\\*.*?\\*\\//g, '') // Remove block comments\n\t\t.replace(/\\/\\/.*?$/gm, '') // Remove line comments\n\n\tif (!cleanedParamsStr.trim()) {\n\t\treturn [] // No parameters\n\t}\n\n\treturn cleanedParamsStr\n\t\t.split(',')\n\t\t.map((param) => {\n\t\t\t// Remove type annotations (e.g., \": Secret\") and default initializers (e.g., \"= 'default'\")\n\t\t\tconst namePart = param.split(/[:=]/)[0]\n\t\t\treturn namePart?.trim() ?? ''\n\t\t})\n\t\t.filter((name) => name.length > 0) // Filter out empty strings from trailing commas etc.\n}\n\n/**\n * Decorator factory that wraps a method to capture its arguments based on\n * extracted parameter names and store them in AsyncLocalStorage.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function ParamsToEnv(): MethodDecorator {\n\treturn function (_target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n\t\tif (typeof descriptor === 'undefined' || typeof descriptor.value !== 'function') {\n\t\t\tthrow new Error(\n\t\t\t\t`@ParamsToEnv decorator can only be applied to methods, not: ${String(propertyKey)}`\n\t\t\t)\n\t\t}\n\t\tconst originalMethod = descriptor.value\n\n\t\tlet paramNames: string[] | null = null // Cache parameter names lazily\n\n\t\tdescriptor.value = function (...args: any[]): any {\n\t\t\tconst parentContext = envStorage.getStore()\n\n\t\t\tif (paramNames === null) {\n\t\t\t\tparamNames = extractParamNames(originalMethod)\n\t\t\t\t// Basic validation: Check if the number of extracted names matches the number of arguments received.\n\t\t\t\t// This might be inaccurate if optional parameters aren't passed.\n\t\t\t\tif (paramNames.length !== args.length && typeof propertyKey === 'string') {\n\t\t\t\t\t// Log a warning but attempt to proceed. The context might be incomplete.\n\t\t\t\t\t// Note: Disabling this for now because optional parameters trigger this warning.\n\t\t\t\t\t// console.warn(\n\t\t\t\t\t// \t`Parameter name extraction/argument count mismatch for ${propertyKey}: ` +\n\t\t\t\t\t// \t\t`Extracted ${paramNames.length} names (${paramNames.join(', ')}), received ${args.length} args. ` +\n\t\t\t\t\t// \t\t`Context in AsyncLocalStorage may be incomplete or incorrect.`\n\t\t\t\t\t// )\n\t\t\t\t\t// Optionally, you could try to pad paramNames or truncate args, but it's risky.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst newEnv: Record<string, Secret | string | undefined> = {}\n\t\t\tconst currentParams = new Set<string>() // Track params for current method\n\t\t\tparamNames?.forEach((name, index) => {\n\t\t\t\t// Check if the param name matches the ENV_VAR pattern\n\t\t\t\tif (/^[A-Z0-9_]+$/.test(name)) {\n\t\t\t\t\t// Add all matching defined parameter names to currentParams\n\t\t\t\t\tcurrentParams.add(name)\n\t\t\t\t\t// Only add to newEnv if argument was actually passed\n\t\t\t\t\tif (index < args.length) {\n\t\t\t\t\t\tnewEnv[name] = args[index]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If paramNames.length > args.length, some names won't get a value, which is expected for optional params.\n\t\t\t})\n\n\t\t\t// merge parent context with new context (new takes precedence)\n\t\t\tconst parentMergedEnv = parentContext?.mergedEnv ?? {}\n\t\t\tconst mergedEnv = { ...parentMergedEnv, ...newEnv }\n\n\t\t\t// Prepare context object for storage\n\t\t\tconst contextToStore: EnvContext = {\n\t\t\t\tcurrentParams,\n\t\t\t\tmergedEnv,\n\t\t\t}\n\n\t\t\t// run the original method within the AsyncLocalStorage context using the merged env\n\t\t\treturn envStorage.run(contextToStore, () => {\n\t\t\t\t// The original method is called with its original arguments\n\t\t\t\treturn originalMethod.apply(this, args)\n\t\t\t})\n\t\t}\n\t}\n}\n", "/**\n * Symbols used internally within ts-pattern to construct and discriminate\n * Guard, Not, and Select, and AnonymousSelect patterns\n *\n * Symbols have the advantage of not appearing in auto-complete suggestions in\n * user defined patterns, and eliminate the risk of property\n * overlap between ts-pattern internals and user defined patterns.\n *\n * These symbols have to be visible to tsc for type inference to work, but\n * users should not import them\n * @module\n * @private\n * @internal\n */\n\nexport const matcher = Symbol.for('@ts-pattern/matcher');\nexport type matcher = typeof matcher;\n\nexport const unset = Symbol.for('@ts-pattern/unset');\nexport type unset = typeof unset;\n\nexport const isVariadic = Symbol.for('@ts-pattern/isVariadic');\nexport type isVariadic = typeof isVariadic;\n\n// can't be a symbol because this key has to be enumerable.\nexport const anonymousSelectKey = '@ts-pattern/anonymous-select-key';\nexport type anonymousSelectKey = typeof anonymousSelectKey;\n\nexport const override = Symbol.for('@ts-pattern/override');\nexport type override = typeof override;\n", "/**\n * @module\n * @private\n * @internal\n */\n\nimport * as symbols from './symbols';\nimport { SelectionType } from '../types/FindSelected';\nimport { Pattern, Matcher, MatcherType, AnyMatcher } from '../types/Pattern';\n\n// @internal\nexport const isObject = (value: unknown): value is Object =>\n Boolean(value && typeof value === 'object');\n\n// @internal\nexport const isMatcher = (\n x: unknown\n): x is Matcher<unknown, unknown, MatcherType, SelectionType> => {\n const pattern = x as Matcher<unknown, unknown, MatcherType, SelectionType>;\n return pattern && !!pattern[symbols.matcher];\n};\n\n// @internal\nconst isOptionalPattern = (\n x: unknown\n): x is Matcher<unknown, unknown, 'optional', SelectionType> => {\n return isMatcher(x) && x[symbols.matcher]().matcherType === 'optional';\n};\n\n// tells us if the value matches a given pattern.\n// @internal\nexport const matchPattern = (\n pattern: any,\n value: any,\n select: (key: string, value: unknown) => void\n): boolean => {\n if (isMatcher(pattern)) {\n const matcher = pattern[symbols.matcher]();\n const { matched, selections } = matcher.match(value);\n if (matched && selections) {\n Object.keys(selections).forEach((key) => select(key, selections[key]));\n }\n return matched;\n }\n\n if (isObject(pattern)) {\n if (!isObject(value)) return false;\n\n // Tuple pattern\n if (Array.isArray(pattern)) {\n if (!Array.isArray(value)) return false;\n let startPatterns = [];\n let endPatterns = [];\n let variadicPatterns: AnyMatcher[] = [];\n\n for (const i of pattern.keys()) {\n const subpattern = pattern[i];\n if (isMatcher(subpattern) && subpattern[symbols.isVariadic]) {\n variadicPatterns.push(subpattern);\n } else if (variadicPatterns.length) {\n endPatterns.push(subpattern);\n } else {\n startPatterns.push(subpattern);\n }\n }\n\n if (variadicPatterns.length) {\n if (variadicPatterns.length > 1) {\n throw new Error(\n `Pattern error: Using \\`...P.array(...)\\` several times in a single pattern is not allowed.`\n );\n }\n\n if (value.length < startPatterns.length + endPatterns.length) {\n return false;\n }\n\n const startValues = value.slice(0, startPatterns.length);\n const endValues =\n endPatterns.length === 0 ? [] : value.slice(-endPatterns.length);\n const middleValues = value.slice(\n startPatterns.length,\n endPatterns.length === 0 ? Infinity : -endPatterns.length\n );\n\n return (\n startPatterns.every((subPattern, i) =>\n matchPattern(subPattern, startValues[i], select)\n ) &&\n endPatterns.every((subPattern, i) =>\n matchPattern(subPattern, endValues[i], select)\n ) &&\n (variadicPatterns.length === 0\n ? true\n : matchPattern(variadicPatterns[0], middleValues, select))\n );\n }\n\n return pattern.length === value.length\n ? pattern.every((subPattern, i) =>\n matchPattern(subPattern, value[i], select)\n )\n : false;\n }\n\n return Reflect.ownKeys(pattern).every((k): boolean => {\n const subPattern = pattern[k];\n\n return (\n (k in value || isOptionalPattern(subPattern)) &&\n matchPattern(subPattern, value[k], select)\n );\n });\n }\n\n return Object.is(value, pattern);\n};\n\n// @internal\nexport const getSelectionKeys = (pattern: any): string[] => {\n if (isObject(pattern)) {\n if (isMatcher(pattern)) {\n return pattern[symbols.matcher]().getSelectionKeys?.() ?? [];\n }\n if (Array.isArray(pattern)) return flatMap(pattern, getSelectionKeys);\n return flatMap(Object.values(pattern), getSelectionKeys);\n }\n return [];\n};\n\n// @internal\nexport const flatMap = <a, b>(\n xs: readonly a[],\n f: (v: a) => readonly b[]\n): b[] => xs.reduce<b[]>((acc, x) => acc.concat(f(x)), []);\n", "import { MatchedValue, Pattern, UnknownProperties } from './types/Pattern';\nimport * as P from './patterns';\nimport { matchPattern } from './internals/helpers';\nimport { WithDefault } from './types/helpers';\n\n/**\n * This constraint allows using additional properties\n * in object patterns. See \"should allow targetting unknown properties\"\n * unit test in `is-matching.test.ts`.\n */\ntype PatternConstraint<T> = T extends readonly any[]\n ? P.Pattern<T>\n : T extends object\n ? P.Pattern<T> & UnknownProperties\n : P.Pattern<T>;\n\n/**\n * `isMatching` takes pattern and returns a **type guard** function, cheching if a value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * const hasName = isMatching({ name: P.string })\n *\n * declare let input: unknown\n *\n * if (hasName(input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<const p extends Pattern<unknown>>(\n pattern: p\n): (value: unknown) => value is P.infer<p>;\n/**\n * `isMatching` takes pattern and a value and checks if the value matches this pattern.\n *\n * [Read documentation for `isMatching` on GitHub](https://github.com/gvergnaud/ts-pattern#ismatching)\n *\n * @example\n * declare let input: unknown\n *\n * if (isMatching({ name: P.string }, input)) {\n * // `input` inferred as { name: string }\n * return input.name\n * }\n */\nexport function isMatching<const T, const P extends PatternConstraint<T>>(\n pattern: P,\n value: T\n): value is T & WithDefault<P.narrow<T, P>, P.infer<P>>;\n\nexport function isMatching<const p extends Pattern<any>>(\n ...args: [pattern: p, value?: any]\n): boolean | ((vale: any) => boolean) {\n if (args.length === 1) {\n const [pattern] = args;\n return (value: any): value is MatchedValue<any, P.infer<p>> =>\n matchPattern(pattern, value, () => {});\n }\n if (args.length === 2) {\n const [pattern, value] = args;\n return matchPattern(pattern, value, () => {});\n }\n\n throw new Error(\n `isMatching wasn't given the right number of arguments: expected 1 or 2, received ${args.length}.`\n );\n}\n", "/**\n * The `P` module contains patterns for primitive types, wildcards and\n * other pattern-matching utilities.\n *\n * @module\n */\n\nimport { matchPattern, getSelectionKeys, flatMap } from './internals/helpers';\nimport * as symbols from './internals/symbols';\nimport { matcher } from './internals/symbols';\nimport { isMatching } from './is-matching';\nimport { ExtractPreciseValue } from './types/ExtractPreciseValue';\nimport { Fn } from './types/helpers';\nimport { InvertPattern } from './types/InvertPattern';\nimport {\n Pattern,\n UnknownPattern,\n OptionalP,\n ArrayP,\n MapP,\n SetP,\n AndP,\n OrP,\n NotP,\n GuardP,\n SelectP,\n AnonymousSelectP,\n GuardExcludeP,\n CustomP,\n Matcher,\n StringPattern,\n AnyPattern,\n NumberPattern,\n BooleanPattern,\n BigIntPattern,\n NullishPattern,\n SymbolPattern,\n Chainable,\n BigIntChainable,\n NumberChainable,\n StringChainable,\n ArrayChainable,\n Variadic,\n NonNullablePattern,\n} from './types/Pattern';\n\nexport type {\n /**\n * `Pattern<T>` is the type of all patterns\n * that can match a value of type `T`.\n */\n Pattern,\n\n /**\n * `unstable_Fn` can be used to created a\n * a Matchable instance – a custom type that\n * can be used as a pattern.\n *\n * @experimental This feature is unstable.\n */\n Fn as unstable_Fn,\n};\n\nexport { matcher };\n\n/**\n * A `Matchable` is an object implementing\n * the Matcher Protocol. It must have a `[P.matcher]: P.Matcher<NarrowFn>`\n * key, which defines how this object should be matched by TS-Pattern.\n *\n * @experimental This feature is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matchable<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = CustomP<input, pattern, narrowedOrFn>;\n\n/**\n * A `Matcher` is an object with `match` function, which\n * defines how this object should be matched by TS-Pattern.\n *\n * @experimental This feature is unstable.\n *\n * @example\n * ```ts\n * class Some<T> implements P.unstable_Matchable {\n * [P.matcher](): P.unstable_Matcher<Some<T>>\n * }\n * ```\n */\nexport type unstable_Matcher<\n narrowedOrFn,\n input = unknown,\n pattern = never\n> = ReturnType<CustomP<input, pattern, narrowedOrFn>[matcher]>;\n\n/**\n * `P.infer<typeof somePattern>` will return the type of the value\n * matched by this pattern.\n *\n * [Read the documentation for `P.infer` on GitHub](https://github.com/gvergnaud/ts-pattern#pinfer)\n *\n * @example\n * const userPattern = { name: P.string }\n * type User = P.infer<typeof userPattern>\n */\nexport type infer<pattern> = InvertPattern<NoInfer<pattern>, unknown>;\n\n/**\n * `P.narrow<Input, Pattern>` will narrow the input type to only keep\n * the set of values that are compatible with the provided pattern type.\n *\n * [Read the documentation for `P.narrow` on GitHub](https://github.com/gvergnaud/ts-pattern#pnarrow)\n *\n * @example\n * type Input = ['a' | 'b' | 'c', 'a' | 'b' | 'c']\n * const Pattern = ['a', P.union('a', 'b')] as const\n *\n * type Narrowed = P.narrow<Input, typeof Pattern>\n * // ^? ['a', 'a' | 'b']\n */\nexport type narrow<input, pattern> = ExtractPreciseValue<\n input,\n InvertPattern<pattern, input>\n>;\n\nfunction chainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): Chainable<pattern> {\n return Object.assign(pattern, {\n optional: () => optional(pattern),\n and: (p2: any) => intersection(pattern, p2),\n or: (p2: any) => union(pattern, p2),\n select: (key: any) =>\n key === undefined ? select(pattern) : select(key, pattern),\n }) as Chainable<pattern>;\n}\n\nconst variadic = <pattern extends {}>(pattern: pattern): Variadic<pattern> =>\n Object.assign(pattern, {\n [Symbol.iterator](): Iterator<pattern, void, undefined> {\n let i = 0;\n const variadicPattern = Object.assign(pattern, {\n [symbols.isVariadic]: true,\n });\n const values: IteratorResult<pattern, void>[] = [\n { value: variadicPattern, done: false },\n { done: true, value: undefined },\n ];\n return {\n next: () => values[i++] ?? values.at(-1)!,\n };\n },\n });\n\nfunction arrayChainable<pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): ArrayChainable<pattern> {\n return Object.assign(variadic(pattern), {\n optional: () => arrayChainable(optional(pattern)),\n select: (key: any) =>\n arrayChainable(\n key === undefined ? select(pattern) : select(key, pattern)\n ),\n }) as any;\n}\n\n/**\n * `P.optional(subpattern)` takes a sub pattern and returns a pattern which matches if the\n * key is undefined or if it is defined and the sub pattern matches its value.\n *\n * [Read the documentation for `P.optional` on GitHub](https://github.com/gvergnaud/ts-pattern#poptional-patterns)\n *\n * @example\n * match(value)\n * .with({ greeting: P.optional('Hello') }, () => 'will match { greeting?: \"Hello\" }')\n */\nexport function optional<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>\n>(pattern: pattern): Chainable<OptionalP<input, pattern>, 'optional'> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n if (value === undefined) {\n getSelectionKeys(pattern).forEach((key) =>\n selector(key, undefined)\n );\n return { matched: true, selections };\n }\n const matched = matchPattern(pattern, value, selector);\n return { matched, selections };\n },\n getSelectionKeys: () => getSelectionKeys(pattern),\n matcherType: 'optional',\n };\n },\n });\n}\n\ntype UnwrapArray<xs> = xs extends readonly (infer x)[] ? x : never;\n\ntype UnwrapSet<xs> = xs extends Set<infer x> ? x : never;\n\ntype UnwrapMapKey<xs> = xs extends Map<infer k, any> ? k : never;\n\ntype UnwrapMapValue<xs> = xs extends Map<any, infer v> ? v : never;\n\ntype WithDefault<a, b> = [a] extends [never] ? b : a;\n\n/**\n * `P.array(subpattern)` takes a sub pattern and returns a pattern, which matches\n * arrays if all their elements match the sub pattern.\n *\n * [Read the documentation for `P.array` on GitHub](https://github.com/gvergnaud/ts-pattern#parray-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.array({ name: P.string }) }, () => 'will match { name: string }[]')\n */\nexport function array<input>(): ArrayChainable<ArrayP<input, unknown>>;\nexport function array<\n input,\n const pattern extends Pattern<WithDefault<UnwrapArray<input>, unknown>>\n>(pattern: pattern): ArrayChainable<ArrayP<input, pattern>>;\nexport function array(\n ...args: [pattern?: any]\n): ArrayChainable<ArrayP<any, any>> {\n return arrayChainable({\n [matcher]() {\n return {\n match: (value: any) => {\n if (!Array.isArray(value)) return { matched: false };\n\n if (args.length === 0) return { matched: true };\n\n const pattern = args[0];\n let selections: Record<string, unknown[]> = {};\n\n if (value.length === 0) {\n getSelectionKeys(pattern).forEach((key) => {\n selections[key] = [];\n });\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const matched = value.every((v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\n/**\n * `P.set(subpattern)` takes a sub pattern and returns a pattern that matches\n * sets if all their elements match the sub pattern.\n *\n * [Read `P.set` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#pset-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.set(P.string) }, () => 'will match Set<string>')\n */\nexport function set<input>(): Chainable<SetP<input, unknown>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(pattern: pattern): Chainable<SetP<input, pattern>>;\nexport function set<\n input,\n const pattern extends Pattern<WithDefault<UnwrapSet<input>, unknown>>\n>(...args: [pattern?: pattern]): Chainable<SetP<input, pattern>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Set)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n if (args.length === 0) return { matched: true };\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n const pattern = args[0];\n\n const matched = setEvery(value, (v) =>\n matchPattern(pattern, v, selector)\n );\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0 ? [] : getSelectionKeys(args[0]),\n };\n },\n });\n}\n\nconst setEvery = <T>(set: Set<T>, predicate: (value: T) => boolean) => {\n for (const value of set) {\n if (predicate(value)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.map(keyPattern, valuePattern)` takes a subpattern to match against the\n * key, a subpattern to match against the value and returns a pattern that\n * matches on maps where all elements inside the map match those two\n * subpatterns.\n *\n * [Read `P.map` documentation on GitHub](https://github.com/gvergnaud/ts-pattern#pmap-patterns)\n *\n * @example\n * match(value)\n * .with({ users: P.map(P.map(P.string, P.number)) }, (map) => `map's type is Map<string, number>`)\n */\nexport function map<input>(): Chainable<MapP<input, unknown, unknown>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(patternKey: pkey, patternValue: pvalue): Chainable<MapP<input, pkey, pvalue>>;\nexport function map<\n input,\n const pkey extends Pattern<WithDefault<UnwrapMapKey<input>, unknown>>,\n const pvalue extends Pattern<WithDefault<UnwrapMapValue<input>, unknown>>\n>(\n ...args: [patternKey?: pkey, patternValue?: pvalue]\n): Chainable<MapP<input, pkey, pvalue>> {\n return chainable({\n [matcher]() {\n return {\n match: <UnknownInput>(value: UnknownInput | input) => {\n if (!(value instanceof Map)) return { matched: false };\n\n let selections: Record<string, unknown[]> = {};\n\n if (value.size === 0) {\n return { matched: true, selections };\n }\n\n const selector = (key: string, value: unknown) => {\n selections[key] = (selections[key] || []).concat([value]);\n };\n\n if (args.length === 0) return { matched: true };\n if (args.length === 1) {\n throw new Error(\n `\\`P.map\\` wasn\\'t given enough arguments. Expected (key, value), received ${args[0]?.toString()}`\n );\n }\n const [patternKey, patternValue] = args;\n\n const matched = mapEvery(value, (v, k) => {\n const keyMatch = matchPattern(patternKey, k, selector);\n const valueMatch = matchPattern(patternValue, v, selector);\n return keyMatch && valueMatch;\n });\n\n return { matched, selections };\n },\n getSelectionKeys: () =>\n args.length === 0\n ? []\n : [...getSelectionKeys(args[0]), ...getSelectionKeys(args[1])],\n };\n },\n });\n}\n\nconst mapEvery = <K, T>(\n map: Map<K, T>,\n predicate: (value: T, key: K) => boolean\n) => {\n for (const [key, value] of map.entries()) {\n if (predicate(value, key)) continue;\n return false;\n }\n return true;\n};\n\n/**\n * `P.intersection(...patterns)` returns a pattern which matches\n * only if **every** patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.intersection` on GitHub](https://github.com/gvergnaud/ts-pattern#pintersection-patterns)\n *\n * @example\n * match(value)\n * .with(\n * {\n * user: P.intersection(\n * { firstname: P.string },\n * { lastname: P.string },\n * { age: P.when(age => age > 21) }\n * )\n * },\n * ({ user }) => 'will match { firstname: string, lastname: string, age: number } if age > 21'\n * )\n */\nexport function intersection<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<AndP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: (value) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n const matched = (patterns as readonly UnknownPattern[]).every((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'and',\n }),\n });\n}\n\n/**\n * `P.union(...patterns)` returns a pattern which matches\n * if **at least one** of the patterns provided in parameter match the input.\n *\n * [Read the documentation for `P.union` on GitHub](https://github.com/gvergnaud/ts-pattern#punion-patterns)\n *\n * @example\n * match(value)\n * .with(\n * { type: P.union('a', 'b', 'c') },\n * ({ type }) => 'will match { type: \"a\" | \"b\" | \"c\" }'\n * )\n */\nexport function union<\n input,\n const patterns extends readonly [Pattern<input>, ...Pattern<input>[]]\n>(...patterns: patterns): Chainable<OrP<input, patterns>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => {\n let selections: Record<string, unknown[]> = {};\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n flatMap(\n patterns as readonly UnknownPattern[],\n getSelectionKeys\n ).forEach((key) => selector(key, undefined));\n const matched = (patterns as readonly UnknownPattern[]).some((p) =>\n matchPattern(p, value, selector)\n );\n return { matched, selections };\n },\n getSelectionKeys: () =>\n flatMap(patterns as readonly UnknownPattern[], getSelectionKeys),\n matcherType: 'or',\n }),\n });\n}\n\n/**\n * `P.not(pattern)` returns a pattern which matches if the sub pattern\n * doesn't match.\n *\n * [Read the documentation for `P.not` on GitHub](https://github.com/gvergnaud/ts-pattern#pnot-patterns)\n *\n * @example\n * match<{ a: string | number }>(value)\n * .with({ a: P.not(P.string) }, (x) => 'will match { a: number }'\n * )\n */\n\nexport function not<\n input,\n const pattern extends Pattern<input> | UnknownPattern\n>(pattern: pattern): Chainable<NotP<input, pattern>> {\n return chainable({\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: !matchPattern(pattern, value, () => {}),\n }),\n getSelectionKeys: () => [],\n matcherType: 'not',\n }),\n });\n}\n\n/**\n * `P.when((value) => boolean)` returns a pattern which matches\n * if the predicate returns true for the current input.\n *\n * [Read the documentation for `P.when` on GitHub](https://github.com/gvergnaud/ts-pattern#pwhen-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.when(age => age > 21) }, (x) => 'will match if value.age > 21'\n * )\n */\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n>;\nexport function when<input, narrowed extends input, excluded>(\n predicate: (input: input) => input is narrowed\n): GuardExcludeP<input, narrowed, excluded>;\nexport function when<input, predicate extends (value: input) => unknown>(\n predicate: predicate\n): GuardP<\n input,\n predicate extends (value: any) => value is infer narrowed ? narrowed : never\n> {\n return {\n [matcher]: () => ({\n match: <UnknownInput>(value: UnknownInput | input) => ({\n matched: Boolean(predicate(value as input)),\n }),\n }),\n };\n}\n\n/**\n * `P.select()` is a pattern which will always match,\n * and will inject the selected piece of input in the handler function.\n *\n * [Read the documentation for `P.select` on GitHub](https://github.com/gvergnaud/ts-pattern#pselect-patterns)\n *\n * @example\n * match<{ age: number }>(value)\n * .with({ age: P.select() }, (age) => 'age: number'\n * )\n */\nexport function select(): Chainable<AnonymousSelectP, 'select' | 'or' | 'and'>;\nexport function select<\n input,\n const patternOrKey extends\n | string\n | (unknown extends input ? UnknownPattern : Pattern<input>)\n>(\n patternOrKey: patternOrKey\n): patternOrKey extends string\n ? Chainable<SelectP<patternOrKey, 'select' | 'or' | 'and'>>\n : Chainable<\n SelectP<symbols.anonymousSelectKey, input, patternOrKey>,\n 'select' | 'or' | 'and'\n >;\nexport function select<\n input,\n const pattern extends unknown extends input ? UnknownPattern : Pattern<input>,\n const k extends string\n>(\n key: k,\n pattern: pattern\n): Chainable<SelectP<k, input, pattern>, 'select' | 'or' | 'and'>;\nexport function select(\n ...args: [keyOrPattern?: unknown | string, pattern?: unknown]\n): Chainable<SelectP<string>, 'select' | 'or' | 'and'> {\n const key: string | undefined =\n typeof args[0] === 'string' ? args[0] : undefined;\n const pattern: unknown =\n args.length === 2\n ? args[1]\n : typeof args[0] === 'string'\n ? undefined\n : args[0];\n return chainable({\n [matcher]() {\n return {\n match: (value) => {\n let selections: Record<string, unknown> = {\n [key ?? symbols.anonymousSelectKey]: value,\n };\n const selector = (key: string, value: any) => {\n selections[key] = value;\n };\n return {\n matched:\n pattern === undefined\n ? true\n : matchPattern(pattern, value, selector),\n selections: selections,\n };\n },\n getSelectionKeys: () =>\n [key ?? symbols.anonymousSelectKey].concat(\n pattern === undefined ? [] : getSelectionKeys(pattern)\n ),\n };\n },\n });\n}\n\nfunction isUnknown(x: unknown): x is unknown {\n return true;\n}\n\nfunction isNumber<T>(x: T | number): x is number {\n return typeof x === 'number';\n}\n\nfunction isString<T>(x: T | string): x is string {\n return typeof x === 'string';\n}\n\nfunction isBoolean<T>(x: T | boolean): x is boolean {\n return typeof x === 'boolean';\n}\n\nfunction isBigInt<T>(x: T | bigint): x is bigint {\n return typeof x === 'bigint';\n}\n\nfunction isSymbol<T>(x: T | symbol): x is symbol {\n return typeof x === 'symbol';\n}\n\nfunction isNullish<T>(x: T | null | undefined): x is null | undefined {\n return x === null || x === undefined;\n}\n\nfunction isNonNullable(x: unknown): x is {} {\n return x !== null && x !== undefined;\n}\n\ntype AnyConstructor = abstract new (...args: any[]) => any;\n\nfunction isInstanceOf<T extends AnyConstructor>(classConstructor: T) {\n return (val: unknown): val is InstanceType<T> =>\n val instanceof classConstructor;\n}\n\n/**\n * `P.any` is a wildcard pattern, matching **any value**.\n *\n * [Read the documentation for `P.any` on GitHub](https://github.com/gvergnaud/ts-pattern#p_-wildcard)\n *\n * @example\n * match(value)\n * .with(P.any, () => 'will always match')\n */\nexport const any: AnyPattern = chainable(when(isUnknown));\n\n/**\n * `P._` is a wildcard pattern, matching **any value**.\n * It's an alias to `P.any`.\n *\n * [Read the documentation for `P._` on GitHub](https://github.com/gvergnaud/ts-pattern#p_-wildcard)\n *\n * @example\n * match(value)\n * .with(P._, () => 'will always match')\n */\nexport const _ = any;\n\n/**\n * `P.string.startsWith(start)` is a pattern, matching **strings** starting with `start`.\n *\n * [Read the documentation for `P.string.startsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringstartsWith)\n *\n * @example\n * match(value)\n * .with(P.string.startsWith('A'), () => 'value starts with an A')\n */\n\nconst startsWith = <input, const start extends string>(\n start: start\n): GuardP<input, `${start}${string}`> =>\n when((value) => isString(value) && value.startsWith(start));\n\n/**\n * `P.string.endsWith(end)` is a pattern, matching **strings** ending with `end`.\n *\n * [Read the documentation for `P.string.endsWith` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringendsWith)\n *\n * @example\n * match(value)\n * .with(P.string.endsWith('!'), () => 'value ends with an !')\n */\nconst endsWith = <input, const end extends string>(\n end: end\n): GuardP<input, `${string}${end}`> =>\n when((value) => isString(value) && value.endsWith(end));\n\n/**\n * `P.string.minLength(min)` is a pattern, matching **strings** with at least `min` characters.\n *\n * [Read the documentation for `P.string.minLength` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringminLength)\n *\n * @example\n * match(value)\n * .with(P.string.minLength(10), () => 'string with more length >= 10')\n */\nconst minLength = <const min extends number>(min: min) =>\n when((value) => isString(value) && value.length >= min);\n\n/**\n * `P.string.length(len)` is a pattern, matching **strings** with exactly `len` characters.\n *\n * [Read the documentation for `P.string.length` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringlength)\n *\n * @example\n * match(value)\n * .with(P.string.length(10), () => 'strings with length === 10')\n */\nconst length = <const len extends number>(len: len) =>\n when((value) => isString(value) && value.length === len);\n\n/**\n * `P.string.maxLength(max)` is a pattern, matching **strings** with at most `max` characters.\n *\n * [Read the documentation for `P.string.maxLength` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringmaxLength)\n *\n * @example\n * match(value)\n * .with(P.string.maxLength(10), () => 'string with more length <= 10')\n */\nconst maxLength = <const max extends number>(max: max) =>\n when((value) => isString(value) && value.length <= max);\n\n/**\n * `P.string.includes(substr)` is a pattern, matching **strings** containing `substr`.\n *\n * [Read the documentation for `P.string.includes` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringincludes)\n *\n * @example\n * match(value)\n * .with(P.string.includes('http'), () => 'value contains http')\n */\nconst includes = <input, const substr extends string>(\n substr: substr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && value.includes(substr));\n\n/**\n * `P.string.regex(expr)` is a pattern, matching **strings** that `expr` regular expression.\n *\n * [Read the documentation for `P.string.regex` on GitHub](https://github.com/gvergnaud/ts-pattern#pstringregex)\n *\n * @example\n * match(value)\n * .with(P.string.regex(/^https?:\\/\\//), () => 'url')\n */\nconst regex = <input, const expr extends string | RegExp>(\n expr: expr\n): GuardExcludeP<input, string, never> =>\n when((value) => isString(value) && Boolean(value.match(expr)));\n\nconst stringChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): StringChainable<pattern> =>\n Object.assign(chainable(pattern), {\n startsWith: (str: string) =>\n stringChainable(intersection(pattern, startsWith(str))),\n endsWith: (str: string) =>\n stringChainable(intersection(pattern, endsWith(str))),\n minLength: (min: number) =>\n stringChainable(intersection(pattern, minLength(min))),\n length: (len: number) =>\n stringChainable(intersection(pattern, length(len))),\n maxLength: (max: number) =>\n stringChainable(intersection(pattern, maxLength(max))),\n includes: (str: string) =>\n stringChainable(intersection(pattern, includes(str))),\n regex: (str: string) => stringChainable(intersection(pattern, regex(str))),\n }) as any;\n\n/**\n * `P.string` is a wildcard pattern, matching any **string**.\n *\n * [Read the documentation for `P.string` on GitHub](https://github.com/gvergnaud/ts-pattern#pstring-wildcard)\n *\n * @example\n * match(value)\n * .with(P.string, () => 'will match on strings')\n */\nexport const string: StringPattern = stringChainable(when(isString));\n\n/**\n * `P.number.between(min, max)` matches **numbers** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.number.between` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.number.between(0, 10), () => '0 <= numbers <= 10')\n */\nconst between = <input, const min extends number, const max extends number>(\n min: min,\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && min <= value && max >= value);\n\n/**\n * `P.number.lt(max)` matches **numbers** smaller than `max`.\n *\n * [Read the documentation for `P.number.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.number.lt(10), () => 'numbers < 10')\n */\nconst lt = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < max);\n\n/**\n * `P.number.gt(min)` matches **numbers** greater than `min`.\n *\n * [Read the documentation for `P.number.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.number.gt(10), () => 'numbers > 10')\n */\nconst gt = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > min);\n\n/**\n * `P.number.lte(max)` matches **numbers** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.number.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.number.lte(10), () => 'numbers <= 10')\n */\nconst lte = <input, const max extends number>(\n max: max\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value <= max);\n\n/**\n * `P.number.gte(min)` matches **numbers** greater than or equal to `min`.\n *\n * [Read the documentation for `P.number.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergte)\n *\n * @example\n * match(value)\n * .with(P.number.gte(10), () => 'numbers >= 10')\n */\nconst gte = <input, const min extends number>(\n min: min\n): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value >= min);\n\n/**\n * `P.number.int()` matches **integer** numbers.\n *\n * [Read the documentation for `P.number.int()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberint)\n *\n * @example\n * match(value)\n * .with(P.number.int(), () => 'an integer')\n */\nconst int = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isInteger(value));\n\n/**\n * `P.number.finite` matches **finite numbers**.\n *\n * [Read the documentation for `P.number.finite` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberfinite)\n *\n * @example\n * match(value)\n * .with(P.number.finite, () => 'not Infinity')\n */\nconst finite = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && Number.isFinite(value));\n\n/**\n * `P.number.positive()` matches **positive** numbers.\n *\n * [Read the documentation for `P.number.positive()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberpositive)\n *\n * @example\n * match(value)\n * .with(P.number.positive(), () => 'number > 0')\n */\nconst positive = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value > 0);\n\n/**\n * `P.number.negative()` matches **negative** numbers.\n *\n * [Read the documentation for `P.number.negative()` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbernegative)\n *\n * @example\n * match(value)\n * .with(P.number.negative(), () => 'number < 0')\n */\nconst negative = <input>(): GuardExcludeP<input, number, never> =>\n when((value) => isNumber(value) && value < 0);\n\nconst numberChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): NumberChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: number, max: number) =>\n numberChainable(intersection(pattern, between(min, max))),\n lt: (max: number) => numberChainable(intersection(pattern, lt(max))),\n gt: (min: number) => numberChainable(intersection(pattern, gt(min))),\n lte: (max: number) => numberChainable(intersection(pattern, lte(max))),\n gte: (min: number) => numberChainable(intersection(pattern, gte(min))),\n int: () => numberChainable(intersection(pattern, int())),\n finite: () => numberChainable(intersection(pattern, finite())),\n positive: () => numberChainable(intersection(pattern, positive())),\n negative: () => numberChainable(intersection(pattern, negative())),\n }) as any;\n\n/**\n * `P.number` is a wildcard pattern, matching any **number**.\n *\n * [Read the documentation for `P.number` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumber-wildcard)\n *\n * @example\n * match(value)\n * .with(P.number, () => 'will match on numbers')\n */\nexport const number: NumberPattern = numberChainable(when(isNumber));\n\n/**\n * `P.bigint.between(min, max)` matches **bigint** between `min` and `max`,\n * equal to min or equal to max.\n *\n * [Read the documentation for `P.bigint.between` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberbetween)\n *\n * @example\n * match(value)\n * .with(P.bigint.between(0, 10), () => '0 <= bigints <= 10')\n */\nconst betweenBigInt = <\n input,\n const min extends bigint,\n const max extends bigint\n>(\n min: min,\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && min <= value && max >= value);\n\n/**\n * `P.bigint.lt(max)` matches **bigint** smaller than `max`.\n *\n * [Read the documentation for `P.bigint.lt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlt)\n *\n * @example\n * match(value)\n * .with(P.bigint.lt(10), () => 'bigints < 10')\n */\nconst ltBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < max);\n\n/**\n * `P.bigint.gt(min)` matches **bigint** greater than `min`.\n *\n * [Read the documentation for `P.bigint.gt` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumbergt)\n *\n * @example\n * match(value)\n * .with(P.bigint.gt(10), () => 'bigints > 10')\n */\nconst gtBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > min);\n\n/**\n * `P.bigint.lte(max)` matches **bigint** smaller than or equal to `max`.\n *\n * [Read the documentation for `P.bigint.lte` on GitHub](https://github.com/gvergnaud/ts-pattern#pnumberlte)\n *\n * @example\n * match(value)\n * .with(P.bigint.lte(10), () => 'bigints <= 10')\n */\nconst lteBigInt = <input, const max extends bigint>(\n max: max\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value <= max);\n\n/**\n * `P.bigint.gte(min)` matches **bigint** greater than or equal to `min`.\n *\n * [Read the documentation for `P.bigint.gte` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintgte)\n *\n * @example\n * match(value)\n * .with(P.bigint.gte(10), () => 'bigints >= 10')\n */\nconst gteBigInt = <input, const min extends bigint>(\n min: min\n): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value >= min);\n\n/**\n * `P.bigint.positive()` matches **positive** bigints.\n *\n * [Read the documentation for `P.bigint.positive()` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintpositive)\n *\n * @example\n * match(value)\n * .with(P.bigint.positive(), () => 'bigint > 0')\n */\nconst positiveBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value > 0);\n\n/**\n * `P.bigint.negative()` matches **negative** bigints.\n *\n * [Read the documentation for `P.bigint.negative()` on GitHub](https://github.com/gvergnaud/ts-pattern#pbigintnegative)\n *\n * @example\n * match(value)\n * .with(P.bigint.negative(), () => 'bigint < 0')\n */\nconst negativeBigInt = <input>(): GuardExcludeP<input, bigint, never> =>\n when((value) => isBigInt(value) && value < 0);\n\nconst bigintChainable = <pattern extends Matcher<any, any, any, any, any>>(\n pattern: pattern\n): BigIntChainable<pattern> =>\n Object.assign(chainable(pattern), {\n between: (min: bigint, max: bigint) =>\n bigintChainable(intersection(pattern, betweenBigInt(min, max))),\n lt: (max: bigint) => bigintChainable(intersection(pattern, ltBigInt(max))),\n gt: (min: bigint) => bigintChainable(intersection(pattern, gtBigInt(min))),\n lte: (max: bigint) =>\n bigintChainable(intersection(pattern, lteBigInt(max))),\n gte: (min: bigint) =>\n bigintChainable(intersection(pattern, gteBigInt(min))),\n positive: () => bigintChainable(intersection(pattern, positiveBigInt())),\n negative: () => bigintChainable(intersection(pattern, negativeBigInt())),\n }) as any;\n\n/**\n * `P.bigint` is a wildcard pattern, matching any **bigint**.\n *\n * [Read the documentation for `P.bigint` on GitHub](https://github.com/gvergnaud/ts-pattern#number-wildcard)\n *\n * @example\n * .with(P.bigint, () => 'will match on bigints')\n */\nexport const bigint: BigIntPattern = bigintChainable(when(isBigInt));\n\n/**\n * `P.boolean` is a wildcard pattern, matching any **boolean**.\n *\n * [Read the documentation for `P.boolean` on GitHub](https://github.com/gvergnaud/ts-pattern#boolean-wildcard)\n *\n * @example\n * .with(P.boolean, () => 'will match on booleans')\n */\nexport const boolean: BooleanPattern = chainable(when(isBoolean));\n\n/**\n * `P.symbol` is a wildcard pattern, matching any **symbol**.\n *\n * [Read the documentation for `P.symbol` on GitHub](https://github.com/gvergnaud/ts-pattern#symbol-wildcard)\n *\n * @example\n * .with(P.symbol, () => 'will match on symbols')\n */\nexport const symbol: SymbolPattern = chainable(when(isSymbol));\n\n/**\n * `P.nullish` is a wildcard pattern, matching **null** or **undefined**.\n *\n * [Read the documentation for `P.nullish` on GitHub](https://github.com/gvergnaud/ts-pattern#nullish-wildcard)\n *\n * @example\n * .with(P.nullish, (x) => `${x} is null or undefined`)\n */\nexport const nullish: NullishPattern = chainable(when(isNullish));\n\n/**\n * `P.nonNullable` is a wildcard pattern, matching everything except **null** or **undefined**.\n *\n * [Read the documentation for `P.nonNullable` on GitHub](https://github.com/gvergnaud/ts-pattern#nonNullable-wildcard)\n *\n * @example\n * .with(P.nonNullable, (x) => `${x} isn't null nor undefined`)\n */\nexport const nonNullable: NonNullablePattern = chainable(when(isNonNullable));\n\n/**\n * `P.instanceOf(SomeClass)` is a pattern matching instances of a given class.\n *\n * [Read the documentation for `P.instanceOf` on GitHub](https://github.com/gvergnaud/ts-pattern#pinstanceof-patterns)\n *\n * @example\n * .with(P.instanceOf(SomeClass), () => 'will match on SomeClass instances')\n */\nexport function instanceOf<T extends AnyConstructor>(\n classConstructor: T\n): Chainable<GuardP<unknown, InstanceType<T>>> {\n return chainable(when(isInstanceOf(classConstructor)));\n}\n\n/**\n * `P.shape(somePattern)` lets you call methods like `.optional()`, `.and`, `.or` and `.select()`\n * On structural patterns, like objects and arrays.\n *\n * [Read the documentation for `P.shape` on GitHub](https://github.com/gvergnaud/ts-pattern#pshape-patterns)\n *\n * @example\n * .with(\n * {\n * state: P.shape({ status: \"success\" }).optional().select()\n * },\n * (state) => 'match the success state, or undefined.'\n * )\n */\nexport function shape<input, const pattern extends Pattern<input>>(\n pattern: pattern\n): Chainable<GuardP<input, InvertPattern<pattern, input>>>;\nexport function shape(pattern: UnknownPattern) {\n return chainable(when(isMatching(pattern)));\n}\n", "/**\n * Error when the given input value does not match any included pattern\n * and .exhaustive() was specified\n */\nexport class NonExhaustiveError extends Error {\n constructor(public input: unknown) {\n let displayedValue;\n try {\n displayedValue = JSON.stringify(input);\n } catch (e) {\n displayedValue = input;\n }\n super(`Pattern matching error: no pattern matches value ${displayedValue}`);\n }\n}\n", "import { Pattern } from './types/Pattern';\nimport { Match } from './types/Match';\nimport * as symbols from './internals/symbols';\nimport { matchPattern } from './internals/helpers';\nimport { NonExhaustiveError } from './errors';\n\ntype MatchState<output> =\n | { matched: true; value: output }\n | { matched: false; value: undefined };\n\nconst unmatched: MatchState<never> = {\n matched: false,\n value: undefined,\n};\n\n/**\n * `match` creates a **pattern matching expression**.\n * * Use `.with(pattern, handler)` to pattern match on the input.\n * * Use `.exhaustive()` or `.otherwise(() => defaultValue)` to end the expression and get the result.\n *\n * [Read the documentation for `match` on GitHub](https://github.com/gvergnaud/ts-pattern#match)\n *\n * @example\n * declare let input: \"A\" | \"B\";\n *\n * return match(input)\n * .with(\"A\", () => \"It's an A!\")\n * .with(\"B\", () => \"It's a B!\")\n * .exhaustive();\n *\n */\nexport function match<const input, output = symbols.unset>(\n value: input\n): Match<input, output> {\n return new MatchExpression(value, unmatched) as any;\n}\n\n/**\n * This class represents a match expression. It follows the\n * builder pattern, we chain methods to add features to the expression\n * until we call `.exhaustive`, `.otherwise` or the unsafe `.run`\n * method to execute it.\n *\n * The types of this class aren't public, the public type definition\n * can be found in src/types/Match.ts.\n */\nclass MatchExpression<input, output> {\n constructor(private input: input, private state: MatchState<output>) {}\n\n with(...args: any[]): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const handler: (selection: unknown, value: input) => output =\n args[args.length - 1];\n\n const patterns: Pattern<input>[] = [args[0]];\n let predicate: ((value: input) => unknown) | undefined = undefined;\n\n if (args.length === 3 && typeof args[1] === 'function') {\n // case with guard as second argument\n predicate = args[1];\n } else if (args.length > 2) {\n // case with several patterns\n patterns.push(...args.slice(1, args.length - 1));\n }\n\n let hasSelections = false;\n let selected: Record<string, unknown> = {};\n const select = (key: string, value: unknown) => {\n hasSelections = true;\n selected[key] = value;\n };\n\n const matched =\n patterns.some((pattern) => matchPattern(pattern, this.input, select)) &&\n (predicate ? Boolean(predicate(this.input)) : true);\n\n const selections = hasSelections\n ? symbols.anonymousSelectKey in selected\n ? selected[symbols.anonymousSelectKey]\n : selected\n : this.input;\n\n const state = matched\n ? {\n matched: true as const,\n value: handler(selections, this.input),\n }\n : unmatched;\n\n return new MatchExpression(this.input, state);\n }\n\n when(\n predicate: (value: input) => unknown,\n handler: (selection: input, value: input) => output\n ): MatchExpression<input, output> {\n if (this.state.matched) return this;\n\n const matched = Boolean(predicate(this.input));\n\n return new MatchExpression<input, output>(\n this.input,\n matched\n ? { matched: true, value: handler(this.input, this.input) }\n : unmatched\n );\n }\n\n otherwise(handler: (value: input) => output): output {\n if (this.state.matched) return this.state.value;\n return handler(this.input);\n }\n\n exhaustive(unexpectedValueHandler = defaultCatcher): output {\n if (this.state.matched) return this.state.value;\n return unexpectedValueHandler(this.input);\n }\n\n run(): output {\n return this.exhaustive();\n }\n\n returnType() {\n return this;\n }\n}\n\nfunction defaultCatcher(input: unknown): never {\n throw new NonExhaustiveError(input);\n}\n", "import { match } from 'ts-pattern'\n\n/**\n * Create a new shell helper with the given shell type\n *\n * @param shellName - The name of the shell to use\n *\n * @example\n *\n * ```ts\n * const sh = shell('bash')\n *\n * const con = dag.container()\n * .withExec(sh('echo hello world!'))\n * ```\n */\nexport function shell(shellName: 'sh' | 'bash' | 'zsh') {\n\treturn (input: string | string[]): string[] => {\n\t\tconst inputAr = Array.isArray(input) ? input : [input]\n\t\tconst trimmedInput = inputAr.map((i) =>\n\t\t\ti\n\t\t\t\t.trim()\n\t\t\t\t.split('\\n')\n\t\t\t\t.map((l) => l.trim())\n\t\t\t\t.join('\\n')\n\t\t)\n\n\t\treturn match(shellName)\n\t\t\t.with('sh', () => ['sh', '-c', `set -eu; ${trimmedInput}`])\n\t\t\t.with('bash', () => ['bash', '-c', `set -euo pipefail; ${trimmedInput}`])\n\t\t\t.with('zsh', () => ['zsh', '-c', `set -euo pipefail; ${trimmedInput}`])\n\t\t\t.exhaustive()\n\t}\n}\n", "import path from 'node:path'\nimport { up } from 'empathic/find'\n\nexport function getRepoRoot(cwd?: string): string {\n\tcwd = cwd ?? process.cwd()\n\n\tconst lockfile = up('pnpm-lock.yaml', { cwd })\n\tif (!lockfile) {\n\t\tthrow new Error('could not determine repo root path: unable to find pnpm-lock.yaml')\n\t}\n\n\treturn path.dirname(lockfile)\n}\n\n/**\n * Get the path to the dagger module.\n *\n * Requires `pnpm-lock.yaml` to exist in the repo root.\n *\n * @param cwd - The current working directory. **Default:** `process.cwd()`\n *\n * @returns The path to the dagger module relative to the repo root\n */\nexport function getModulePath(cwd?: string): string {\n\tcwd = cwd ?? process.cwd()\n\n\tconst lockfile = up('pnpm-lock.yaml', { cwd })\n\tif (!lockfile) {\n\t\tthrow new Error('could not determine repo root path: unable to find pnpm-lock.yaml')\n\t}\n\tconst repoRoot = path.dirname(lockfile)\n\n\tconst daggerJson = up('dagger.json', { cwd, stop: repoRoot })\n\tif (!daggerJson) {\n\t\tthrow new Error('could not determine dagger.json path: unable to find dagger.json')\n\t}\n\n\treturn path.relative(repoRoot, path.dirname(daggerJson))\n}\n", "import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport * as walk from \"empathic/walk\";\n/**\n* Find an item by name, walking parent directories until found.\n*\n* @param name The item name to find.\n* @returns The absolute path to the item, if found.\n*/\nexport function up(name, options) {\n\tlet dir, tmp;\n\tlet start = options && options.cwd || \"\";\n\tfor (dir of walk.up(start, options)) {\n\t\ttmp = join(dir, name);\n\t\tif (existsSync(tmp)) return tmp;\n\t}\n}\n/**\n* Get the first path that matches any of the names provided.\n*\n* > [NOTE]\n* > The order of {@link names} is respected.\n*\n* @param names The item names to find.\n* @returns The absolute path of the first item found, if any.\n*/\nexport function any(names, options) {\n\tlet dir, start = options && options.cwd || \"\";\n\tlet j = 0, len = names.length, tmp;\n\tfor (dir of walk.up(start, options)) {\n\t\tfor (j = 0; j < len; j++) {\n\t\t\ttmp = join(dir, names[j]);\n\t\t\tif (existsSync(tmp)) return tmp;\n\t\t}\n\t}\n}\n", "import { dirname } from \"node:path\";\nimport { absolute } from \"empathic/resolve\";\n/**\n* Get all parent directories of {@link base}.\n* Stops at {@link Options['stop']} else system root (\"/\").\n*\n* @returns An array of absolute paths of all parent directories.\n*/\nexport function up(base, options) {\n\tlet { stop, cwd } = options || {};\n\tlet tmp = absolute(base, cwd), root = !stop;\n\tlet prev, arr = [];\n\tif (stop) stop = absolute(stop, cwd);\n\twhile (root || tmp !== stop) {\n\t\tarr.push(tmp);\n\t\ttmp = dirname(prev = tmp);\n\t\tif (tmp === prev) break;\n\t}\n\treturn arr;\n}\n", "import { createRequire } from \"node:module\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n/**\n* Resolve an absolute path from {@link root}, but only\n* if {@link input} isn't already absolute.\n*\n* @param input The path to resolve.\n* @param root The base path; default = process.cwd()\n* @returns The resolved absolute path.\n*/\nexport function absolute(input, root) {\n\treturn isAbsolute(input) ? input : resolve(root || \".\", input);\n}\nexport function from(root, ident, silent) {\n\ttry {\n\t\tlet r = root instanceof URL || root.startsWith(\"file://\") ? join(fileURLToPath(root), \"noop.js\") : join(absolute(root), \"noop.js\");\n\t\treturn createRequire(r).resolve(ident);\n\t} catch (err) {\n\t\tif (!silent) throw err;\n\t}\n}\nexport function cwd(ident, silent) {\n\treturn from(resolve(), ident, silent);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Helper type to capitalize the first letter of a string literal type.\n * e.g., 'hello' -> 'Hello'\n */\ntype CapitalizeString<S extends string> = S extends `${infer First}${infer Rest}`\n\t? `${Uppercase<First>}${Rest}`\n\t: S\n\n/**\n * Recursively transforms a snake_case string literal type to camelCase.\n * e.g., 'SOME_API_KEY' -> 'someApiKey'\n * 'HELLO_WORLD' -> 'helloWorld'\n * 'WORD' -> 'word'\n */\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n\t? `${Lowercase<T>}${CapitalizeString<SnakeToCamelCase<U>>}` // Lowercase first part, capitalize and recurse on the rest\n\t: Lowercase<S> // Base case: No underscore, just lowercase the whole thing\n\n/**\n * Converts a string from snake_case, UPPER_SNAKE_CASE, PascalCase,\n * or ALL_CAPS to camelCase at runtime.\n * If the string is already camelCase or lowercase, it remains unchanged.\n *\n * @param str The input string in snake_case format.\n * @returns The converted string in camelCase format.\n */\nexport function snakeToCamel(str: string): string {\n\tif (!str) {\n\t\treturn ''\n\t}\n\n\t// Case 1: String contains underscores (snake_case)\n\tif (str.includes('_')) {\n\t\tlet result = ''\n\t\tconst parts = str.split('_')\n\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\tconst part = parts[i]\n\t\t\tif (part) {\n\t\t\t\t// Skip empty parts from multiple underscores\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\t// First non-empty part: lowercase the whole part\n\t\t\t\t\tresult += part.toLowerCase()\n\t\t\t\t} else {\n\t\t\t\t\t// Subsequent non-empty parts: capitalize first letter, rest lowercase\n\t\t\t\t\tresult += part[0]!.toUpperCase() + part.slice(1).toLowerCase()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Handle case like \"_SOME_WORD_\" -> \"someWord\"\n\t\t// If the first character of the original string was '_' and result is empty,\n\t\t// it means the string was only underscores, return ''\n\t\t// If the first part was empty ('_WORD'), result starts lowercase correctly.\n\t\treturn result\n\t}\n\n\t// Case 2: String does NOT contain underscores\n\t// Check if it's ALL_CAPS (allowing for numbers)\n\tconst isAllCaps = /^[A-Z0-9]+$/.test(str)\n\tif (isAllCaps) {\n\t\t// e.g., \"WORD\", \"TOKEN123\" -> \"word\", \"token123\"\n\t\treturn str.toLowerCase()\n\t}\n\n\t// Check if it's PascalCase or already camelCase/lowercase\n\t// If the first letter is already lowercase, assume it's camelCase or lowercase\n\tif (str[0] === str[0]!.toLowerCase()) {\n\t\t// e.g., \"helloWorld\", \"word\" -> stays the same\n\t\treturn str\n\t}\n\n\t// Otherwise, assume it's PascalCase: Lowercase only the first character\n\t// e.g., \"HelloWorld\", \"SomeValue\" -> \"helloWorld\", \"someValue\"\n\treturn str[0]!.toLowerCase() + str.slice(1)\n}\n\n/**\n * Converts an object's keys from snake_case or UPPER_SNAKE_CASE to camelCase.\n * The return type precisely maps the input keys to their camelCase versions.\n *\n * @template T The type of the input object, expected to have string keys.\n * @param input The object with snake_case keys.\n * @returns A new object with the same values but camelCase keys, with a specific inferred type.\n */\nexport function convertToCamel<T extends Record<string, any>>(\n\tinput: T\n): { [K in keyof T as SnakeToCamelCase<K & string>]: T[K] } {\n\tconst output: any = {}\n\n\tfor (const key in input) {\n\t\tif (Object.prototype.hasOwnProperty.call(input, key)) {\n\t\t\tconst camelCaseKey = snakeToCamel(key)\n\t\t\toutput[camelCaseKey] = input[key]\n\t\t}\n\t}\n\n\t// We use a type assertion here. While our runtime logic creates the correct\n\t// shape, TypeScript's analysis within the loop isn't powerful enough to\n\t// automatically verify that 'output' perfectly matches the complex mapped type.\n\t// The return type annotation guarantees the type for the caller.\n\treturn output as { [K in keyof T as SnakeToCamelCase<K & string>]: T[K] }\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// Helper to check if a character is lowercase A-Z\ntype IsLower<C extends string> =\n\tLowercase<C> extends Uppercase<C> ? false : C extends Lowercase<C> ? true : false\n// Helper to check if a character is uppercase A-Z\ntype IsUpper<C extends string> =\n\tLowercase<C> extends Uppercase<C> ? false : C extends Uppercase<C> ? true : false\n// Helper to check if a character is a digit 0-9\ntype IsDigit<C extends string> = C extends `${number}` ? true : false\n\n// Recursive inner helper for CamelToSnakeCase\n// PrevChar tracks the *previous* character from the original string\ntype CamelToSnakeInner<S extends string, PrevChar extends string = ''> =\n\t// Base case: If the input string S is empty, return an empty string.\n\tS extends ''\n\t\t? ''\n\t\t: // Recursive step: If S has content...\n\t\t\tS extends `${infer First}${infer Rest}`\n\t\t\t? // --- Logic based on the 'First' character ---\n\n\t\t\t\t// 1. Is 'First' an uppercase letter?\n\t\t\t\tIsUpper<First> extends true\n\t\t\t\t? // 1a. Was 'PrevChar' lowercase or a digit? (Requires underscore)\n\t\t\t\t\tIsLower<PrevChar> extends true\n\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t: IsDigit<PrevChar> extends true\n\t\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t\t: // 1b. 'PrevChar' was uppercase, symbol, or start. Check for acronym ending.\n\t\t\t\t\t\t\tRest extends `${infer NextChar}${string}` // Look ahead\n\t\t\t\t\t\t\t? IsLower<NextChar> extends true // Is the *next* char lowercase?\n\t\t\t\t\t\t\t\t? `_${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // Yes (e.g., API_Key)\n\t\t\t\t\t\t\t\t: `${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // No (e.g., HTTP)\n\t\t\t\t\t\t\t: // 'First' is the last character or followed by non-lowercase.\n\t\t\t\t\t\t\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t: // 2. Is 'First' a digit? (Only checked if not uppercase)\n\t\t\t\t\tIsDigit<First> extends true\n\t\t\t\t\t? // 2a. Was 'PrevChar' a lowercase letter? (Requires underscore)\n\t\t\t\t\t\tIsLower<PrevChar> extends true\n\t\t\t\t\t\t? `_${First}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t\t: // 'PrevChar' was not lowercase (digit, uppercase, symbol, start)\n\t\t\t\t\t\t\t`${First}${CamelToSnakeInner<Rest, First>}`\n\t\t\t\t\t: // 3. 'First' must be a lowercase letter or a symbol.\n\t\t\t\t\t\t// (Symbols are handled like lowercase here - no underscore needed before them)\n\t\t\t\t\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}` // Uppercase letter, append symbol directly\n\t\t\t: // This case should technically not be reachable if S is not '', but included for completeness.\n\t\t\t\t''\n\n/**\n * Type helper to convert a camelCase/PascalCase string literal type\n * to an UPPER_SNAKE_CASE string literal type. Handles common cases\n * including transitions from lower to upper, letters to digits, and basic acronyms.\n *\n * Examples:\n * 'userId' -> 'USER_ID'\n * 'userName' -> 'USER_NAME'\n * 'isActive' -> 'IS_ACTIVE'\n * 'APIKey' -> 'API_KEY'\n * 'version10' -> 'VERSION_10'\n * 'apiV2Client' -> 'API_V2_CLIENT'\n */\ntype CamelToSnakeCase<S extends string> = S extends `${infer First}${infer Rest}`\n\t? // Uppercase the very first character, then process the rest using the inner helper\n\t\t`${Uppercase<First>}${CamelToSnakeInner<Rest, First>}`\n\t: // Handle single character or empty string\n\t\tUppercase<S>\n\n/**\n * Converts a camelCase or PascalCase string to UPPER_SNAKE_CASE.\n * Handles acronyms and numbers within the string.\n *\n * **Examples:**\n * ```\n * 'helloWorld' -> 'HELLO_WORLD'\n * 'HelloWorld' -> 'HELLO_WORLD'\n * 'someAPIKey' -> 'SOME_API_KEY'\n * 'getHttpResponseCode' -> 'GET_HTTP_RESPONSE_CODE'\n * 'version10' -> 'VERSION_10' // Fixed\n * 'version10Alpha' -> 'VERSION_10_ALPHA' // Fixed\n * 'apiV2Client' -> 'API_V2_CLIENT'\n * 'releaseV10' -> 'RELEASE_V10'\n * 'version2Data' -> 'VERSION_2_DATA' // Fixed\n * 'word' -> 'WORD'\n *```\n * @param str The input string in camelCase or PascalCase format.\n * @returns The converted string in UPPER_SNAKE_CASE format.\n */\nexport function camelToSnake(str: string): string {\n\tif (!str) {\n\t\treturn ''\n\t}\n\n\t// The sequence matters:\n\tconst result = str\n\t\t// 1. Add _ before an uppercase letter that is followed by a lowercase letter,\n\t\t// but only if the uppercase letter is not the start of the string and\n\t\t// is preceded by another uppercase letter (handles acronyms like APIKey -> API_Key).\n\t\t.replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n\t\t// 2. Add _ before an uppercase letter that is preceded by a lowercase letter or a digit.\n\t\t// (handles helloWorld -> hello_World, version10Update -> version10_Update, apiV2Client -> api_V2Client)\n\t\t.replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n\t\t// 3. Add _ between a lowercase letter and a number.\n\t\t// (handles version10 -> version_10, but NOT V10 -> V_10 because V is uppercase)\n\t\t.replace(/([a-z])(\\d)/g, '$1_$2')\n\n\t// Convert the entire result to uppercase\n\treturn result.toUpperCase()\n}\n\n/**\n * Converts an object's keys from camelCase/PascalCase to UPPER_SNAKE_CASE.\n * Provides compile-time type safety for the converted keys based on common patterns.\n *\n * @template T The type of the input object.\n * @param input The object with camelCase/PascalCase keys.\n * @returns A new object with the same values but UPPER_SNAKE_CASE keys,\n * with an inferred type reflecting the key transformation.\n */\nexport function convertToSnake<T extends Record<string, any>>(\n\tinput: T\n\t// Apply the mapped type with key remapping using the type helper\n): { [K in keyof T as CamelToSnakeCase<K & string>]: T[K] } {\n\tconst output: any = {} // Initialize as 'any' or '{}'\n\n\tfor (const key in input) {\n\t\tif (Object.prototype.hasOwnProperty.call(input, key)) {\n\t\t\tconst snakeCaseKey = camelToSnake(key) // Runtime conversion\n\t\t\toutput[snakeCaseKey] = input[key]\n\t\t}\n\t}\n\n\t// Type assertion: We trust the runtime `camelToSnake` logic produces keys\n\t// matching the structure defined by the `CamelToSnakeCase` type helper.\n\t// This is needed because TS can't perfectly verify the runtime logic\n\t// against the complex type-level logic for all possible inputs.\n\treturn output as { [K in keyof T as CamelToSnakeCase<K & string>]: T[K] }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["constants", "AsyncLocalStorage", "envStorage", "extractParamNames", "func", "funcStr", "paramsMatch", "cleanedParamsStr", "param", "name", "ParamsToEnv", "_target", "propertyKey", "descriptor", "originalMethod", "paramNames", "args", "parentContext", "newEnv", "currentParams", "index", "mergedEnv", "contextToStore", "matcher", "Symbol", "for", "isVariadic", "anonymousSelectKey", "isObject", "value", "Boolean", "isMatcher", "x", "symbols", "matchPattern", "pattern", "select", "matched", "selections", "match", "Object", "keys", "forEach", "key", "Array", "isArray", "startPatterns", "endPatterns", "variadicPatterns", "i", "subpattern", "push", "length", "Error", "startValues", "slice", "endValues", "middleValues", "Infinity", "every", "subPattern", "Reflect", "ownKeys", "k", "matcherType", "is", "getSelectionKeys", "_pattern$symbols$matc", "_pattern$symbols$matc2", "_pattern$symbols$matc3", "call", "flatMap", "values", "xs", "f", "reduce", "acc", "concat", "chainable", "pattern", "Object", "assign", "optional", "and", "p2", "intersection", "or", "union", "select", "key", "optional", "pattern", "chainable", "matcher", "match", "value", "selections", "selector", "key", "getSelectionKeys", "forEach", "undefined", "matched", "matchPattern", "matcherType", "intersection", "patterns", "chainable", "matcher", "match", "value", "selections", "selector", "key", "matched", "every", "p", "matchPattern", "getSelectionKeys", "flatMap", "matcherType", "union", "forEach", "undefined", "some", "when", "predicate", "Boolean", "select", "args", "pattern", "length", "symbols", "concat", "isNumber", "x", "isString", "isBigInt", "any", "stringChainable", "pattern", "Object", "assign", "chainable", "startsWith", "str", "intersection", "start", "when", "value", "isString", "endsWith", "end", "minLength", "min", "length", "len", "maxLength", "max", "includes", "substr", "regex", "expr", "Boolean", "match", "string", "numberChainable", "between", "isNumber", "lt", "gt", "lte", "gte", "int", "Number", "isInteger", "finite", "isFinite", "positive", "negative", "number", "bigintChainable", "betweenBigInt", "isBigInt", "bigint", "boolean", "x", "symbol", "nullish", "nonNullable", "NonExhaustiveError", "Error", "constructor", "input", "displayedValue", "JSON", "stringify", "e", "super", "this", "unmatched", "matched", "value", "undefined", "match", "MatchExpression", "state", "with", "args", "handler", "length", "patterns", "predicate", "push", "slice", "hasSelections", "selected", "select", "key", "some", "pattern", "matchPattern", "symbols", "when", "Boolean", "otherwise", "exhaustive", "unexpectedValueHandler", "defaultCatcher", "run", "returnType", "shell", "shellName", "input", "trimmedInput", "i", "l", "z", "path", "join", "existsSync", "dirname", "isAbsolute", "join", "resolve", "absolute", "input", "root", "isAbsolute", "resolve", "up", "base", "options", "stop", "cwd", "tmp", "absolute", "root", "prev", "arr", "dirname", "up", "name", "options", "dir", "tmp", "start", "join", "existsSync", "getModulePath", "cwd", "lockfile", "up", "repoRoot", "path", "daggerJson", "snakeToCamel", "str", "result", "parts", "i", "part", "convertToCamel", "input", "output", "key", "camelCaseKey", "camelToSnake", "str", "convertToSnake", "input", "output", "key", "snakeCaseKey"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jahands/dagger-helpers",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "private": false,
5
5
  "description": "dagger.io helpers for my own projects - not meant for public use",
6
6
  "keywords": [
@@ -24,23 +24,23 @@
24
24
  ".": {
25
25
  "import": {
26
26
  "types": "./dist/index.d.ts",
27
- "default": "./dist/index.js"
27
+ "default": "./dist/index.mjs"
28
28
  }
29
29
  }
30
30
  },
31
- "main": "./dist/index.js",
32
- "module": "./dist/index.js",
31
+ "main": "./dist/index.mjs",
32
+ "module": "./dist/index.mjs",
33
33
  "files": [
34
34
  "dist"
35
35
  ],
36
36
  "devDependencies": {
37
- "@types/node": "20.8.3",
38
- "empathic": "1.0.0",
39
- "ts-pattern": "5.6.2",
37
+ "@types/node": "22.15.18",
38
+ "empathic": "1.1.0",
39
+ "ts-pattern": "5.7.0",
40
40
  "typescript": "5.5.4",
41
- "vitest": "2.1.1",
42
- "@repo/tools": "0.9.3",
43
- "@repo/typescript-config": "0.3.4"
41
+ "vitest": "3.1.3",
42
+ "@repo/tools": "0.10.2",
43
+ "@repo/typescript-config": "0.3.5"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@dagger.io/dagger": "^0.18.4"