@willbooster/wb 22.20.0 → 22.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,7 +19,7 @@ Commands:
19
19
  WB_ENV. Prefix scripts that write to remote
20
20
  environments with this command to fail fast on
21
21
  missing secrets.
22
- wb code-gauge Print code-gauge errors and warnings without
22
+ wb code-gauge [target] Print code-gauge errors and warnings without
23
23
  failing
24
24
  wb concurrently <commands...> Run commands concurrently
25
25
  wb deploy Deploy to the WB_ENV environment. A Cloudflare
@@ -191,12 +191,16 @@ For `wb verify` and `wb verify --full`, a log-write failure falls back to printi
191
191
 
192
192
  `wb code-gauge` runs [`code-gauge check`](https://github.com/WillBooster/code-gauge#threshold-check-code-gauge-check)
193
193
  on the project and prints every threshold violation as an error or a warning: functions and files
194
- over a metric limit, and duplicated blocks. `--base <ref>` limits them to what the working tree
195
- changed since the merge-base with `<ref>`. The command always exits with 0, including when there
196
- are errors or the check cannot complete.
194
+ over a metric limit, and duplicated blocks. A path limits the check to that file or directory (a directory's
195
+ test files are skipped, so a directory holding only test files is reported as unchecked, while a
196
+ file named as the path is checked even when it is a test file), and
197
+ `--base <ref>` to what the working tree changed since the merge-base with `<ref>`, in which case a
198
+ path without a changed file to check prints nothing. The command
199
+ always exits with 0, including when there are errors or the check cannot complete.
197
200
 
198
201
  ```sh
199
202
  bun wb code-gauge
203
+ bun wb code-gauge packages/app/src
200
204
  bun wb code-gauge --base origin/HEAD
201
205
  ```
202
206
 
@@ -204,8 +208,9 @@ bun wb code-gauge --base origin/HEAD
204
208
  violations after the recap: the totals per level, how many are in code changed since the merge-base
205
209
  with `origin/HEAD`, and at most 10 violations: those in the changed code first, then the rest, each
206
210
  group with its errors before its warnings. A limit milder than its line's level names its own, as in
207
- `error: ... function cognitive complexity 56 (max 30), function ncss 61 (warning max 60)`. The step
208
- never fails verification.
211
+ `error: ... function cognitive complexity 56 (max 30; largest parts L12-31 19, L33-40 isLegacy 8), function ncss 41 (warning max 30)`,
212
+ where the largest parts are the lines adding the most to the cognitive complexity. The step never
213
+ fails verification.
209
214
 
210
215
  wb uses its own `code-gauge` and code-gauge's default thresholds; a `code-gauge.config.json` in the
211
216
  repository overrides them.
@@ -0,0 +1,4 @@
1
+ import e from"node:fs";import t from"node:path";import{spawn as n}from"node:child_process";import{z as r}from"zod";const i=`willbooster-wb-release (https://github.com/WillBooster/shared)`,a=[1,2,4,8,16];function o(e){return async(t,n,r,i)=>{let a=await s(`https://api.github.com/repos/${e.GITHUB_REPOSITORY}/${n}`,{method:t,headers:{Accept:`application/vnd.github+json`,Authorization:`Bearer ${e.GITHUB_TOKEN}`},...r!==void 0&&{body:JSON.stringify(r)}},i);if(!a.ok)throw Error(`${t} ${n} failed: ${a.status} ${await a.text()}`);return a.status===204?void 0:a.json()}}async function s(e,t,{findCreated:n,repeatable:r}={}){for(let i=0;;i++){let o=await c(e,t),s=o instanceof Response?o:void 0;if(i>0&&t.method===`DELETE`&&s&&await u(s))return new Response(void 0,{status:204});let f=s&&await d(s);if(s&&f===void 0&&s.status<500)return s;let p=t.method===`POST`&&!r&&f===void 0,m=p?a[0]:Math.max(a[i]??1/0,f??0);if(m>300||p&&!n)return l(o);let h=s?`${s.status} ${s.statusText}`:`a dropped connection`;if(console.info(`${p?`Looking for the result of`:`Retrying`} ${t.method??`GET`} ${e} in ${Math.ceil(m)} seconds after ${h}`),await new Promise(e=>setTimeout(e,m*1e3)),p&&n){let e=await n();return e?Response.json(e):l(o)}}}async function c(e,t){try{let n=await fetch(e,t),r=await n.arrayBuffer();return new Response(r.byteLength>0?r:void 0,n)}catch(e){if(!(e instanceof TypeError))throw e;return e}}function l(e){if(e instanceof TypeError)throw e;return e}async function u(e){if(e.status===404)return!0;let t=await e.clone().text();return e.status===422&&t.includes(`"Reference does not exist"`)}async function d(e){if(!(e.status===429||e.status===403&&/rate limit/i.test(await e.clone().text())))return;let t=Date.now()/1e3,n=e.headers.get(`retry-after`)??``,r=e.headers.get(`x-ratelimit-remaining`)===`0`&&e.headers.get(`x-ratelimit-reset`),i=[/^\d+$/.test(n)?Number(n):Date.parse(n)/1e3-t,r?Number(r)-t:NaN].filter(e=>Number.isFinite(e));return i.length>0?Math.max(...i):60}const f=`@willbooster/wb/release-plugin`,p=t.join(`script`,`build-release`),m=`
2
+
3
+ <!-- pending release -->`,h=r.object({crate:r.string().min(1).optional(),pkgRoot:r.string().min(1)}),g=r.object({id:r.number(),tag_name:r.string(),target_commitish:r.string(),draft:r.boolean(),body:r.string().nullable(),html_url:r.string()});function _(e){if(e!==void 0&&e!=="v${version}")throw Error(`${f} requires semantic-release's default tagFormat \`v\${version}\`.`)}async function v(e,n,r,i){await D(t.join(e,p),[r],e,n,i)}async function y(e,{gitHead:t,gitTag:n,name:r,notes:i}){let a=await b(e,n)??g.parse(await e(`POST`,`releases`,{tag_name:n,target_commitish:t,name:r,body:`${i??``}${m}`,draft:!0},{findCreated:()=>b(e,n)}));if(a.target_commitish!==t)throw Error(`The draft release ${n} targets ${a.target_commitish}, not ${t}.`);return a}async function b(e,t){return(await x(e)).find(e=>e.tag_name===t)}async function x(e){return r.array(g).parse(await e(`GET`,`releases?per_page=100`)).filter(e=>e.draft&&e.body?.endsWith(m))}async function S({config:{crate:e,pkgRoot:n},cwd:r,env:i,logger:a,draft:s,version:c,tracker:l}){let u=s.target_commitish,d=t.resolve(r,n),f=(await C({crate:e,cwd:r,pkgRoot:n,version:c})).map(t=>({...t,...t.registry===`crates.io`&&e?{dryRun:()=>D(`cargo`,[`publish`,`--dry-run`,`--allow-dirty`,`-p`,e],r,i,l),publish:()=>T(e,r,i,l)}:{dryRun:()=>D(`npm`,[`publish`,`--dry-run`],d,i,l),publish:()=>D(`npm`,[`publish`],d,i,l)}}));for(let{commit:e,name:t}of f)if(e!==void 0&&e!==u)throw Error(`${t} was published from ${e||`an unknown commit`}, not from ${u}.`);let p=f.filter(({commit:e})=>e===void 0);for(let e of p)await e.dryRun();for(let e of f)p.includes(e)?await e.publish():a.log(`Skipped ${e.name}, which is already published from ${u}`);let m=g.parse(await o(i)(`PATCH`,`releases/${s.id}`,{draft:!1,body:s.body?.slice(0,-26)}));a.log(`Published the GitHub Release ${m.html_url}`)}async function C({crate:n,cwd:i,pkgRoot:a,version:o}){let{name:s}=r.object({name:r.string()}).parse(JSON.parse(e.readFileSync(t.resolve(i,a,`package.json`),`utf8`)));return[...n?[{registry:`crates.io`,name:`${n}@${o} on crates.io`,commit:await w(`https://crates.io/api/v1/crates/${n}/${o}`,e=>r.object({version:r.object({trustpub_data:r.object({sha:r.string()}).nullish()})}).parse(e).version.trustpub_data?.sha)}]:[],{registry:`npm`,name:`${s}@${o} on npm`,commit:await w(`https://registry.npmjs.org/${s.replace(`/`,`%2f`)}/${o}`,e=>r.object({gitHead:r.string().optional()}).parse(e).gitHead)}]}async function w(e,t){let n=await s(e,{headers:{"User-Agent":i}});if(n.status!==404){if(!n.ok)throw Error(`GET ${e} failed: ${n.status} ${await n.text()}`);return t(await n.json())??``}}async function T(e,t,n,a){let{value:o}=r.object({value:r.string()}).parse(await E(`${n.ACTIONS_ID_TOKEN_REQUEST_URL}&audience=crates.io`,{headers:{Authorization:`Bearer ${n.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})),c=`https://crates.io/api/v1/trusted_publishing/tokens`,{token:l}=r.object({token:r.string()}).parse(await E(c,{method:`POST`,headers:{"Content-Type":`application/json`,"User-Agent":i},body:JSON.stringify({jwt:o})},!0));try{await D(`cargo`,[`publish`,`-p`,e,`--allow-dirty`],t,{...n,CARGO_REGISTRY_TOKEN:l},a)}finally{let e=await s(c,{method:`DELETE`,headers:{Authorization:`Bearer ${l}`,"User-Agent":i}}).catch(e=>e);(!(e instanceof Response)||!e.ok)&&console.warn(`Failed to revoke the crates.io token.`)}}async function E(e,t,n=!1){let r=await s(e,t,{repeatable:n});if(!r.ok)throw Error(`${t.method??`GET`} ${e} failed: ${r.status}`);return r.json()}async function D(e,t,r,i,a){let o=await new Promise((o,s)=>{let c=n(e,t,{cwd:r,env:i,stdio:`inherit`});a&&(a.current=c),c.on(`error`,s).on(`exit`,o)}).finally(()=>{a&&(a.current=void 0)});if(o!==0)throw Error(`${e} ${t.join(` `)} exited with ${o}.`)}export{y as a,h as c,o as d,b as i,f as l,p as n,x as o,C as r,S as s,_ as t,v as u};
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZnRSZWxlYXNlLURTQTR5X3NRLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWxlYXNlL2h0dHAudHMiLCIuLi9zcmMvcmVsZWFzZS9kcmFmdFJlbGVhc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY3JhdGVzLmlvIHJlamVjdHMgcmVxdWVzdHMgd2l0aCBhIGdlbmVyaWMgVXNlci1BZ2VudC5cbmV4cG9ydCBjb25zdCB1c2VyQWdlbnQgPSAnd2lsbGJvb3N0ZXItd2ItcmVsZWFzZSAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZCknO1xuXG4vLyBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGVhY2ggcmV0cnkgb2YgYSByZXF1ZXN0IHRoYXQgZmFpbGVkIHRyYW5zaWVudGx5LlxuY29uc3QgcmV0cnlEZWxheXMgPSBbMSwgMiwgNCwgOCwgMTZdO1xuLy8gR2l0SHViIGFza3MgdG8gd2FpdCBhdCBsZWFzdCBhIG1pbnV0ZSBhZnRlciBhIHNlY29uZGFyeSByYXRlIGxpbWl0IHRoYXQgc3RhdGVzIG5vIHRpbWUuXG5jb25zdCBkZWZhdWx0UmF0ZUxpbWl0RGVsYXkgPSA2MDtcbi8vIEEgcmF0ZSBsaW1pdCB0aGF0IGxhc3RzIGxvbmdlciBmYWlscyB0aGUgcnVuIGluc3RlYWQsIHdoaWNoIGEgcmUtcnVuIGNvbXBsZXRlcy5cbmNvbnN0IG1heFJldHJ5RGVsYXkgPSAzMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqIExvb2tzIGZvciB3aGF0IGEgUE9TVCB0aGF0IG1heSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGNyZWF0ZWQuICovXG4gIGZpbmRDcmVhdGVkPzogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIFdoZXRoZXIgYSBQT1NUIG1heSBiZSByZXBlYXRlZCBhZnRlciBhIGZhaWx1cmUgdGhhdCB0aGUgc2VydmVyIG1heSBoYXZlIHByb2Nlc3NlZC4gKi9cbiAgcmVwZWF0YWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEdpdEh1YkNsaWVudCA9IChtZXRob2Q6IHN0cmluZywgcm91dGU6IHN0cmluZywgYm9keT86IHVua25vd24sIG9wdGlvbnM/OiBSZXRyeU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG5cbi8qKlxuICogVGhlIHJldHVybmVkIGNsaWVudCBuZXZlciByZXBlYXRzIGEgUE9TVCBhZnRlciBhIGZhaWx1cmUgdGhhdCBHaXRIdWIgbWF5IGhhdmUgcHJvY2Vzc2VkLCBzaW5jZSBhIGxpc3RpbmcgY2Fubm90IHByb3ZlXG4gKiB0aGF0IHRoZSBQT1NUIGNyZWF0ZWQgbm90aGluZywgdW5sZXNzIHRoZSBQT1NUIGlzIGByZXBlYXRhYmxlYC4gYGZpbmRDcmVhdGVkYCB0aGVuIGxvb2tzIGZvciB3aGF0IGl0IGNyZWF0ZWQsIHdoaWNoXG4gKiB0aGUgY2xpZW50IHJldHVybnMgaWYgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHaXRIdWJDbGllbnQoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogR2l0SHViQ2xpZW50IHtcbiAgcmV0dXJuIGFzeW5jIChtZXRob2QsIHJvdXRlLCBib2R5LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShcbiAgICAgIGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7ZW52LkdJVEhVQl9SRVBPU0lUT1JZfS8ke3JvdXRlfWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7ZW52LkdJVEhVQl9UT0tFTn1gIH0sXG4gICAgICAgIC4uLihib2R5ICE9PSB1bmRlZmluZWQgJiYgeyBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSB9KSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYCR7bWV0aG9kfSAke3JvdXRlfSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKTtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAyMDQgPyB1bmRlZmluZWQgOiByZXNwb25zZS5qc29uKCk7XG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2hlcyBgdXJsYCwgcmV0cnlpbmcgYSBkcm9wcGVkIGNvbm5lY3Rpb24sIGEgNXh4IHJlc3BvbnNlLCBhbmQgYSByYXRlIGxpbWl0LiBVbmxpa2UgYSByYXRlLWxpbWl0ZWQgcmVxdWVzdCwgdGhlXG4gKiBvdGhlcnMgbWF5IGhhdmUgYmVlbiBwcm9jZXNzZWQsIHNvIGEgUE9TVCBpcyBub3QgcmVwZWF0ZWQgYWZ0ZXIgdGhlbSB1bmxlc3MgaXQgaXMgYHJlcGVhdGFibGVgLCBhbmQgYSByZXBlYXRlZCBERUxFVEVcbiAqIHRoYXQgZmluZHMgbm90aGluZyBsZWZ0IHRvIGRlbGV0ZSBzdWNjZWVkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFJldHJ5KFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdDogUmVxdWVzdEluaXQsXG4gIHsgZmluZENyZWF0ZWQsIHJlcGVhdGFibGUgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXaG9sZVJlc3BvbnNlKHVybCwgaW5pdCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZSA/IHJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgICBpZiAoYXR0ZW1wdCA+IDAgJiYgaW5pdC5tZXRob2QgPT09ICdERUxFVEUnICYmIHJlc3BvbnNlICYmIChhd2FpdCBpc0Fic2VudChyZXNwb25zZSkpKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHVuZGVmaW5lZCwgeyBzdGF0dXM6IDIwNCB9KTtcbiAgICB9XG4gICAgY29uc3QgcmF0ZUxpbWl0RGVsYXkgPSByZXNwb25zZSAmJiAoYXdhaXQgZ2V0UmF0ZUxpbWl0RGVsYXkocmVzcG9uc2UpKTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmF0ZUxpbWl0RGVsYXkgPT09IHVuZGVmaW5lZCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDApIHJldHVybiByZXNwb25zZTtcbiAgICBjb25zdCBpc1VuY2VydGFpblBvc3QgPSBpbml0Lm1ldGhvZCA9PT0gJ1BPU1QnICYmICFyZXBlYXRhYmxlICYmIHJhdGVMaW1pdERlbGF5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVsYXkgPSBpc1VuY2VydGFpblBvc3QgPyByZXRyeURlbGF5c1swXSEgOiBNYXRoLm1heChyZXRyeURlbGF5c1thdHRlbXB0XSA/PyBJbmZpbml0eSwgcmF0ZUxpbWl0RGVsYXkgPz8gMCk7XG4gICAgaWYgKGRlbGF5ID4gbWF4UmV0cnlEZWxheSB8fCAoaXNVbmNlcnRhaW5Qb3N0ICYmICFmaW5kQ3JlYXRlZCkpIHJldHVybiB1bndyYXBSZXNwb25zZShyZXN1bHQpO1xuXG4gICAgY29uc3QgcmVhc29uID0gcmVzcG9uc2UgPyBgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gIDogJ2EgZHJvcHBlZCBjb25uZWN0aW9uJztcbiAgICBjb25zdCBhY3Rpb24gPSBpc1VuY2VydGFpblBvc3QgPyAnTG9va2luZyBmb3IgdGhlIHJlc3VsdCBvZicgOiAnUmV0cnlpbmcnO1xuICAgIGNvbnNvbGUuaW5mbyhgJHthY3Rpb259ICR7aW5pdC5tZXRob2QgPz8gJ0dFVCd9ICR7dXJsfSBpbiAke01hdGguY2VpbChkZWxheSl9IHNlY29uZHMgYWZ0ZXIgJHtyZWFzb259YCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkgKiAxMDAwKSk7XG4gICAgaWYgKGlzVW5jZXJ0YWluUG9zdCAmJiBmaW5kQ3JlYXRlZCkge1xuICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGZpbmRDcmVhdGVkKCk7XG4gICAgICByZXR1cm4gY3JlYXRlZCA/IFJlc3BvbnNlLmpzb24oY3JlYXRlZCkgOiB1bndyYXBSZXNwb25zZShyZXN1bHQpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogUmVzb2x2ZXMgdG8gdGhlIGNvbm5lY3Rpb24gZXJyb3IgaW5zdGVhZCBvZiByZWplY3Rpbmcgd2hlbiB0aGUgY29ubmVjdGlvbiBmYWlscyBvciBkcm9wcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV2hvbGVSZXNwb25zZSh1cmw6IHN0cmluZywgaW5pdDogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlIHwgVHlwZUVycm9yPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVjZWl2ZWQgPSBhd2FpdCBmZXRjaCh1cmwsIGluaXQpO1xuICAgIC8vIFJlYWQgaGVyZSBzbyB0aGF0IGEgY29ubmVjdGlvbiBkcm9wcGVkIHdoaWxlIHJlY2VpdmluZyB0aGUgYm9keSBpcyByZXRyaWVkIHRvby5cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVjZWl2ZWQuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHkuYnl0ZUxlbmd0aCA+IDAgPyBib2R5IDogdW5kZWZpbmVkLCByZWNlaXZlZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gZmV0Y2ggYW5kIHJlYWRpbmcgdGhlIGJvZHkgcmVqZWN0IHdpdGggYSBUeXBlRXJyb3Igd2hlbiB0aGUgY29ubmVjdGlvbiBmYWlscyBvciBkcm9wcy5cbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikpIHRocm93IGVycm9yO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndyYXBSZXNwb25zZShyZXN1bHQ6IFJlc3BvbnNlIHwgVHlwZUVycm9yKTogUmVzcG9uc2Uge1xuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVHlwZUVycm9yKSB0aHJvdyByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlc3BvbnNlIHJlcG9ydHMgdGhhdCB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0LiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNBYnNlbnQocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkgcmV0dXJuIHRydWU7XG4gIC8vIEdpdEh1YiByZXBvcnRzIGEgbWlzc2luZyBHaXQgcmVmZXJlbmNlIHdpdGggYSA0MjIgcmVzcG9uc2UsIHdoaWNoIGFsc28gcmVwb3J0cyBvdGhlciB2YWxpZGF0aW9uIGZhaWx1cmVzLlxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCk7XG4gIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQyMiAmJiB0ZXh0LmluY2x1ZGVzKCdcIlJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdFwiJyk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJlcGVhdGluZyBhIHJhdGUtbGltaXRlZCByZXF1ZXN0LCBvciBgdW5kZWZpbmVkYCBmb3IgYW5vdGhlciByZXNwb25zZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJhdGVMaW1pdERlbGF5KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGlzUmF0ZUxpbWl0ZWQgPVxuICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5IHx8IChyZXNwb25zZS5zdGF0dXMgPT09IDQwMyAmJiAvcmF0ZSBsaW1pdC9pLnRlc3QoYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCkpKTtcbiAgaWYgKCFpc1JhdGVMaW1pdGVkKSByZXR1cm47XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAvLyBFaXRoZXIgc2Vjb25kcyBvciBhbiBIVFRQIGRhdGUuXG4gIGNvbnN0IHJldHJ5QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKSA/PyAnJztcbiAgY29uc3QgcmVzZXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJykgPT09ICcwJyAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQnKTtcbiAgY29uc3QgZGVsYXlzID0gW1xuICAgIC9eXFxkKyQvLnRlc3QocmV0cnlBZnRlcikgPyBOdW1iZXIocmV0cnlBZnRlcikgOiBEYXRlLnBhcnNlKHJldHJ5QWZ0ZXIpIC8gMTAwMCAtIG5vdyxcbiAgICByZXNldCA/IE51bWJlcihyZXNldCkgLSBub3cgOiBOdW1iZXIuTmFOLFxuICBdO1xuICBjb25zdCBzdGF0ZWREZWxheXMgPSBkZWxheXMuZmlsdGVyKChkZWxheSkgPT4gTnVtYmVyLmlzRmluaXRlKGRlbGF5KSk7XG4gIHJldHVybiBzdGF0ZWREZWxheXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLnN0YXRlZERlbGF5cykgOiBkZWZhdWx0UmF0ZUxpbWl0RGVsYXk7XG59XG4iLCIvLyBUaGUgZHJhZnQtZmlyc3QgcmVsZWFzZTogZXZlcnkgcmVnaXN0cnkgcmVjZWl2ZXMgdGhlIHZlcnNpb24gYmVmb3JlIHRoZSB2ZXJzaW9uIHRhZyBleGlzdHMuIHNlbWFudGljLXJlbGVhc2UgcHVzaGVzXG4vLyB0aGUgdGFnIGJldHdlZW4gYHByZXBhcmVgIGFuZCBgcHVibGlzaGAsIHNvIGEgZmFpbHVyZSBpbiBgcHVibGlzaGAgd291bGQgbGVhdmUgdGhlIHRhZyBiZWhpbmQsIGFuZCBhIHJlLXJ1biB3b3VsZFxuLy8gZmluZCBubyBuZXcgY29tbWl0cyBhbmQgbmV2ZXIgY29tcGxldGUgdGhlIHJlbGVhc2UuIEhlcmUgdGhlIHRhZyBpcyBjcmVhdGVkIGxhc3QsIGJ5IHB1Ymxpc2hpbmcgYSBkcmFmdCBHaXRIdWJcbi8vIFJlbGVhc2UgdGhhdCByZWNvcmRzIHRoZSB2ZXJzaW9uLCB0aGUgY29tbWl0LCBhbmQgdGhlIG5vdGVzIGJlZm9yZSBhbnkgcmVnaXN0cnkgcmVjZWl2ZXMgdGhlIHZlcnNpb24uIEEgcmUtcnVuIG9mIGFcbi8vIGZhaWxlZCByZWxlYXNlIGNvbXB1dGVzIHRoZSBzYW1lIHZlcnNpb24gYW5kIHNraXBzIGVhY2ggcmVnaXN0cnkgdGhhdCBhbHJlYWR5IGhvbGRzIGl0IGZyb20gdGhlIHNhbWUgY29tbWl0O1xuLy8gYHdiIHJlbGVhc2VgIGNvbXBsZXRlcyBhIHJlbGVhc2UgbGVmdCBwZW5kaW5nIHdoZW4gYSBuZXdlciBjb21taXQgcmVhY2hlcyB0aGUgYnJhbmNoIChzZWUgcGVuZGluZ1JlbGVhc2UudHMpLlxuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgY3JlYXRlR2l0SHViQ2xpZW50LCBmZXRjaFdpdGhSZXRyeSwgdXNlckFnZW50IH0gZnJvbSAnLi9odHRwLmpzJztcbmltcG9ydCB0eXBlIHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9odHRwLmpzJztcblxuZXhwb3J0IGNvbnN0IHJlbGVhc2VQbHVnaW5OYW1lID0gJ0B3aWxsYm9vc3Rlci93Yi9yZWxlYXNlLXBsdWdpbic7XG4vLyBXcml0ZXMgdGhlIHJlbGVhc2UgdmVyc2lvbiBnaXZlbiBhcyBpdHMgYXJndW1lbnQgYW5kIGJ1aWxkcyBldmVyeSBhcnRpZmFjdCB0aGUgcmVsZWFzZSBwdWJsaXNoZXMuXG5leHBvcnQgY29uc3QgYnVpbGRTY3JpcHRQYXRoID0gcGF0aC5qb2luKCdzY3JpcHQnLCAnYnVpbGQtcmVsZWFzZScpO1xuLy8gTWFya3MgdGhlIGRyYWZ0cyB0aGlzIHJlbGVhc2UgZmxvdyBjcmVhdGVzLCBzbyB0aGF0IGl0IG5ldmVyIGNvbXBsZXRlcyBvciBkZWxldGVzIGEgZHJhZnQgc29tZW9uZSBlbHNlIHByZXBhcmVkLlxuY29uc3QgcGVuZGluZ01hcmtlciA9ICdcXG5cXG48IS0tIHBlbmRpbmcgcmVsZWFzZSAtLT4nO1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZVBsdWdpbkNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gT21pdHRlZCBmb3IgYSByZXBvc2l0b3J5IHRoYXQgcHVibGlzaGVzIG9ubHkgdGhlIG5wbSBwYWNrYWdlLlxuICBjcmF0ZTogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgcGtnUm9vdDogei5zdHJpbmcoKS5taW4oMSksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGVhc2VQbHVnaW5Db25maWcgPSB6LmluZmVyPHR5cGVvZiByZWxlYXNlUGx1Z2luQ29uZmlnU2NoZW1hPjtcblxuY29uc3QgcmVsZWFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHoubnVtYmVyKCksXG4gIHRhZ19uYW1lOiB6LnN0cmluZygpLFxuICB0YXJnZXRfY29tbWl0aXNoOiB6LnN0cmluZygpLFxuICBkcmFmdDogei5ib29sZWFuKCksXG4gIGJvZHk6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgaHRtbF91cmw6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlbGVhc2UgPSB6LmluZmVyPHR5cGVvZiByZWxlYXNlU2NoZW1hPjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXIge1xuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbnR5cGUgRW52ID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuLyoqIEhvbGRzIHRoZSBydW5uaW5nIGNoaWxkIHByb2Nlc3Mgc28gdGhhdCBgd2IgcmVsZWFzZWAncyBzaWduYWwgaGFuZGxlciBjYW4gdGVybWluYXRlIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGlsZFRyYWNrZXIge1xuICBjdXJyZW50OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBBIGxhdGVyIHJ1biByZWFkcyB0aGUgdmVyc2lvbiBiYWNrIGZyb20gdGhlIHRhZyBvZiBhIHBlbmRpbmcgZHJhZnQgYnkgcmVtb3ZpbmcgdGhlIGB2YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWZhdWx0VGFnRm9ybWF0KHRhZ0Zvcm1hdDogdW5rbm93bik6IHZvaWQge1xuICBpZiAodGFnRm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgdGFnRm9ybWF0ICE9PSAndiR7dmVyc2lvbn0nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGVhc2VQbHVnaW5OYW1lfSByZXF1aXJlcyBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCB0YWdGb3JtYXQgXFxgdlxcJHt2ZXJzaW9ufVxcYC5gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTY3JpcHQoY3dkOiBzdHJpbmcsIGVudjogRW52LCB2ZXJzaW9uOiBzdHJpbmcsIHRyYWNrZXI/OiBDaGlsZFRyYWNrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuKHBhdGguam9pbihjd2QsIGJ1aWxkU2NyaXB0UGF0aCksIFt2ZXJzaW9uXSwgY3dkLCBlbnYsIHRyYWNrZXIpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgZHJhZnQgcmVsZWFzZSBvZiBgZ2l0VGFnYCB0aGF0IHRoaXMgcmVsZWFzZSBmbG93IGNyZWF0ZWQsIGNyZWF0aW5nIGl0IGlmIGFic2VudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kT3JDcmVhdGVEcmFmdFJlbGVhc2UoXG4gIGdpdGh1YjogR2l0SHViQ2xpZW50LFxuICB7IGdpdEhlYWQsIGdpdFRhZywgbmFtZSwgbm90ZXMgfTogeyBnaXRIZWFkOiBzdHJpbmc7IGdpdFRhZzogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG5vdGVzPzogc3RyaW5nIH1cbik6IFByb21pc2U8UmVsZWFzZT4ge1xuICBjb25zdCBkcmFmdCA9XG4gICAgKGF3YWl0IGZpbmREcmFmdFJlbGVhc2UoZ2l0aHViLCBnaXRUYWcpKSA/P1xuICAgIHJlbGVhc2VTY2hlbWEucGFyc2UoXG4gICAgICBhd2FpdCBnaXRodWIoXG4gICAgICAgICdQT1NUJyxcbiAgICAgICAgJ3JlbGVhc2VzJyxcbiAgICAgICAgeyB0YWdfbmFtZTogZ2l0VGFnLCB0YXJnZXRfY29tbWl0aXNoOiBnaXRIZWFkLCBuYW1lLCBib2R5OiBgJHtub3RlcyA/PyAnJ30ke3BlbmRpbmdNYXJrZXJ9YCwgZHJhZnQ6IHRydWUgfSxcbiAgICAgICAgeyBmaW5kQ3JlYXRlZDogKCkgPT4gZmluZERyYWZ0UmVsZWFzZShnaXRodWIsIGdpdFRhZykgfVxuICAgICAgKVxuICAgICk7XG4gIGlmIChkcmFmdC50YXJnZXRfY29tbWl0aXNoICE9PSBnaXRIZWFkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHJhZnQgcmVsZWFzZSAke2dpdFRhZ30gdGFyZ2V0cyAke2RyYWZ0LnRhcmdldF9jb21taXRpc2h9LCBub3QgJHtnaXRIZWFkfS5gKTtcbiAgfVxuICByZXR1cm4gZHJhZnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRHJhZnRSZWxlYXNlKGdpdGh1YjogR2l0SHViQ2xpZW50LCBnaXRUYWc6IHN0cmluZyk6IFByb21pc2U8UmVsZWFzZSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBkcmFmdHMgPSBhd2FpdCBsaXN0UGVuZGluZ1JlbGVhc2VzKGdpdGh1Yik7XG4gIHJldHVybiBkcmFmdHMuZmluZCgocmVsZWFzZSkgPT4gcmVsZWFzZS50YWdfbmFtZSA9PT0gZ2l0VGFnKTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGRyYWZ0IHJlbGVhc2VzIHRoYXQgdGhpcyByZWxlYXNlIGZsb3cgY3JlYXRlZCwgd2hpY2ggR2l0SHViIGxpc3RzIGJlZm9yZSB0aGUgcHVibGlzaGVkIHJlbGVhc2VzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQZW5kaW5nUmVsZWFzZXMoZ2l0aHViOiBHaXRIdWJDbGllbnQpOiBQcm9taXNlPFJlbGVhc2VbXT4ge1xuICBjb25zdCByZWxlYXNlcyA9IHouYXJyYXkocmVsZWFzZVNjaGVtYSkucGFyc2UoYXdhaXQgZ2l0aHViKCdHRVQnLCAncmVsZWFzZXM/cGVyX3BhZ2U9MTAwJykpO1xuICByZXR1cm4gcmVsZWFzZXMuZmlsdGVyKChyZWxlYXNlKSA9PiByZWxlYXNlLmRyYWZ0ICYmIHJlbGVhc2UuYm9keT8uZW5kc1dpdGgocGVuZGluZ01hcmtlcikpO1xufVxuXG4vKiogUHVibGlzaGVzIHRoZSB2ZXJzaW9uIHRvIGV2ZXJ5IHJlZ2lzdHJ5IHRoYXQgZG9lcyBub3QgaG9sZCBpdCB5ZXQsIGFuZCB0aGVuIHB1Ymxpc2hlcyB0aGUgZHJhZnQgcmVsZWFzZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoUmVsZWFzZSh7XG4gIGNvbmZpZzogeyBjcmF0ZSwgcGtnUm9vdCB9LFxuICBjd2QsXG4gIGVudixcbiAgbG9nZ2VyLFxuICBkcmFmdCxcbiAgdmVyc2lvbixcbiAgdHJhY2tlcixcbn06IHtcbiAgY29uZmlnOiBSZWxlYXNlUGx1Z2luQ29uZmlnO1xuICBjd2Q6IHN0cmluZztcbiAgZW52OiBFbnY7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICBkcmFmdDogUmVsZWFzZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB0cmFja2VyPzogQ2hpbGRUcmFja2VyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBnaXRIZWFkID0gZHJhZnQudGFyZ2V0X2NvbW1pdGlzaDtcbiAgY29uc3QgcGtnRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgcGtnUm9vdCk7XG4gIGNvbnN0IHB1Ymxpc2hlZENvbW1pdHMgPSBhd2FpdCBmZXRjaFB1Ymxpc2hlZENvbW1pdHMoeyBjcmF0ZSwgY3dkLCBwa2dSb290LCB2ZXJzaW9uIH0pO1xuICBjb25zdCB0YXJnZXRzID0gcHVibGlzaGVkQ29tbWl0cy5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAuLi50YXJnZXQsXG4gICAgLi4uKHRhcmdldC5yZWdpc3RyeSA9PT0gJ2NyYXRlcy5pbycgJiYgY3JhdGVcbiAgICAgID8ge1xuICAgICAgICAgIGRyeVJ1bjogKCkgPT4gcnVuKCdjYXJnbycsIFsncHVibGlzaCcsICctLWRyeS1ydW4nLCAnLS1hbGxvdy1kaXJ0eScsICctcCcsIGNyYXRlXSwgY3dkLCBlbnYsIHRyYWNrZXIpLFxuICAgICAgICAgIHB1Ymxpc2g6ICgpID0+IHB1Ymxpc2hDcmF0ZShjcmF0ZSwgY3dkLCBlbnYsIHRyYWNrZXIpLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICBkcnlSdW46ICgpID0+IHJ1bignbnBtJywgWydwdWJsaXNoJywgJy0tZHJ5LXJ1biddLCBwa2dEaXIsIGVudiwgdHJhY2tlciksXG4gICAgICAgICAgcHVibGlzaDogKCkgPT4gcnVuKCducG0nLCBbJ3B1Ymxpc2gnXSwgcGtnRGlyLCBlbnYsIHRyYWNrZXIpLFxuICAgICAgICB9KSxcbiAgfSkpO1xuICBmb3IgKGNvbnN0IHsgY29tbWl0LCBuYW1lIH0gb2YgdGFyZ2V0cykge1xuICAgIGlmIChjb21taXQgIT09IHVuZGVmaW5lZCAmJiBjb21taXQgIT09IGdpdEhlYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSB3YXMgcHVibGlzaGVkIGZyb20gJHtjb21taXQgfHwgJ2FuIHVua25vd24gY29tbWl0J30sIG5vdCBmcm9tICR7Z2l0SGVhZH0uYCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdW5wdWJsaXNoZWQgPSB0YXJnZXRzLmZpbHRlcigoeyBjb21taXQgfSkgPT4gY29tbWl0ID09PSB1bmRlZmluZWQpO1xuICAvLyBEcnkgcnVucyBjYXRjaCBwYWNrYWdpbmcgZXJyb3JzIGJlZm9yZSBhbnkgcmVnaXN0cnkgcmVjZWl2ZXMgdGhlIHZlcnNpb24uXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHVucHVibGlzaGVkKSBhd2FpdCB0YXJnZXQuZHJ5UnVuKCk7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodW5wdWJsaXNoZWQuaW5jbHVkZXModGFyZ2V0KSkgYXdhaXQgdGFyZ2V0LnB1Ymxpc2goKTtcbiAgICBlbHNlIGxvZ2dlci5sb2coYFNraXBwZWQgJHt0YXJnZXQubmFtZX0sIHdoaWNoIGlzIGFscmVhZHkgcHVibGlzaGVkIGZyb20gJHtnaXRIZWFkfWApO1xuICB9XG5cbiAgLy8gUHVibGlzaGluZyB0aGUgZHJhZnQgY3JlYXRlcyB0aGUgdGFnLCBzbyBzZW1hbnRpYy1yZWxlYXNlJ3MgdGFnIHB1c2ggdGhhdCBmb2xsb3dzIGNoYW5nZXMgbm90aGluZy5cbiAgY29uc3QgcmVsZWFzZSA9IHJlbGVhc2VTY2hlbWEucGFyc2UoXG4gICAgYXdhaXQgY3JlYXRlR2l0SHViQ2xpZW50KGVudikoJ1BBVENIJywgYHJlbGVhc2VzLyR7ZHJhZnQuaWR9YCwge1xuICAgICAgZHJhZnQ6IGZhbHNlLFxuICAgICAgYm9keTogZHJhZnQuYm9keT8uc2xpY2UoMCwgLXBlbmRpbmdNYXJrZXIubGVuZ3RoKSxcbiAgICB9KVxuICApO1xuICBsb2dnZXIubG9nKGBQdWJsaXNoZWQgdGhlIEdpdEh1YiBSZWxlYXNlICR7cmVsZWFzZS5odG1sX3VybH1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21taXQgZWFjaCByZWdpc3RyeSBwdWJsaXNoZWQgdGhlIHZlcnNpb24gZnJvbTogYHVuZGVmaW5lZGAgZm9yIGFuIHVucHVibGlzaGVkIHZlcnNpb24sIGFuZCBhbiBlbXB0eVxuICogc3RyaW5nIHdoZW4gdGhlIHJlZ2lzdHJ5IHJlY29yZHMgbm8gY29tbWl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQdWJsaXNoZWRDb21taXRzKHtcbiAgY3JhdGUsXG4gIGN3ZCxcbiAgcGtnUm9vdCxcbiAgdmVyc2lvbixcbn06IFJlbGVhc2VQbHVnaW5Db25maWcgJiB7IGN3ZDogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSk6IFByb21pc2U8XG4gIHsgcmVnaXN0cnk6ICdjcmF0ZXMuaW8nIHwgJ25wbSc7IG5hbWU6IHN0cmluZzsgY29tbWl0OiBzdHJpbmcgfCB1bmRlZmluZWQgfVtdXG4+IHtcbiAgY29uc3QgeyBuYW1lOiBwa2dOYW1lIH0gPSB6XG4gICAgLm9iamVjdCh7IG5hbWU6IHouc3RyaW5nKCkgfSlcbiAgICAucGFyc2UoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGN3ZCwgcGtnUm9vdCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSk7XG4gIHJldHVybiBbXG4gICAgLi4uKGNyYXRlXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZWdpc3RyeTogJ2NyYXRlcy5pbycgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiBgJHtjcmF0ZX1AJHt2ZXJzaW9ufSBvbiBjcmF0ZXMuaW9gLFxuICAgICAgICAgICAgY29tbWl0OiBhd2FpdCBmZXRjaFB1Ymxpc2hlZENvbW1pdChcbiAgICAgICAgICAgICAgYGh0dHBzOi8vY3JhdGVzLmlvL2FwaS92MS9jcmF0ZXMvJHtjcmF0ZX0vJHt2ZXJzaW9ufWAsXG4gICAgICAgICAgICAgIChib2R5KSA9PlxuICAgICAgICAgICAgICAgIHoub2JqZWN0KHsgdmVyc2lvbjogei5vYmplY3QoeyB0cnVzdHB1Yl9kYXRhOiB6Lm9iamVjdCh7IHNoYTogei5zdHJpbmcoKSB9KS5udWxsaXNoKCkgfSkgfSkucGFyc2UoYm9keSlcbiAgICAgICAgICAgICAgICAgIC52ZXJzaW9uLnRydXN0cHViX2RhdGE/LnNoYVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICB7XG4gICAgICByZWdpc3RyeTogJ25wbScgYXMgY29uc3QsXG4gICAgICBuYW1lOiBgJHtwa2dOYW1lfUAke3ZlcnNpb259IG9uIG5wbWAsXG4gICAgICBjb21taXQ6IGF3YWl0IGZldGNoUHVibGlzaGVkQ29tbWl0KFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtwa2dOYW1lLnJlcGxhY2UoJy8nLCAnJTJmJyl9LyR7dmVyc2lvbn1gLFxuICAgICAgICAoYm9keSkgPT4gei5vYmplY3QoeyBnaXRIZWFkOiB6LnN0cmluZygpLm9wdGlvbmFsKCkgfSkucGFyc2UoYm9keSkuZ2l0SGVhZFxuICAgICAgKSxcbiAgICB9LFxuICBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFB1Ymxpc2hlZENvbW1pdChcbiAgdXJsOiBzdHJpbmcsXG4gIGdldENvbW1pdDogKGJvZHk6IHVua25vd24pID0+IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IHVzZXJBZ2VudCB9IH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHJldHVybjtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKGBHRVQgJHt1cmx9IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7YXdhaXQgcmVzcG9uc2UudGV4dCgpfWApO1xuICByZXR1cm4gZ2V0Q29tbWl0KGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgPz8gJyc7XG59XG5cbi8qKlxuICogUHVibGlzaGVzIHRoZSBjcmF0ZSB3aXRoIGNyYXRlcy5pbydzIHRydXN0ZWQgcHVibGlzaGluZywgZXhjaGFuZ2luZyB0aGUgR2l0SHViIEFjdGlvbnMgT0lEQyB0b2tlbiBmb3IgYSBzaG9ydC1saXZlZFxuICogY3JhdGVzLmlvIHRva2VuLiBjcmF0ZXMuaW8gbWF0Y2hlcyB0aGUgY2FsbGVyJ3MgYHJlbGVhc2UueW1sYCB3b3JrZmxvdywgbm90IHRoZSByZXVzYWJsZSB3b3JrZmxvdyBpdCBjYWxscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVibGlzaENyYXRlKGNyYXRlOiBzdHJpbmcsIGN3ZDogc3RyaW5nLCBlbnY6IEVudiwgdHJhY2tlcj86IENoaWxkVHJhY2tlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHZhbHVlOiBqd3QgfSA9IHoub2JqZWN0KHsgdmFsdWU6IHouc3RyaW5nKCkgfSkucGFyc2UoXG4gICAgYXdhaXQgZmV0Y2hKc29uKGAke2Vudi5BQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMfSZhdWRpZW5jZT1jcmF0ZXMuaW9gLCB7XG4gICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtlbnYuQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOfWAgfSxcbiAgICB9KVxuICApO1xuICBjb25zdCB0b2tlbnNVcmwgPSAnaHR0cHM6Ly9jcmF0ZXMuaW8vYXBpL3YxL3RydXN0ZWRfcHVibGlzaGluZy90b2tlbnMnO1xuICBjb25zdCB7IHRva2VuIH0gPSB6Lm9iamVjdCh7IHRva2VuOiB6LnN0cmluZygpIH0pLnBhcnNlKFxuICAgIGF3YWl0IGZldGNoSnNvbihcbiAgICAgIHRva2Vuc1VybCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ1VzZXItQWdlbnQnOiB1c2VyQWdlbnQgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBqd3QgfSksXG4gICAgICB9LFxuICAgICAgLy8gQW5vdGhlciB0b2tlbiBmb3IgdGhlIHNhbWUgT0lEQyB0b2tlbiBpcyBhcyBnb29kLCBhbmQgYm90aCBleHBpcmUgb24gdGhlaXIgb3duLlxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgcmVsZWFzZSB2ZXJzaW9ucyB0aGF0IHNjcmlwdC9idWlsZC1yZWxlYXNlIHdyaXRlcyBhcmUgbm90IGNvbW1pdHRlZC5cbiAgICBhd2FpdCBydW4oXG4gICAgICAnY2FyZ28nLFxuICAgICAgWydwdWJsaXNoJywgJy1wJywgY3JhdGUsICctLWFsbG93LWRpcnR5J10sXG4gICAgICBjd2QsXG4gICAgICB7IC4uLmVudiwgQ0FSR09fUkVHSVNUUllfVE9LRU46IHRva2VuIH0sXG4gICAgICB0cmFja2VyXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZXZvY2F0aW9uIGlzIGJlc3QtZWZmb3J0ICh0aGUgdG9rZW4gZXhwaXJlcyBvbiBpdHMgb3duKTsgaXRzIGZhaWx1cmUgbXVzdCBub3QgZmFpbCBhbiBhbHJlYWR5LWRvbmUgcHVibGlzaC5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHRva2Vuc1VybCwge1xuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsICdVc2VyLUFnZW50JzogdXNlckFnZW50IH0sXG4gICAgfSkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiBlcnJvcik7XG4gICAgaWYgKCEocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkgfHwgIXJlc3BvbnNlLm9rKSBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXZva2UgdGhlIGNyYXRlcy5pbyB0b2tlbi4nKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpzb24odXJsOiBzdHJpbmcsIGluaXQ6IFJlcXVlc3RJbml0LCByZXBlYXRhYmxlID0gZmFsc2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIGluaXQsIHsgcmVwZWF0YWJsZSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKGAke2luaXQubWV0aG9kID8/ICdHRVQnfSAke3VybH0gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgY29tbWFuZCBhc3luY2hyb25vdXNseSByYXRoZXIgdGhhbiB3aXRoIGBleGVjRmlsZVN5bmNgLCB3aGljaCB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gdGhhdCBgd2IgcmVsZWFzZWAnc1xuICogc2lnbmFsIGhhbmRsZXIgY2FuIHRlcm1pbmF0ZSBhIGJ1aWxkIG9yIHB1Ymxpc2ggd2hlbiB0aGUgcmVsZWFzZSBpcyBjYW5jZWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgZW52OiBFbnYsIHRyYWNrZXI/OiBDaGlsZFRyYWNrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29kZSA9IGF3YWl0IG5ldyBQcm9taXNlPG51bWJlciB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHsgY3dkLCBlbnYsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgaWYgKHRyYWNrZXIpIHRyYWNrZXIuY3VycmVudCA9IGNoaWxkO1xuICAgIGNoaWxkLm9uKCdlcnJvcicsIHJlamVjdCkub24oJ2V4aXQnLCByZXNvbHZlKTtcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKHRyYWNrZXIpIHRyYWNrZXIuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIGlmIChjb2RlICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gZXhpdGVkIHdpdGggJHtjb2RlfS5gKTtcbn1cbiJdLCJtYXBwaW5ncyI6Im1IQUNBLE1BQWEsRUFBWSxpRUFHbkIsRUFB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