diff --git a/.dockerignore b/.dockerignore index 9327452e3..6a0b4bfa9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,6 +10,7 @@ node_modules oauth-client-util/build oauth-client-util/out oauth-client-util/src/test -radar-auth/deprecated-auth0/build src/test/java src/gatling +.yarn/unplugged +.yarn/install-state.gz diff --git a/.editorconfig b/.editorconfig index 790abe95e..3e3bd29bb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,10 +18,13 @@ insert_final_newline = true [*.ts] quote_type = single +continuation_indent_size = 4 [*.md] trim_trailing_whitespace = false +[*.yml] +indent_size = 2 + [{package,bower}.json] -indent_style = space indent_size = 2 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 65a256569..a0629bba1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,10 +21,10 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 - - name: Use Node.js 15 + - name: Use Node.js 16 uses: actions/setup-node@v3 with: - node-version: 15 + node-version: 16 - name: Get yarn cache directory path id: yarn-cache-dir-path @@ -33,7 +33,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - name: Cache uses: actions/cache@v3 @@ -140,10 +140,10 @@ jobs: echo "cache-to=type=local,dest=/tmp/.buildx-cache-new,mode=max" >> $GITHUB_OUTPUT fi - - name: Use Node.js 15 + - name: Use Node.js 16 uses: actions/setup-node@v3 with: - node-version: 15 + node-version: 16 - name: Prime yarn cache run: yarn install --mode=skip-build diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index a4f5fa4a3..f5722168f 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -19,10 +19,10 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 - - name: Use Node.js 15 + - name: Use Node.js 16 uses: actions/setup-node@v3 with: - node-version: 15 + node-version: 16 - name: Get yarn cache directory path id: yarn-cache-dir-path @@ -31,7 +31,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - name: Cache uses: actions/cache@v3 @@ -49,8 +49,7 @@ jobs: run: | yarn install - - name: End to end tests - id: e2e + - name: Run full end to end tests run: | cp src/test/resources/config/keystore.p12 src/main/resources/config/keystore.p12 ./gradlew bootRun &>mp.log snyk test --all-projects - --configuration-matching="^compileClasspath$" + --configuration-matching="^compileClasspath$|^runtimeClasspath$" --fail-on=upgradable --org=radar-base --policy-path=.snyk --severity-threshold=high - - - name: Run Snyk to check for vulnerabilities in runtimeClasspath - env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - run: > - snyk test - --all-projects - --configuration-matching="^runtimeClasspath$" - --fail-on=upgradable - --org=radar-base - --policy-path=.snyk - --severity-threshold=high diff --git a/.gitignore b/.gitignore index 22a13467e..29dfc0065 100644 --- a/.gitignore +++ b/.gitignore @@ -165,3 +165,12 @@ Desktop.ini !/libs/**/*.jar /public + +## Yarn 2 +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions +.pnp.* diff --git a/.yarn/releases/yarn-3.1.0.cjs b/.yarn/releases/yarn-3.1.0.cjs new file mode 100755 index 000000000..8584827cd --- /dev/null +++ b/.yarn/releases/yarn-3.1.0.cjs @@ -0,0 +1,768 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Mfe=Object.create,Vf=Object.defineProperty,Ofe=Object.defineProperties,Kfe=Object.getOwnPropertyDescriptor,Ufe=Object.getOwnPropertyDescriptors,Hfe=Object.getOwnPropertyNames,hI=Object.getOwnPropertySymbols,Gfe=Object.getPrototypeOf,eb=Object.prototype.hasOwnProperty,lO=Object.prototype.propertyIsEnumerable;var cO=(t,e,r)=>e in t?Vf(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,P=(t,e)=>{for(var r in e||(e={}))eb.call(e,r)&&cO(t,r,e[r]);if(hI)for(var r of hI(e))lO.call(e,r)&&cO(t,r,e[r]);return t},_=(t,e)=>Ofe(t,Ufe(e)),jfe=t=>Vf(t,"__esModule",{value:!0});var qr=(t,e)=>{var r={};for(var i in t)eb.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&hI)for(var i of hI(t))e.indexOf(i)<0&&lO.call(t,i)&&(r[i]=t[i]);return r},Yfe=(t,e)=>()=>(t&&(e=t(t=0)),e),I=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),it=(t,e)=>{for(var r in e)Vf(t,r,{get:e[r],enumerable:!0})},qfe=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Hfe(e))!eb.call(t,i)&&i!=="default"&&Vf(t,i,{get:()=>e[i],enumerable:!(r=Kfe(e,i))||r.enumerable});return t},ie=t=>qfe(jfe(Vf(t!=null?Mfe(Gfe(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var MO=I((i$e,FO)=>{FO.exports=NO;NO.sync=Ahe;var LO=require("fs");function lhe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var i=0;i{OO.exports=KO;KO.sync=che;var UO=require("fs");function KO(t,e,r){UO.stat(t,function(i,n){r(i,i?!1:HO(n,e))})}function che(t,e){return HO(UO.statSync(t),e)}function HO(t,e){return t.isFile()&&uhe(t,e)}function uhe(t,e){var r=t.mode,i=t.uid,n=t.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=r&c||r&l&&n===o||r&a&&i===s||r&u&&s===0;return g}});var YO=I((o$e,jO)=>{var s$e=require("fs"),xI;process.platform==="win32"||global.TESTING_WINDOWS?xI=MO():xI=GO();jO.exports=db;db.sync=ghe;function db(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){db(t,e||{},function(s,o){s?n(s):i(o)})})}xI(t,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),r(i,n)})}function ghe(t,e){try{return xI.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var XO=I((a$e,qO)=>{var eu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",JO=require("path"),fhe=eu?";":":",WO=YO(),zO=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),VO=(t,e)=>{let r=e.colon||fhe,i=t.match(/\//)||eu&&t.match(/\\/)?[""]:[...eu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=eu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=eu?n.split(r):[""];return eu&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},_O=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=VO(t,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(zO(t));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=JO.join(h,t),d=!h&&/^\.[\\\/]/.test(t)?t.slice(0,2)+p:p;u(l(d,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];WO(c+p,{pathExt:s},(d,m)=>{if(!d&&m)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return r?a(0).then(c=>r(null,c),r):a(0)},hhe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:i,pathExtExe:n}=VO(t,e),s=[];for(let o=0;o{"use strict";var ZO=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};Cb.exports=ZO;Cb.exports.default=ZO});var iK=I((l$e,eK)=>{"use strict";var tK=require("path"),phe=XO(),dhe=$O();function rK(t,e){let r=t.options.env||process.env,i=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch(a){}let o;try{o=phe.sync(t.command,{path:r[dhe({env:r})],pathExt:e?tK.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=tK.resolve(n?t.options.cwd:"",o)),o}function Che(t){return rK(t)||rK(t,!0)}eK.exports=Che});var nK=I((c$e,mb)=>{"use strict";var Ib=/([()\][%!^"`<>&|;, *?])/g;function mhe(t){return t=t.replace(Ib,"^$1"),t}function Ihe(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(Ib,"^$1"),e&&(t=t.replace(Ib,"^$1")),t}mb.exports.command=mhe;mb.exports.argument=Ihe});var oK=I((u$e,sK)=>{"use strict";sK.exports=/^#!(.*)/});var AK=I((g$e,aK)=>{"use strict";var Ehe=oK();aK.exports=(t="")=>{let e=t.match(Ehe);if(!e)return null;let[r,i]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var cK=I((f$e,lK)=>{"use strict";var Eb=require("fs"),yhe=AK();function whe(t){let e=150,r=Buffer.alloc(e),i;try{i=Eb.openSync(t,"r"),Eb.readSync(i,r,0,e,0),Eb.closeSync(i)}catch(n){}return yhe(r.toString())}lK.exports=whe});var hK=I((h$e,uK)=>{"use strict";var Bhe=require("path"),gK=iK(),fK=nK(),Qhe=cK(),bhe=process.platform==="win32",vhe=/\.(?:com|exe)$/i,She=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function xhe(t){t.file=gK(t);let e=t.file&&Qhe(t.file);return e?(t.args.unshift(t.file),t.command=e,gK(t)):t.file}function khe(t){if(!bhe)return t;let e=xhe(t),r=!vhe.test(e);if(t.options.forceShell||r){let i=She.test(e);t.command=Bhe.normalize(t.command),t.command=fK.command(t.command),t.args=t.args.map(s=>fK.argument(s,i));let n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Phe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let i={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?i:khe(i)}uK.exports=Phe});var CK=I((p$e,pK)=>{"use strict";var yb=process.platform==="win32";function wb(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function Dhe(t,e){if(!yb)return;let r=t.emit;t.emit=function(i,n){if(i==="exit"){let s=dK(n,e,"spawn");if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function dK(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawn"):null}function Rhe(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawnSync"):null}pK.exports={hookChildProcess:Dhe,verifyENOENT:dK,verifyENOENTSync:Rhe,notFoundError:wb}});var bb=I((d$e,tu)=>{"use strict";var mK=require("child_process"),Bb=hK(),Qb=CK();function IK(t,e,r){let i=Bb(t,e,r),n=mK.spawn(i.command,i.args,i.options);return Qb.hookChildProcess(n,i),n}function Fhe(t,e,r){let i=Bb(t,e,r),n=mK.spawnSync(i.command,i.args,i.options);return n.error=n.error||Qb.verifyENOENTSync(n.status,i),n}tu.exports=IK;tu.exports.spawn=IK;tu.exports.sync=Fhe;tu.exports._parse=Bb;tu.exports._enoent=Qb});var yK=I((y$e,EK)=>{"use strict";EK.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Nb=I((w$e,wK)=>{var gh=yK(),BK={};for(let t of Object.keys(gh))BK[gh[t]]=t;var Xe={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};wK.exports=Xe;for(let t of Object.keys(Xe)){if(!("channels"in Xe[t]))throw new Error("missing channels property: "+t);if(!("labels"in Xe[t]))throw new Error("missing channel labels property: "+t);if(Xe[t].labels.length!==Xe[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=Xe[t];delete Xe[t].channels,delete Xe[t].labels,Object.defineProperty(Xe[t],"channels",{value:e}),Object.defineProperty(Xe[t],"labels",{value:r})}Xe.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(e,r,i),s=Math.max(e,r,i),o=s-n,a,l;s===n?a=0:e===s?a=(r-i)/o:r===s?a=2+(i-e)/o:i===s&&(a=4+(e-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};Xe.rgb.hsv=function(t){let e,r,i,n,s,o=t[0]/255,a=t[1]/255,l=t[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),r=g(a),i=g(l),o===c?n=i-r:a===c?n=1/3+e-i:l===c&&(n=2/3+r-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};Xe.rgb.hwb=function(t){let e=t[0],r=t[1],i=t[2],n=Xe.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(r,i));return i=1-1/255*Math.max(e,Math.max(r,i)),[n,s*100,i*100]};Xe.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(1-e,1-r,1-i),s=(1-e-n)/(1-n)||0,o=(1-r-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function The(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Xe.rgb.keyword=function(t){let e=BK[t];if(e)return e;let r=Infinity,i;for(let n of Object.keys(gh)){let s=gh[n],o=The(t,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+r*.3576+i*.1805,s=e*.2126+r*.7152+i*.0722,o=e*.0193+r*.1192+i*.9505;return[n*100,s*100,o*100]};Xe.rgb.lab=function(t){let e=Xe.rgb.xyz(t),r=e[0],i=e[1],n=e[2];r/=95.047,i/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(r-i),a=200*(i-n);return[s,o,a]};Xe.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n,s,o;if(r===0)return o=i*255,[o,o,o];i<.5?n=i*(1+r):n=i+r-i*r;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};Xe.hsl.hsv=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=r,s=Math.max(i,.01);i*=2,r*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+r)/2,a=i===0?2*n/(s+n):2*r/(i+r);return[e,a*100,o*100]};Xe.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-r),a=255*i*(1-r*s),l=255*i*(1-r*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};Xe.hsv.hsl=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=Math.max(i,.01),s,o;o=(2-r)*i;let a=(2-r)*n;return s=r*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};Xe.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n=r+i,s;n>1&&(r/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=r+s*(a-r),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=r;break;case 1:c=l,u=a,g=r;break;case 2:c=r,u=a,g=l;break;case 3:c=r,u=l,g=a;break;case 4:c=l,u=r,g=a;break;case 5:c=a,u=r,g=l;break}return[c*255,u*255,g*255]};Xe.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n=t[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,r*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};Xe.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n,s,o;return n=e*3.2406+r*-1.5372+i*-.4986,s=e*-.9689+r*1.8758+i*.0415,o=e*.0557+r*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};Xe.xyz.lab=function(t){let e=t[0],r=t[1],i=t[2];e/=95.047,r/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*r-16,s=500*(e-r),o=200*(r-i);return[n,s,o]};Xe.lab.xyz=function(t){let e=t[0],r=t[1],i=t[2],n,s,o;s=(e+16)/116,n=r/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};Xe.lab.lch=function(t){let e=t[0],r=t[1],i=t[2],n;n=Math.atan2(i,r)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(r*r+i*i);return[e,o,n]};Xe.lch.lab=function(t){let e=t[0],r=t[1],n=t[2]/360*2*Math.PI,s=r*Math.cos(n),o=r*Math.sin(n);return[e,s,o]};Xe.rgb.ansi16=function(t,e=null){let[r,i,n]=t,s=e===null?Xe.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};Xe.hsv.ansi16=function(t){return Xe.rgb.ansi16(Xe.hsv.rgb(t),t[2])};Xe.rgb.ansi256=function(t){let e=t[0],r=t[1],i=t[2];return e===r&&r===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(i/255*5)};Xe.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,i=(e&1)*r*255,n=(e>>1&1)*r*255,s=(e>>2&1)*r*255;return[i,n,s]};Xe.ansi256.rgb=function(t){if(t>=232){let s=(t-232)*10+8;return[s,s,s]}t-=16;let e,r=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,n=e%6/5*255;return[r,i,n]};Xe.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Xe.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let i=parseInt(r,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};Xe.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.max(Math.max(e,r),i),s=Math.min(Math.min(e,r),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(r-i)/o%6:n===r?l=2+(i-e)/o:l=4+(e-r)/o,l/=6,l%=1,[l*360,o*100,a*100]};Xe.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=r<.5?2*e*r:2*e*(1-r),n=0;return i<1&&(n=(r-.5*i)/(1-i)),[t[0],i*100,n*100]};Xe.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=e*r,n=0;return i<1&&(n=(r-i)/(1-i)),[t[0],i*100,n*100]};Xe.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100;if(r===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-r)*i,[(r*n[0]+l)*255,(r*n[1]+l)*255,(r*n[2]+l)*255]};Xe.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e),n=0;return i>0&&(n=e/i),[t[0],n*100,i*100]};Xe.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[t[0],n*100,i*100]};Xe.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e);return[t[0],(i-e)*100,(1-i)*100]};Xe.hwb.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=1-r,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[t[0],n*100,s*100]};Xe.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Xe.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Xe.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Xe.gray.hsl=function(t){return[0,0,t[0]]};Xe.gray.hsv=Xe.gray.hsl;Xe.gray.hwb=function(t){return[0,100,t[0]]};Xe.gray.cmyk=function(t){return[0,0,0,t[0]]};Xe.gray.lab=function(t){return[t[0],0,0]};Xe.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};Xe.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var bK=I((B$e,QK)=>{var kI=Nb();function Mhe(){let t={},e=Object.keys(kI);for(let r=e.length,i=0;i{var Lb=Nb(),Hhe=bK(),ru={},Ghe=Object.keys(Lb);function jhe(t){let e=function(...r){let i=r[0];return i==null?i:(i.length>1&&(r=i),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function Yhe(t){let e=function(...r){let i=r[0];if(i==null)return i;i.length>1&&(r=i);let n=t(r);if(typeof n=="object")for(let s=n.length,o=0;o{ru[t]={},Object.defineProperty(ru[t],"channels",{value:Lb[t].channels}),Object.defineProperty(ru[t],"labels",{value:Lb[t].labels});let e=Hhe(t);Object.keys(e).forEach(i=>{let n=e[i];ru[t][i]=Yhe(n),ru[t][i].raw=jhe(n)})});vK.exports=ru});var FK=I((b$e,xK)=>{"use strict";var kK=(t,e)=>(...r)=>`[${t(...r)+e}m`,PK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};5;${i}m`},DK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},PI=t=>t,RK=(t,e,r)=>[t,e,r],iu=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let i=r();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},Tb,nu=(t,e,r,i)=>{Tb===void 0&&(Tb=SK());let n=i?10:0,s={};for(let[o,a]of Object.entries(Tb)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=t(r,n):typeof a=="object"&&(s[l]=t(a[e],n))}return s};function qhe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],t.set(s[0],s[1]);Object.defineProperty(e,r,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="",e.bgColor.close="",iu(e.color,"ansi",()=>nu(kK,"ansi16",PI,!1)),iu(e.color,"ansi256",()=>nu(PK,"ansi256",PI,!1)),iu(e.color,"ansi16m",()=>nu(DK,"rgb",RK,!1)),iu(e.bgColor,"ansi",()=>nu(kK,"ansi16",PI,!0)),iu(e.bgColor,"ansi256",()=>nu(PK,"ansi256",PI,!0)),iu(e.bgColor,"ansi16m",()=>nu(DK,"rgb",RK,!0)),e}Object.defineProperty(xK,"exports",{enumerable:!0,get:qhe})});var LK=I((v$e,NK)=>{"use strict";NK.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(r+t),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Jhe=require("os"),MK=require("tty"),Wn=LK(),{env:Wr}=process,tA;Wn("no-color")||Wn("no-colors")||Wn("color=false")||Wn("color=never")?tA=0:(Wn("color")||Wn("colors")||Wn("color=true")||Wn("color=always"))&&(tA=1);"FORCE_COLOR"in Wr&&(Wr.FORCE_COLOR==="true"?tA=1:Wr.FORCE_COLOR==="false"?tA=0:tA=Wr.FORCE_COLOR.length===0?1:Math.min(parseInt(Wr.FORCE_COLOR,10),3));function Mb(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function Ob(t,e){if(tA===0)return 0;if(Wn("color=16m")||Wn("color=full")||Wn("color=truecolor"))return 3;if(Wn("color=256"))return 2;if(t&&!e&&tA===void 0)return 0;let r=tA||0;if(Wr.TERM==="dumb")return r;if(process.platform==="win32"){let i=Jhe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in Wr)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in Wr)||Wr.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Wr)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Wr.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Wr)return 1;if(Wr.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Wr){let i=parseInt((Wr.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Wr.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Wr.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Wr.TERM)||"COLORTERM"in Wr?1:r}function Whe(t){let e=Ob(t,t&&t.isTTY);return Mb(e)}TK.exports={supportsColor:Whe,stdout:Mb(Ob(!0,MK.isatty(1))),stderr:Mb(Ob(!0,MK.isatty(2)))}});var UK=I((x$e,KK)=>{"use strict";var zhe=(t,e,r)=>{let i=t.indexOf(e);if(i===-1)return t;let n=e.length,s=0,o="";do o+=t.substr(s,i-s)+e+r,s=i+n,i=t.indexOf(e,s);while(i!==-1);return o+=t.substr(s),o},Vhe=(t,e,r,i)=>{let n=0,s="";do{let o=t[i-1]==="\r";s+=t.substr(n,(o?i-1:i)-n)+e+(o?`\r +`:` +`)+r,n=i+1,i=t.indexOf(` +`,n)}while(i!==-1);return s+=t.substr(n),s};KK.exports={stringReplaceAll:zhe,stringEncaseCRLFWithFirstIndex:Vhe}});var qK=I((k$e,HK)=>{"use strict";var _he=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,GK=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Xhe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Zhe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,$he=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function jK(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):$he.get(t)||t}function epe(t,e){let r=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))r.push(o);else if(n=s.match(Xhe))r.push(n[2].replace(Zhe,(a,l,c)=>l?jK(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${t}')`)}return r}function tpe(t){GK.lastIndex=0;let e=[],r;for(;(r=GK.exec(t))!==null;){let i=r[1];if(r[2]){let n=epe(i,r[2]);e.push([i].concat(n))}else e.push([i])}return e}function YK(t,e){let r={};for(let n of e)for(let s of n.styles)r[s[0]]=n.inverse?null:s.slice(1);let i=t;for(let[n,s]of Object.entries(r))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}HK.exports=(t,e)=>{let r=[],i=[],n=[];if(e.replace(_he,(s,o,a,l,c,u)=>{if(o)n.push(jK(o));else if(l){let g=n.join("");n=[],i.push(r.length===0?g:YK(t,r)(g)),r.push({inverse:a,styles:tpe(l)})}else if(c){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(YK(t,r)(n.join(""))),n=[],r.pop()}else n.push(u)}),i.push(n.join("")),r.length>0){let s=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var jb=I((P$e,JK)=>{"use strict";var fh=FK(),{stdout:Kb,stderr:Ub}=OK(),{stringReplaceAll:rpe,stringEncaseCRLFWithFirstIndex:ipe}=UK(),WK=["ansi","ansi","ansi256","ansi16m"],su=Object.create(null),npe=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=Kb?Kb.level:0;t.level=e.level===void 0?r:e.level},zK=class{constructor(e){return VK(e)}},VK=t=>{let e={};return npe(e,t),e.template=(...r)=>spe(e.template,...r),Object.setPrototypeOf(e,DI.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=zK,e.template};function DI(t){return VK(t)}for(let[t,e]of Object.entries(fh))su[t]={get(){let r=RI(this,Hb(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};su.visible={get(){let t=RI(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var _K=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of _K)su[t]={get(){let{level:e}=this;return function(...r){let i=Hb(fh.color[WK[e]][t](...r),fh.color.close,this._styler);return RI(this,i,this._isEmpty)}}};for(let t of _K){let e="bg"+t[0].toUpperCase()+t.slice(1);su[e]={get(){let{level:r}=this;return function(...i){let n=Hb(fh.bgColor[WK[r]][t](...i),fh.bgColor.close,this._styler);return RI(this,n,this._isEmpty)}}}}var ope=Object.defineProperties(()=>{},_(P({},su),{level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}})),Hb=(t,e,r)=>{let i,n;return r===void 0?(i=t,n=e):(i=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:i,closeAll:n,parent:r}},RI=(t,e,r)=>{let i=(...n)=>ape(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=ope,i._generator=t,i._styler=e,i._isEmpty=r,i},ape=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:i,closeAll:n}=r;if(e.indexOf("")!==-1)for(;r!==void 0;)e=rpe(e,r.close,r.open),r=r.parent;let s=e.indexOf(` +`);return s!==-1&&(e=ipe(e,n,i,s)),i+e+n},Gb,spe=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let i=e.slice(1),n=[r.raw[0]];for(let s=1;s{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var ml=I(Dn=>{"use strict";var $K=ZK(),ro=process.env;Object.defineProperty(Dn,"_vendors",{value:$K.map(function(t){return t.constant})});Dn.name=null;Dn.isPR=null;$K.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(i){return e1(i)});if(Dn[t.constant]=r,r)switch(Dn.name=t.name,typeof t.pr){case"string":Dn.isPR=!!ro[t.pr];break;case"object":"env"in t.pr?Dn.isPR=t.pr.env in ro&&ro[t.pr.env]!==t.pr.ne:"any"in t.pr?Dn.isPR=t.pr.any.some(function(i){return!!ro[i]}):Dn.isPR=e1(t.pr);break;default:Dn.isPR=null}});Dn.isCI=!!(ro.CI||ro.CONTINUOUS_INTEGRATION||ro.BUILD_NUMBER||ro.RUN_ID||Dn.name);function e1(t){return typeof t=="string"?!!ro[t]:Object.keys(t).every(function(e){return ro[e]===t[e]})}});var FI=I(zn=>{"use strict";zn.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;zn.find=(t,e)=>t.nodes.find(r=>r.type===e);zn.exceedsLimit=(t,e,r=1,i)=>i===!1||!zn.isInteger(t)||!zn.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=i;zn.escapeNode=(t,e=0,r)=>{let i=t.nodes[e];!i||(r&&i.type===r||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};zn.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0==0?(t.invalid=!0,!0):!1;zn.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0==0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;zn.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;zn.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);zn.flatten=(...t)=>{let e=[],r=i=>{for(let n=0;n{"use strict";var r1=FI();t1.exports=(t,e={})=>{let r=(i,n={})=>{let s=e.escapeInvalid&&r1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&r1.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=r(l);return a};return r(t)}});var n1=I((L$e,i1)=>{"use strict";i1.exports=function(t){return typeof t=="number"?t-t==0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var f1=I((T$e,s1)=>{"use strict";var o1=n1(),Il=(t,e,r)=>{if(o1(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(o1(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=P({relaxZeros:!0},r);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=t+":"+e+"="+n+s+o+a;if(Il.cache.hasOwnProperty(l))return Il.cache[l].result;let c=Math.min(t,e),u=Math.max(t,e);if(Math.abs(c-u)===1){let d=t+"|"+e;return i.capture?`(${d})`:i.wrap===!1?d:`(?:${d})`}let g=A1(t)||A1(e),f={min:t,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let d=u<0?Math.abs(u):1;p=a1(d,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=a1(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Ape(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Il.cache[l]=f,f.result};function Ape(t,e,r){let i=Yb(t,e,"-",!1,r)||[],n=Yb(e,t,"",!1,r)||[],s=Yb(t,e,"-?",!0,r)||[];return i.concat(s).concat(n).join("|")}function cpe(t,e){let r=1,i=1,n=l1(t,r),s=new Set([e]);for(;t<=n&&n<=e;)s.add(n),r+=1,n=l1(t,r);for(n=c1(e+1,i)-1;t1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+u1(a.count),o=c+1;continue}r.isPadded&&(g=hpe(c,r,i)),u.string=g+u.pattern+u1(u.count),s.push(u),o=c+1,a=u}return s}function Yb(t,e,r,i,n){let s=[];for(let o of t){let{string:a}=o;!i&&!g1(e,"string",a)&&s.push(r+a),i&&g1(e,"string",a)&&s.push(r+a)}return s}function upe(t,e){let r=[];for(let i=0;ie?1:e>t?-1:0}function g1(t,e,r){return t.some(i=>i[e]===r)}function l1(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function c1(t,e){return t-t%Math.pow(10,e)}function u1(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function gpe(t,e,r){return`[${t}${e-t==1?"":"-"}${e}]`}function A1(t){return/^-?(0+)\d/.test(t)}function hpe(t,e,r){if(!e.isPadded)return t;let i=Math.abs(e.maxLen-String(t).length),n=r.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Il.cache={};Il.clearCache=()=>Il.cache={};s1.exports=Il});var Wb=I((M$e,h1)=>{"use strict";var ppe=require("util"),p1=f1(),d1=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),dpe=t=>e=>t===!0?Number(e):String(e),qb=t=>typeof t=="number"||typeof t=="string"&&t!=="",ph=t=>Number.isInteger(+t),Jb=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},Cpe=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,mpe=(t,e,r)=>{if(e>0){let i=t[0]==="-"?"-":"";i&&(t=t.slice(1)),t=i+t.padStart(i?e-1:e,"0")}return r===!1?String(t):t},C1=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((o,a)=>oa?1:0),t.positives.sort((o,a)=>oa?1:0);let r=e.capture?"":"?:",i="",n="",s;return t.positives.length&&(i=t.positives.join("|")),t.negatives.length&&(n=`-(${r}${t.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${r}${s})`:s},m1=(t,e,r,i)=>{if(r)return p1(t,e,P({wrap:!1},i));let n=String.fromCharCode(t);if(t===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},I1=(t,e,r)=>{if(Array.isArray(t)){let i=r.wrap===!0,n=r.capture?"":"?:";return i?`(${n}${t.join("|")})`:t.join("|")}return p1(t,e,r)},E1=(...t)=>new RangeError("Invalid range arguments: "+ppe.inspect(...t)),y1=(t,e,r)=>{if(r.strictRanges===!0)throw E1([t,e]);return[]},Epe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},ype=(t,e,r=1,i={})=>{let n=Number(t),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw E1([t,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(t),l=String(e),c=String(r);r=Math.max(Math.abs(r),1);let u=Jb(a)||Jb(l)||Jb(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Cpe(t,e,i)===!1,h=i.transform||dpe(f);if(i.toRegex&&r===1)return m1(C1(t,g),C1(e,g),!0,i);let p={negatives:[],positives:[]},d=B=>p[B<0?"negatives":"positives"].push(Math.abs(B)),m=[],E=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&r>1?d(n):m.push(mpe(h(n,E),g,f)),n=o?n-r:n+r,E++;return i.toRegex===!0?r>1?Ipe(p,i):I1(m,null,P({wrap:!1},i)):m},wpe=(t,e,r=1,i={})=>{if(!ph(t)&&t.length>1||!ph(e)&&e.length>1)return y1(t,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${t}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&r===1)return m1(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-r:s+r,g++;return i.toRegex===!0?I1(u,null,{wrap:!1,options:i}):u},LI=(t,e,r,i={})=>{if(e==null&&qb(t))return[t];if(!qb(t)||!qb(e))return y1(t,e,i);if(typeof r=="function")return LI(t,e,1,{transform:r});if(d1(r))return LI(t,e,0,r);let n=P({},i);return n.capture===!0&&(n.wrap=!0),r=r||n.step||1,ph(r)?ph(t)&&ph(e)?ype(t,e,r,n):wpe(t,e,Math.max(Math.abs(r),1),n):r!=null&&!d1(r)?Epe(r,n):LI(t,e,1,r)};h1.exports=LI});var Q1=I((O$e,w1)=>{"use strict";var Bpe=Wb(),B1=FI(),Qpe=(t,e={})=>{let r=(i,n={})=>{let s=B1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=B1.reduce(i.nodes),g=Bpe(...u,_(P({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=r(u,i);return c};return r(t)};w1.exports=Qpe});var S1=I((K$e,b1)=>{"use strict";var bpe=Wb(),v1=NI(),ou=FI(),El=(t="",e="",r=!1)=>{let i=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?ou.flatten(e).map(n=>`{${n}}`):e;for(let n of t)if(Array.isArray(n))for(let s of n)i.push(El(s,e,r));else for(let s of e)r===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?El(n,s,r):n+s);return ou.flatten(i)},vpe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(El(a.pop(),v1(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(El(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=ou.reduce(n.nodes);if(ou.exceedsLimit(...g,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=bpe(...g,e);f.length===0&&(f=v1(n,e)),a.push(El(a.pop(),f)),n.nodes=[];return}let l=ou.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";x1.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var N1=I((H$e,P1)=>{"use strict";var Spe=NI(),{MAX_LENGTH:D1,CHAR_BACKSLASH:zb,CHAR_BACKTICK:xpe,CHAR_COMMA:kpe,CHAR_DOT:Ppe,CHAR_LEFT_PARENTHESES:Dpe,CHAR_RIGHT_PARENTHESES:Rpe,CHAR_LEFT_CURLY_BRACE:Fpe,CHAR_RIGHT_CURLY_BRACE:Npe,CHAR_LEFT_SQUARE_BRACKET:R1,CHAR_RIGHT_SQUARE_BRACKET:F1,CHAR_DOUBLE_QUOTE:Lpe,CHAR_SINGLE_QUOTE:Tpe,CHAR_NO_BREAK_SPACE:Mpe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ope}=k1(),Kpe=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},i=typeof r.maxLength=="number"?Math.min(D1,r.maxLength):D1;if(t.length>i)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${i})`);let n={type:"root",input:t,nodes:[]},s=[n],o=n,a=n,l=0,c=t.length,u=0,g=0,f,h={},p=()=>t[u++],d=m=>{if(m.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&m.type==="text"){a.value+=m.value;return}return o.nodes.push(m),m.parent=o,m.prev=a,a=m,m};for(d({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let m=o.nodes.shift();o.nodes=[m,{type:"text",value:Spe(o)}]}d({type:"comma",value:f}),o.commas++;continue}if(f===Ppe&&g>0&&o.commas===0){let m=o.nodes;if(g===0||m.length===0){d({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){m.pop();let E=m[m.length-1];E.value+=a.value+f,a=E,o.ranges--;continue}d({type:"dot",value:f});continue}d({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(B=>{B.nodes||(B.type==="open"&&(B.isOpen=!0),B.type==="close"&&(B.isClose=!0),B.nodes||(B.type="text"),B.invalid=!0)});let m=s[s.length-1],E=m.nodes.indexOf(o);m.nodes.splice(E,1,...o.nodes)}while(s.length>0);return d({type:"eos"}),n};P1.exports=Kpe});var M1=I((G$e,L1)=>{"use strict";var T1=NI(),Upe=Q1(),Hpe=S1(),Gpe=N1(),Rn=(t,e={})=>{let r=[];if(Array.isArray(t))for(let i of t){let n=Rn.create(i,e);Array.isArray(n)?r.push(...n):r.push(n)}else r=[].concat(Rn.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.parse=(t,e={})=>Gpe(t,e);Rn.stringify=(t,e={})=>typeof t=="string"?T1(Rn.parse(t,e),e):T1(t,e);Rn.compile=(t,e={})=>(typeof t=="string"&&(t=Rn.parse(t,e)),Upe(t,e));Rn.expand=(t,e={})=>{typeof t=="string"&&(t=Rn.parse(t,e));let r=Hpe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?Rn.compile(t,e):Rn.expand(t,e);L1.exports=Rn});var dh=I((j$e,O1)=>{"use strict";var jpe=require("path"),io="\\\\/",K1=`[^${io}]`,ea="\\.",Ype="\\+",qpe="\\?",TI="\\/",Jpe="(?=.)",U1="[^/]",Vb=`(?:${TI}|$)`,H1=`(?:^|${TI})`,_b=`${ea}{1,2}${Vb}`,Wpe=`(?!${ea})`,zpe=`(?!${H1}${_b})`,Vpe=`(?!${ea}{0,1}${Vb})`,_pe=`(?!${_b})`,Xpe=`[^.${TI}]`,Zpe=`${U1}*?`,G1={DOT_LITERAL:ea,PLUS_LITERAL:Ype,QMARK_LITERAL:qpe,SLASH_LITERAL:TI,ONE_CHAR:Jpe,QMARK:U1,END_ANCHOR:Vb,DOTS_SLASH:_b,NO_DOT:Wpe,NO_DOTS:zpe,NO_DOT_SLASH:Vpe,NO_DOTS_SLASH:_pe,QMARK_NO_DOT:Xpe,STAR:Zpe,START_ANCHOR:H1},$pe=_(P({},G1),{SLASH_LITERAL:`[${io}]`,QMARK:K1,STAR:`${K1}*?`,DOTS_SLASH:`${ea}{1,2}(?:[${io}]|$)`,NO_DOT:`(?!${ea})`,NO_DOTS:`(?!(?:^|[${io}])${ea}{1,2}(?:[${io}]|$))`,NO_DOT_SLASH:`(?!${ea}{0,1}(?:[${io}]|$))`,NO_DOTS_SLASH:`(?!${ea}{1,2}(?:[${io}]|$))`,QMARK_NO_DOT:`[^.${io}]`,START_ANCHOR:`(?:^|[${io}])`,END_ANCHOR:`(?:[${io}]|$)`}),ede={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};O1.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:ede,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:jpe.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?$pe:G1}}});var Ch=I(cn=>{"use strict";var tde=require("path"),rde=process.platform==="win32",{REGEX_BACKSLASH:ide,REGEX_REMOVE_BACKSLASH:nde,REGEX_SPECIAL_CHARS:sde,REGEX_SPECIAL_CHARS_GLOBAL:ode}=dh();cn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);cn.hasRegexChars=t=>sde.test(t);cn.isRegexChar=t=>t.length===1&&cn.hasRegexChars(t);cn.escapeRegex=t=>t.replace(ode,"\\$1");cn.toPosixSlashes=t=>t.replace(ide,"/");cn.removeBackslashes=t=>t.replace(nde,e=>e==="\\"?"":e);cn.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};cn.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:rde===!0||tde.sep==="\\";cn.escapeLast=(t,e,r)=>{let i=t.lastIndexOf(e,r);return i===-1?t:t[i-1]==="\\"?cn.escapeLast(t,e,i-1):`${t.slice(0,i)}\\${t.slice(i)}`};cn.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};cn.wrapOutput=(t,e={},r={})=>{let i=r.contains?"":"^",n=r.contains?"":"$",s=`${i}(?:${t})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var X1=I((q$e,j1)=>{"use strict";var Y1=Ch(),{CHAR_ASTERISK:Xb,CHAR_AT:ade,CHAR_BACKWARD_SLASH:mh,CHAR_COMMA:Ade,CHAR_DOT:Zb,CHAR_EXCLAMATION_MARK:q1,CHAR_FORWARD_SLASH:J1,CHAR_LEFT_CURLY_BRACE:$b,CHAR_LEFT_PARENTHESES:ev,CHAR_LEFT_SQUARE_BRACKET:lde,CHAR_PLUS:cde,CHAR_QUESTION_MARK:W1,CHAR_RIGHT_CURLY_BRACE:ude,CHAR_RIGHT_PARENTHESES:z1,CHAR_RIGHT_SQUARE_BRACKET:gde}=dh(),V1=t=>t===J1||t===mh,_1=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?Infinity:1)},fde=(t,e)=>{let r=e||{},i=t.length-1,n=r.parts===!0||r.scanToEnd===!0,s=[],o=[],a=[],l=t,c=-1,u=0,g=0,f=!1,h=!1,p=!1,d=!1,m=!1,E=!1,B=!1,b=!1,R=!1,H=0,L,K,J={value:"",depth:0,isGlob:!1},ne=()=>c>=i,q=()=>l.charCodeAt(c+1),A=()=>(L=K,l.charCodeAt(++c));for(;c0&&(W=l.slice(0,u),l=l.slice(u),g-=u),V&&p===!0&&g>0?(V=l.slice(0,g),X=l.slice(g)):p===!0?(V="",X=l):V=l,V&&V!==""&&V!=="/"&&V!==l&&V1(V.charCodeAt(V.length-1))&&(V=V.slice(0,-1)),r.unescape===!0&&(X&&(X=Y1.removeBackslashes(X)),V&&B===!0&&(V=Y1.removeBackslashes(V)));let F={prefix:W,input:t,start:u,base:V,glob:X,isBrace:f,isBracket:h,isGlob:p,isExtglob:d,isGlobstar:m,negated:b};if(r.tokens===!0&&(F.maxDepth=0,V1(K)||o.push(J),F.tokens=o),r.parts===!0||r.tokens===!0){let D;for(let he=0;he{"use strict";var MI=dh(),Fn=Ch(),{MAX_LENGTH:OI,POSIX_REGEX_SOURCE:hde,REGEX_NON_SPECIAL_CHARS:pde,REGEX_SPECIAL_CHARS_BACKREF:dde,REPLACEMENTS:$1}=MI,Cde=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch(i){return t.map(n=>Fn.escapeRegex(n)).join("..")}return r},au=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,eU=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=$1[t]||t;let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OI,r.maxLength):OI,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:r.prepend||""},o=[s],a=r.capture?"":"?:",l=Fn.isWindows(e),c=MI.globChars(l),u=MI.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:d,NO_DOT:m,NO_DOT_SLASH:E,NO_DOTS_SLASH:B,QMARK:b,QMARK_NO_DOT:R,STAR:H,START_ANCHOR:L}=c,K=G=>`(${a}(?:(?!${L}${G.dot?d:g}).)*?)`,J=r.dot?"":m,ne=r.dot?b:R,q=r.bash===!0?K(r):H;r.capture&&(q=`(${q})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let A={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};t=Fn.removePrefix(t,A),n=t.length;let V=[],W=[],X=[],F=s,D,he=()=>A.index===n-1,pe=A.peek=(G=1)=>t[A.index+G],Ne=A.advance=()=>t[++A.index],Pe=()=>t.slice(A.index+1),qe=(G="",Ce=0)=>{A.consumed+=G,A.index+=Ce},re=G=>{A.output+=G.output!=null?G.output:G.value,qe(G.value)},se=()=>{let G=1;for(;pe()==="!"&&(pe(2)!=="("||pe(3)==="?");)Ne(),A.start++,G++;return G%2==0?!1:(A.negated=!0,A.start++,!0)},be=G=>{A[G]++,X.push(G)},ae=G=>{A[G]--,X.pop()},Ae=G=>{if(F.type==="globstar"){let Ce=A.braces>0&&(G.type==="comma"||G.type==="brace"),ee=G.extglob===!0||V.length&&(G.type==="pipe"||G.type==="paren");G.type!=="slash"&&G.type!=="paren"&&!Ce&&!ee&&(A.output=A.output.slice(0,-F.output.length),F.type="star",F.value="*",F.output=q,A.output+=F.output)}if(V.length&&G.type!=="paren"&&!u[G.value]&&(V[V.length-1].inner+=G.value),(G.value||G.output)&&re(G),F&&F.type==="text"&&G.type==="text"){F.value+=G.value,F.output=(F.output||"")+G.value;return}G.prev=F,o.push(G),F=G},De=(G,Ce)=>{let ee=_(P({},u[Ce]),{conditions:1,inner:""});ee.prev=F,ee.parens=A.parens,ee.output=A.output;let Ue=(r.capture?"(":"")+ee.open;be("parens"),Ae({type:G,value:Ce,output:A.output?"":p}),Ae({type:"paren",extglob:!0,value:Ne(),output:Ue}),V.push(ee)},$=G=>{let Ce=G.close+(r.capture?")":"");if(G.type==="negate"){let ee=q;G.inner&&G.inner.length>1&&G.inner.includes("/")&&(ee=K(r)),(ee!==q||he()||/^\)+$/.test(Pe()))&&(Ce=G.close=`)$))${ee}`),G.prev.type==="bos"&&(A.negatedExtglob=!0)}Ae({type:"paren",extglob:!0,value:D,output:Ce}),ae("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let G=!1,Ce=t.replace(dde,(ee,Ue,Oe,vt,dt,ri)=>vt==="\\"?(G=!0,ee):vt==="?"?Ue?Ue+vt+(dt?b.repeat(dt.length):""):ri===0?ne+(dt?b.repeat(dt.length):""):b.repeat(Oe.length):vt==="."?g.repeat(Oe.length):vt==="*"?Ue?Ue+vt+(dt?q:""):q:Ue?ee:`\\${ee}`);return G===!0&&(r.unescape===!0?Ce=Ce.replace(/\\/g,""):Ce=Ce.replace(/\\+/g,ee=>ee.length%2==0?"\\\\":ee?"\\":"")),Ce===t&&r.contains===!0?(A.output=t,A):(A.output=Fn.wrapOutput(Ce,A,e),A)}for(;!he();){if(D=Ne(),D==="\0")continue;if(D==="\\"){let ee=pe();if(ee==="/"&&r.bash!==!0||ee==="."||ee===";")continue;if(!ee){D+="\\",Ae({type:"text",value:D});continue}let Ue=/^\\+/.exec(Pe()),Oe=0;if(Ue&&Ue[0].length>2&&(Oe=Ue[0].length,A.index+=Oe,Oe%2!=0&&(D+="\\")),r.unescape===!0?D=Ne()||"":D+=Ne()||"",A.brackets===0){Ae({type:"text",value:D});continue}}if(A.brackets>0&&(D!=="]"||F.value==="["||F.value==="[^")){if(r.posix!==!1&&D===":"){let ee=F.value.slice(1);if(ee.includes("[")&&(F.posix=!0,ee.includes(":"))){let Ue=F.value.lastIndexOf("["),Oe=F.value.slice(0,Ue),vt=F.value.slice(Ue+2),dt=hde[vt];if(dt){F.value=Oe+dt,A.backtrack=!0,Ne(),!s.output&&o.indexOf(F)===1&&(s.output=p);continue}}}(D==="["&&pe()!==":"||D==="-"&&pe()==="]")&&(D=`\\${D}`),D==="]"&&(F.value==="["||F.value==="[^")&&(D=`\\${D}`),r.posix===!0&&D==="!"&&F.value==="["&&(D="^"),F.value+=D,re({value:D});continue}if(A.quotes===1&&D!=='"'){D=Fn.escapeRegex(D),F.value+=D,re({value:D});continue}if(D==='"'){A.quotes=A.quotes===1?0:1,r.keepQuotes===!0&&Ae({type:"text",value:D});continue}if(D==="("){be("parens"),Ae({type:"paren",value:D});continue}if(D===")"){if(A.parens===0&&r.strictBrackets===!0)throw new SyntaxError(au("opening","("));let ee=V[V.length-1];if(ee&&A.parens===ee.parens+1){$(V.pop());continue}Ae({type:"paren",value:D,output:A.parens?")":"\\)"}),ae("parens");continue}if(D==="["){if(r.nobracket===!0||!Pe().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));D=`\\${D}`}else be("brackets");Ae({type:"bracket",value:D});continue}if(D==="]"){if(r.nobracket===!0||F&&F.type==="bracket"&&F.value.length===1){Ae({type:"text",value:D,output:`\\${D}`});continue}if(A.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(au("opening","["));Ae({type:"text",value:D,output:`\\${D}`});continue}ae("brackets");let ee=F.value.slice(1);if(F.posix!==!0&&ee[0]==="^"&&!ee.includes("/")&&(D=`/${D}`),F.value+=D,re({value:D}),r.literalBrackets===!1||Fn.hasRegexChars(ee))continue;let Ue=Fn.escapeRegex(F.value);if(A.output=A.output.slice(0,-F.value.length),r.literalBrackets===!0){A.output+=Ue,F.value=Ue;continue}F.value=`(${a}${Ue}|${F.value})`,A.output+=F.value;continue}if(D==="{"&&r.nobrace!==!0){be("braces");let ee={type:"brace",value:D,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};W.push(ee),Ae(ee);continue}if(D==="}"){let ee=W[W.length-1];if(r.nobrace===!0||!ee){Ae({type:"text",value:D,output:D});continue}let Ue=")";if(ee.dots===!0){let Oe=o.slice(),vt=[];for(let dt=Oe.length-1;dt>=0&&(o.pop(),Oe[dt].type!=="brace");dt--)Oe[dt].type!=="dots"&&vt.unshift(Oe[dt].value);Ue=Cde(vt,r),A.backtrack=!0}if(ee.comma!==!0&&ee.dots!==!0){let Oe=A.output.slice(0,ee.outputIndex),vt=A.tokens.slice(ee.tokensIndex);ee.value=ee.output="\\{",D=Ue="\\}",A.output=Oe;for(let dt of vt)A.output+=dt.output||dt.value}Ae({type:"brace",value:D,output:Ue}),ae("braces"),W.pop();continue}if(D==="|"){V.length>0&&V[V.length-1].conditions++,Ae({type:"text",value:D});continue}if(D===","){let ee=D,Ue=W[W.length-1];Ue&&X[X.length-1]==="braces"&&(Ue.comma=!0,ee="|"),Ae({type:"comma",value:D,output:ee});continue}if(D==="/"){if(F.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),F=s;continue}Ae({type:"slash",value:D,output:h});continue}if(D==="."){if(A.braces>0&&F.type==="dot"){F.value==="."&&(F.output=g);let ee=W[W.length-1];F.type="dots",F.output+=D,F.value+=D,ee.dots=!0;continue}if(A.braces+A.parens===0&&F.type!=="bos"&&F.type!=="slash"){Ae({type:"text",value:D,output:g});continue}Ae({type:"dot",value:D,output:g});continue}if(D==="?"){if(!(F&&F.value==="(")&&r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("qmark",D);continue}if(F&&F.type==="paren"){let Ue=pe(),Oe=D;if(Ue==="<"&&!Fn.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(F.value==="("&&!/[!=<:]/.test(Ue)||Ue==="<"&&!/<([!=]|\w+>)/.test(Pe()))&&(Oe=`\\${D}`),Ae({type:"text",value:D,output:Oe});continue}if(r.dot!==!0&&(F.type==="slash"||F.type==="bos")){Ae({type:"qmark",value:D,output:R});continue}Ae({type:"qmark",value:D,output:b});continue}if(D==="!"){if(r.noextglob!==!0&&pe()==="("&&(pe(2)!=="?"||!/[!=<:]/.test(pe(3)))){De("negate",D);continue}if(r.nonegate!==!0&&A.index===0){se();continue}}if(D==="+"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("plus",D);continue}if(F&&F.value==="("||r.regex===!1){Ae({type:"plus",value:D,output:f});continue}if(F&&(F.type==="bracket"||F.type==="paren"||F.type==="brace")||A.parens>0){Ae({type:"plus",value:D});continue}Ae({type:"plus",value:f});continue}if(D==="@"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){Ae({type:"at",extglob:!0,value:D,output:""});continue}Ae({type:"text",value:D});continue}if(D!=="*"){(D==="$"||D==="^")&&(D=`\\${D}`);let ee=pde.exec(Pe());ee&&(D+=ee[0],A.index+=ee[0].length),Ae({type:"text",value:D});continue}if(F&&(F.type==="globstar"||F.star===!0)){F.type="star",F.star=!0,F.value+=D,F.output=q,A.backtrack=!0,A.globstar=!0,qe(D);continue}let G=Pe();if(r.noextglob!==!0&&/^\([^?]/.test(G)){De("star",D);continue}if(F.type==="star"){if(r.noglobstar===!0){qe(D);continue}let ee=F.prev,Ue=ee.prev,Oe=ee.type==="slash"||ee.type==="bos",vt=Ue&&(Ue.type==="star"||Ue.type==="globstar");if(r.bash===!0&&(!Oe||G[0]&&G[0]!=="/")){Ae({type:"star",value:D,output:""});continue}let dt=A.braces>0&&(ee.type==="comma"||ee.type==="brace"),ri=V.length&&(ee.type==="pipe"||ee.type==="paren");if(!Oe&&ee.type!=="paren"&&!dt&&!ri){Ae({type:"star",value:D,output:""});continue}for(;G.slice(0,3)==="/**";){let ii=t[A.index+4];if(ii&&ii!=="/")break;G=G.slice(3),qe("/**",3)}if(ee.type==="bos"&&he()){F.type="globstar",F.value+=D,F.output=K(r),A.output=F.output,A.globstar=!0,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&!vt&&he()){A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=K(r)+(r.strictSlashes?")":"|$)"),F.value+=D,A.globstar=!0,A.output+=ee.output+F.output,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&G[0]==="/"){let ii=G[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=`${K(r)}${h}|${h}${ii})`,F.value+=D,A.output+=ee.output+F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}if(ee.type==="bos"&&G[0]==="/"){F.type="globstar",F.value+=D,F.output=`(?:^|${h}|${K(r)}${h})`,A.output=F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-F.output.length),F.type="globstar",F.output=K(r),F.value+=D,A.output+=F.output,A.globstar=!0,qe(D);continue}let Ce={type:"star",value:D,output:q};if(r.bash===!0){Ce.output=".*?",(F.type==="bos"||F.type==="slash")&&(Ce.output=J+Ce.output),Ae(Ce);continue}if(F&&(F.type==="bracket"||F.type==="paren")&&r.regex===!0){Ce.output=D,Ae(Ce);continue}(A.index===A.start||F.type==="slash"||F.type==="dot")&&(F.type==="dot"?(A.output+=E,F.output+=E):r.dot===!0?(A.output+=B,F.output+=B):(A.output+=J,F.output+=J),pe()!=="*"&&(A.output+=p,F.output+=p)),Ae(Ce)}for(;A.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));A.output=Fn.escapeLast(A.output,"["),ae("brackets")}for(;A.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing",")"));A.output=Fn.escapeLast(A.output,"("),ae("parens")}for(;A.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","}"));A.output=Fn.escapeLast(A.output,"{"),ae("braces")}if(r.strictSlashes!==!0&&(F.type==="star"||F.type==="bracket")&&Ae({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let G of A.tokens)A.output+=G.output!=null?G.output:G.value,G.suffix&&(A.output+=G.suffix)}return A};eU.fastpaths=(t,e)=>{let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OI,r.maxLength):OI,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);t=$1[t]||t;let s=Fn.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=MI.globChars(s),d=r.dot?g:u,m=r.dot?f:u,E=r.capture?"":"?:",B={negated:!1,prefix:""},b=r.bash===!0?".*?":h;r.capture&&(b=`(${b})`);let R=J=>J.noglobstar===!0?b:`(${E}(?:(?!${p}${J.dot?c:o}).)*?)`,H=J=>{switch(J){case"*":return`${d}${l}${b}`;case".*":return`${o}${l}${b}`;case"*.*":return`${d}${b}${o}${l}${b}`;case"*/*":return`${d}${b}${a}${l}${m}${b}`;case"**":return d+R(r);case"**/*":return`(?:${d}${R(r)}${a})?${m}${l}${b}`;case"**/*.*":return`(?:${d}${R(r)}${a})?${m}${b}${o}${l}${b}`;case"**/.*":return`(?:${d}${R(r)}${a})?${o}${l}${b}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(J);if(!ne)return;let q=H(ne[1]);return q?q+o+ne[2]:void 0}}},L=Fn.removePrefix(t,B),K=H(L);return K&&r.strictSlashes!==!0&&(K+=`${a}?`),K};Z1.exports=eU});var iU=I((W$e,rU)=>{"use strict";var mde=require("path"),Ide=X1(),tv=tU(),rv=Ch(),Ede=dh(),yde=t=>t&&typeof t=="object"&&!Array.isArray(t),Dr=(t,e,r=!1)=>{if(Array.isArray(t)){let u=t.map(f=>Dr(f,e,r));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=yde(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=rv.isWindows(e),o=i?Dr.compileRe(t,e):Dr.makeRe(t,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=_(P({},e),{ignore:null,onMatch:null,onResult:null});l=Dr(n.ignore,u,r)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Dr.test(u,o,e,{glob:t,posix:s}),d={glob:t,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(d),f===!1?(d.isMatch=!1,g?d:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(d),d.isMatch=!1,g?d:!1):(typeof n.onMatch=="function"&&n.onMatch(d),g?d:!0)};return r&&(c.state=a),c};Dr.test=(t,e,r,{glob:i,posix:n}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let s=r||{},o=s.format||(n?rv.toPosixSlashes:null),a=t===i,l=a&&o?o(t):t;return a===!1&&(l=o?o(t):t,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Dr.matchBase(t,e,r,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Dr.matchBase=(t,e,r,i=rv.isWindows(r))=>(e instanceof RegExp?e:Dr.makeRe(e,r)).test(mde.basename(t));Dr.isMatch=(t,e,r)=>Dr(e,r)(t);Dr.parse=(t,e)=>Array.isArray(t)?t.map(r=>Dr.parse(r,e)):tv(t,_(P({},e),{fastpaths:!1}));Dr.scan=(t,e)=>Ide(t,e);Dr.compileRe=(t,e,r=!1,i=!1)=>{if(r===!0)return t.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${t.output})${o}`;t&&t.negated===!0&&(a=`^(?!${a}).*$`);let l=Dr.toRegex(a,e);return i===!0&&(l.state=t),l};Dr.makeRe=(t,e,r=!1,i=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let n=e||{},s={negated:!1,fastpaths:!0},o="",a;return t.startsWith("./")&&(t=t.slice(2),o=s.prefix="./"),n.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a=tv.fastpaths(t,e)),a===void 0?(s=tv(t,e),s.prefix=o+(s.prefix||"")):s.output=a,Dr.compileRe(s,e,r,i)};Dr.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Dr.constants=Ede;rU.exports=Dr});var iv=I((z$e,nU)=>{"use strict";nU.exports=iU()});var Nn=I((V$e,sU)=>{"use strict";var oU=require("util"),aU=M1(),no=iv(),nv=Ch(),AU=t=>typeof t=="string"&&(t===""||t==="./"),pr=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),r&&r.onResult&&r.onResult(u)};for(let u=0;u!i.has(u));if(r&&c.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};pr.match=pr;pr.matcher=(t,e)=>no(t,e);pr.isMatch=(t,e,r)=>no(e,r)(t);pr.any=pr.isMatch;pr.not=(t,e,r={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{r.onResult&&r.onResult(a),n.push(a.output)},o=pr(t,e,_(P({},r),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};pr.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);if(Array.isArray(e))return e.some(i=>pr.contains(t,i,r));if(typeof e=="string"){if(AU(t)||AU(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return pr.isMatch(t,e,_(P({},r),{contains:!0}))};pr.matchKeys=(t,e,r)=>{if(!nv.isObject(t))throw new TypeError("Expected the first argument to be an object");let i=pr(Object.keys(t),e,r),n={};for(let s of i)n[s]=t[s];return n};pr.some=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(i.some(o=>s(o)))return!0}return!1};pr.every=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(!i.every(o=>s(o)))return!1}return!0};pr.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);return[].concat(e).every(i=>no(i,r)(t))};pr.capture=(t,e,r)=>{let i=nv.isWindows(r),s=no.makeRe(String(t),_(P({},r),{capture:!0})).exec(i?nv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};pr.makeRe=(...t)=>no.makeRe(...t);pr.scan=(...t)=>no.scan(...t);pr.parse=(t,e)=>{let r=[];for(let i of[].concat(t||[]))for(let n of aU(String(i),e))r.push(no.parse(n,e));return r};pr.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:aU(t,e)};pr.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return pr.braces(t,_(P({},e),{expand:!0}))};sU.exports=pr});var cU=I((_$e,lU)=>{"use strict";lU.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var gU=I((X$e,uU)=>{"use strict";var wde=cU();uU.exports=t=>typeof t=="string"?t.replace(wde(),""):t});var lu={};it(lu,{KeyRelationship:()=>Bl,applyCascade:()=>fv,base64RegExp:()=>CU,colorStringAlphaRegExp:()=>dU,colorStringRegExp:()=>pU,computeKey:()=>rA,getPrintable:()=>Mr,hasExactLength:()=>wU,hasForbiddenKeys:()=>eCe,hasKeyRelationship:()=>pv,hasMaxLength:()=>Mde,hasMinLength:()=>Tde,hasMutuallyExclusiveKeys:()=>tCe,hasRequiredKeys:()=>$de,hasUniqueItems:()=>Ode,isArray:()=>xde,isAtLeast:()=>Hde,isAtMost:()=>Gde,isBase64:()=>Xde,isBoolean:()=>bde,isDate:()=>Sde,isDict:()=>Pde,isEnum:()=>Yi,isHexColor:()=>_de,isISO8601:()=>Vde,isInExclusiveRange:()=>Yde,isInInclusiveRange:()=>jde,isInstanceOf:()=>Rde,isInteger:()=>qde,isJSON:()=>Zde,isLiteral:()=>Bde,isLowerCase:()=>Jde,isNegative:()=>Kde,isNullable:()=>Lde,isNumber:()=>vde,isObject:()=>Dde,isOneOf:()=>Fde,isOptional:()=>Nde,isPositive:()=>Ude,isString:()=>gv,isTuple:()=>kde,isUUID4:()=>zde,isUnknown:()=>yU,isUpperCase:()=>Wde,iso8601RegExp:()=>uv,makeCoercionFn:()=>wl,makeSetter:()=>EU,makeTrait:()=>IU,makeValidator:()=>Ct,matchesRegExp:()=>hv,plural:()=>GI,pushError:()=>at,simpleKeyRegExp:()=>hU,uuid4RegExp:()=>mU});function Ct({test:t}){return IU(t)()}function Mr(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function rA(t,e){var r,i,n;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:hU.test(e)?`${(i=t==null?void 0:t.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=t==null?void 0:t.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wl(t,e){return r=>{let i=t[e];return t[e]=r,wl(t,e).bind(null,i)}}function EU(t,e){return r=>{t[e]=r}}function GI(t,e,r){return t===1?e:r}function at({errors:t,p:e}={},r){return t==null||t.push(`${e!=null?e:"."}: ${r}`),!1}function Bde(t){return Ct({test:(e,r)=>e!==t?at(r,`Expected a literal (got ${Mr(t)})`):!0})}function Yi(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return Ct({test:(i,n)=>r.has(i)?!0:at(n,`Expected a valid enumeration value (got ${Mr(i)})`)})}var hU,pU,dU,CU,mU,uv,IU,yU,gv,Qde,bde,vde,Sde,xde,kde,Pde,Dde,Rde,Fde,fv,Nde,Lde,Tde,Mde,wU,Ode,Kde,Ude,Hde,Gde,jde,Yde,qde,hv,Jde,Wde,zde,Vde,_de,Xde,Zde,$de,eCe,tCe,Bl,rCe,pv,Ss=Yfe(()=>{hU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,pU=/^#[0-9a-f]{6}$/i,dU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,CU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,mU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,uv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,IU=t=>()=>t;yU=()=>Ct({test:(t,e)=>!0});gv=()=>Ct({test:(t,e)=>typeof t!="string"?at(e,`Expected a string (got ${Mr(t)})`):!0});Qde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),bde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i=Qde.get(t);if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a boolean (got ${Mr(t)})`)}return!0}}),vde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===t)i=n;else return at(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a number (got ${Mr(t)})`)}return!0}}),Sde=()=>Ct({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"&&uv.test(t))i=new Date(t);else{let n;if(typeof t=="string"){let s;try{s=JSON.parse(t)}catch(o){}typeof s=="number"&&(n=s)}else typeof t=="number"&&(n=t);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return at(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a date (got ${Mr(t)})`)}return!0}}),xde=(t,{delimiter:e}={})=>Ct({test:(r,i)=>{var n;if(typeof r=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");r=r.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,r)])}if(!Array.isArray(r))return at(i,`Expected an array (got ${Mr(r)})`);let s=!0;for(let o=0,a=r.length;o{let r=wU(t.length);return Ct({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return at(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return at(n,`Expected a tuple (got ${Mr(i)})`);let o=r(i,Object.assign({},n));for(let a=0,l=i.length;aCt({test:(r,i)=>{if(typeof r!="object"||r===null)return at(i,`Expected an object (got ${Mr(r)})`);let n=Object.keys(r),s=!0;for(let o=0,a=n.length;o{let r=Object.keys(t);return Ct({test:(i,n)=>{if(typeof i!="object"||i===null)return at(n,`Expected an object (got ${Mr(i)})`);let s=new Set([...r,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(t,l)?t[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:rA(n,l),coercion:wl(i,l)}))&&a:e===null?a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),`Extraneous property (got ${Mr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:EU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Rde=t=>Ct({test:(e,r)=>e instanceof t?!0:at(r,`Expected an instance of ${t.name} (got ${Mr(e)})`)}),Fde=(t,{exclusive:e=!1}={})=>Ct({test:(r,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=t.length;c1?at(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fv=(t,e)=>Ct({test:(r,i)=>{var n,s;let o={value:r},a=typeof(i==null?void 0:i.coercions)!="undefined"?wl(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!t(r,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==r){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Nde=t=>Ct({test:(e,r)=>typeof e=="undefined"?!0:t(e,r)}),Lde=t=>Ct({test:(e,r)=>e===null?!0:t(e,r)}),Tde=t=>Ct({test:(e,r)=>e.length>=t?!0:at(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),Mde=t=>Ct({test:(e,r)=>e.length<=t?!0:at(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),wU=t=>Ct({test:(e,r)=>e.length!==t?at(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),Ode=({map:t}={})=>Ct({test:(e,r)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sCt({test:(t,e)=>t<=0?!0:at(e,`Expected to be negative (got ${t})`)}),Ude=()=>Ct({test:(t,e)=>t>=0?!0:at(e,`Expected to be positive (got ${t})`)}),Hde=t=>Ct({test:(e,r)=>e>=t?!0:at(r,`Expected to be at least ${t} (got ${e})`)}),Gde=t=>Ct({test:(e,r)=>e<=t?!0:at(r,`Expected to be at most ${t} (got ${e})`)}),jde=(t,e)=>Ct({test:(r,i)=>r>=t&&r<=e?!0:at(i,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),Yde=(t,e)=>Ct({test:(r,i)=>r>=t&&rCt({test:(e,r)=>e!==Math.round(e)?at(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:at(r,`Expected to be a safe integer (got ${e})`)}),hv=t=>Ct({test:(e,r)=>t.test(e)?!0:at(r,`Expected to match the pattern ${t.toString()} (got ${Mr(e)})`)}),Jde=()=>Ct({test:(t,e)=>t!==t.toLowerCase()?at(e,`Expected to be all-lowercase (got ${t})`):!0}),Wde=()=>Ct({test:(t,e)=>t!==t.toUpperCase()?at(e,`Expected to be all-uppercase (got ${t})`):!0}),zde=()=>Ct({test:(t,e)=>mU.test(t)?!0:at(e,`Expected to be a valid UUID v4 (got ${Mr(t)})`)}),Vde=()=>Ct({test:(t,e)=>uv.test(t)?!1:at(e,`Expected to be a valid ISO 8601 date string (got ${Mr(t)})`)}),_de=({alpha:t=!1})=>Ct({test:(e,r)=>(t?pU.test(e):dU.test(e))?!0:at(r,`Expected to be a valid hexadecimal color string (got ${Mr(e)})`)}),Xde=()=>Ct({test:(t,e)=>CU.test(t)?!0:at(e,`Expected to be a valid base 64 string (got ${Mr(t)})`)}),Zde=(t=yU())=>Ct({test:(e,r)=>{let i;try{i=JSON.parse(e)}catch(n){return at(r,`Expected to be a valid JSON string (got ${Mr(e)})`)}return t(i,r)}}),$de=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?at(i,`Missing required ${GI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},eCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?at(i,`Forbidden ${GI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?at(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Bl||(Bl={}));rCe={[Bl.Forbids]:{expect:!1,message:"forbids using"},[Bl.Requires]:{expect:!0,message:"requires using"}},pv=(t,e,r,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(r),o=rCe[e];return Ct({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(t)||n.has(a[t]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?at(l,`Property "${t}" ${o.message} ${GI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var Sh=I(($et,OU)=>{var mCe="2.0.0",ICe=256,ECe=Number.MAX_SAFE_INTEGER||9007199254740991,yCe=16;OU.exports={SEMVER_SPEC_VERSION:mCe,MAX_LENGTH:ICe,MAX_SAFE_INTEGER:ECe,MAX_SAFE_COMPONENT_LENGTH:yCe}});var xh=I((ett,KU)=>{var wCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};KU.exports=wCe});var Ql=I((iA,UU)=>{var{MAX_SAFE_COMPONENT_LENGTH:yv}=Sh(),BCe=xh();iA=UU.exports={};var QCe=iA.re=[],Je=iA.src=[],We=iA.t={},bCe=0,mt=(t,e,r)=>{let i=bCe++;BCe(i,e),We[t]=i,Je[i]=e,QCe[i]=new RegExp(e,r?"g":void 0)};mt("NUMERICIDENTIFIER","0|[1-9]\\d*");mt("NUMERICIDENTIFIERLOOSE","[0-9]+");mt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");mt("MAINVERSION",`(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})`);mt("MAINVERSIONLOOSE",`(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})`);mt("PRERELEASEIDENTIFIER",`(?:${Je[We.NUMERICIDENTIFIER]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASEIDENTIFIERLOOSE",`(?:${Je[We.NUMERICIDENTIFIERLOOSE]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASE",`(?:-(${Je[We.PRERELEASEIDENTIFIER]}(?:\\.${Je[We.PRERELEASEIDENTIFIER]})*))`);mt("PRERELEASELOOSE",`(?:-?(${Je[We.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${Je[We.PRERELEASEIDENTIFIERLOOSE]})*))`);mt("BUILDIDENTIFIER","[0-9A-Za-z-]+");mt("BUILD",`(?:\\+(${Je[We.BUILDIDENTIFIER]}(?:\\.${Je[We.BUILDIDENTIFIER]})*))`);mt("FULLPLAIN",`v?${Je[We.MAINVERSION]}${Je[We.PRERELEASE]}?${Je[We.BUILD]}?`);mt("FULL",`^${Je[We.FULLPLAIN]}$`);mt("LOOSEPLAIN",`[v=\\s]*${Je[We.MAINVERSIONLOOSE]}${Je[We.PRERELEASELOOSE]}?${Je[We.BUILD]}?`);mt("LOOSE",`^${Je[We.LOOSEPLAIN]}$`);mt("GTLT","((?:<|>)?=?)");mt("XRANGEIDENTIFIERLOOSE",`${Je[We.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);mt("XRANGEIDENTIFIER",`${Je[We.NUMERICIDENTIFIER]}|x|X|\\*`);mt("XRANGEPLAIN",`[v=\\s]*(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:${Je[We.PRERELEASE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGEPLAINLOOSE",`[v=\\s]*(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:${Je[We.PRERELEASELOOSE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAIN]}$`);mt("XRANGELOOSE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAINLOOSE]}$`);mt("COERCE",`(^|[^\\d])(\\d{1,${yv}})(?:\\.(\\d{1,${yv}}))?(?:\\.(\\d{1,${yv}}))?(?:$|[^\\d])`);mt("COERCERTL",Je[We.COERCE],!0);mt("LONETILDE","(?:~>?)");mt("TILDETRIM",`(\\s*)${Je[We.LONETILDE]}\\s+`,!0);iA.tildeTrimReplace="$1~";mt("TILDE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAIN]}$`);mt("TILDELOOSE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("LONECARET","(?:\\^)");mt("CARETTRIM",`(\\s*)${Je[We.LONECARET]}\\s+`,!0);iA.caretTrimReplace="$1^";mt("CARET",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAIN]}$`);mt("CARETLOOSE",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("COMPARATORLOOSE",`^${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]})$|^$`);mt("COMPARATOR",`^${Je[We.GTLT]}\\s*(${Je[We.FULLPLAIN]})$|^$`);mt("COMPARATORTRIM",`(\\s*)${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]}|${Je[We.XRANGEPLAIN]})`,!0);iA.comparatorTrimReplace="$1$2$3";mt("HYPHENRANGE",`^\\s*(${Je[We.XRANGEPLAIN]})\\s+-\\s+(${Je[We.XRANGEPLAIN]})\\s*$`);mt("HYPHENRANGELOOSE",`^\\s*(${Je[We.XRANGEPLAINLOOSE]})\\s+-\\s+(${Je[We.XRANGEPLAINLOOSE]})\\s*$`);mt("STAR","(<|>)?=?\\s*\\*");mt("GTE0","^\\s*>=\\s*0.0.0\\s*$");mt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var kh=I((ttt,HU)=>{var vCe=["includePrerelease","loose","rtl"],SCe=t=>t?typeof t!="object"?{loose:!0}:vCe.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};HU.exports=SCe});var zI=I((rtt,GU)=>{var jU=/^[0-9]+$/,YU=(t,e)=>{let r=jU.test(t),i=jU.test(e);return r&&i&&(t=+t,e=+e),t===e?0:r&&!i?-1:i&&!r?1:tYU(e,t);GU.exports={compareIdentifiers:YU,rcompareIdentifiers:xCe}});var bi=I((itt,qU)=>{var VI=xh(),{MAX_LENGTH:JU,MAX_SAFE_INTEGER:_I}=Sh(),{re:WU,t:zU}=Ql(),kCe=kh(),{compareIdentifiers:Ph}=zI(),_n=class{constructor(e,r){if(r=kCe(r),e instanceof _n){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>JU)throw new TypeError(`version is longer than ${JU} characters`);VI("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let i=e.trim().match(r.loose?WU[zU.LOOSE]:WU[zU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>_I||this.major<0)throw new TypeError("Invalid major version");if(this.minor>_I||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>_I||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<_I)return s}return n}):this.prerelease=[],this.build=i[5]?i[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(VI("SemVer.compare",this.version,this.options,e),!(e instanceof _n)){if(typeof e=="string"&&e===this.version)return 0;e=new _n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof _n||(e=new _n(e,this.options)),Ph(this.major,e.major)||Ph(this.minor,e.minor)||Ph(this.patch,e.patch)}comparePre(e){if(e instanceof _n||(e=new _n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let r=0;do{let i=this.prerelease[r],n=e.prerelease[r];if(VI("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}compareBuild(e){e instanceof _n||(e=new _n(e,this.options));let r=0;do{let i=this.build[r],n=e.build[r];if(VI("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}inc(e,r){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",r),this.inc("pre",r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",r),this.inc("pre",r);break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}r&&(this.prerelease[0]===r?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};qU.exports=_n});var bl=I((ntt,VU)=>{var{MAX_LENGTH:PCe}=Sh(),{re:_U,t:XU}=Ql(),ZU=bi(),DCe=kh(),RCe=(t,e)=>{if(e=DCe(e),t instanceof ZU)return t;if(typeof t!="string"||t.length>PCe||!(e.loose?_U[XU.LOOSE]:_U[XU.FULL]).test(t))return null;try{return new ZU(t,e)}catch(i){return null}};VU.exports=RCe});var e2=I((stt,$U)=>{var FCe=bl(),NCe=(t,e)=>{let r=FCe(t,e);return r?r.version:null};$U.exports=NCe});var r2=I((ott,t2)=>{var LCe=bl(),TCe=(t,e)=>{let r=LCe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};t2.exports=TCe});var n2=I((att,i2)=>{var MCe=bi(),OCe=(t,e,r,i)=>{typeof r=="string"&&(i=r,r=void 0);try{return new MCe(t,r).inc(e,i).version}catch(n){return null}};i2.exports=OCe});var Xn=I((Att,s2)=>{var o2=bi(),KCe=(t,e,r)=>new o2(t,r).compare(new o2(e,r));s2.exports=KCe});var XI=I((ltt,a2)=>{var UCe=Xn(),HCe=(t,e,r)=>UCe(t,e,r)===0;a2.exports=HCe});var c2=I((ctt,A2)=>{var l2=bl(),GCe=XI(),jCe=(t,e)=>{if(GCe(t,e))return null;{let r=l2(t),i=l2(e),n=r.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in r)if((a==="major"||a==="minor"||a==="patch")&&r[a]!==i[a])return s+a;return o}};A2.exports=jCe});var g2=I((utt,u2)=>{var YCe=bi(),qCe=(t,e)=>new YCe(t,e).major;u2.exports=qCe});var h2=I((gtt,f2)=>{var JCe=bi(),WCe=(t,e)=>new JCe(t,e).minor;f2.exports=WCe});var d2=I((ftt,p2)=>{var zCe=bi(),VCe=(t,e)=>new zCe(t,e).patch;p2.exports=VCe});var m2=I((htt,C2)=>{var _Ce=bl(),XCe=(t,e)=>{let r=_Ce(t,e);return r&&r.prerelease.length?r.prerelease:null};C2.exports=XCe});var E2=I((ptt,I2)=>{var ZCe=Xn(),$Ce=(t,e,r)=>ZCe(e,t,r);I2.exports=$Ce});var w2=I((dtt,y2)=>{var eme=Xn(),tme=(t,e)=>eme(t,e,!0);y2.exports=tme});var ZI=I((Ctt,B2)=>{var Q2=bi(),rme=(t,e,r)=>{let i=new Q2(t,r),n=new Q2(e,r);return i.compare(n)||i.compareBuild(n)};B2.exports=rme});var v2=I((mtt,b2)=>{var ime=ZI(),nme=(t,e)=>t.sort((r,i)=>ime(r,i,e));b2.exports=nme});var x2=I((Itt,S2)=>{var sme=ZI(),ome=(t,e)=>t.sort((r,i)=>sme(i,r,e));S2.exports=ome});var Dh=I((Ett,k2)=>{var ame=Xn(),Ame=(t,e,r)=>ame(t,e,r)>0;k2.exports=Ame});var $I=I((ytt,P2)=>{var lme=Xn(),cme=(t,e,r)=>lme(t,e,r)<0;P2.exports=cme});var wv=I((wtt,D2)=>{var ume=Xn(),gme=(t,e,r)=>ume(t,e,r)!==0;D2.exports=gme});var eE=I((Btt,R2)=>{var fme=Xn(),hme=(t,e,r)=>fme(t,e,r)>=0;R2.exports=hme});var tE=I((Qtt,F2)=>{var pme=Xn(),dme=(t,e,r)=>pme(t,e,r)<=0;F2.exports=dme});var Bv=I((btt,N2)=>{var Cme=XI(),mme=wv(),Ime=Dh(),Eme=eE(),yme=$I(),wme=tE(),Bme=(t,e,r,i)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return Cme(t,r,i);case"!=":return mme(t,r,i);case">":return Ime(t,r,i);case">=":return Eme(t,r,i);case"<":return yme(t,r,i);case"<=":return wme(t,r,i);default:throw new TypeError(`Invalid operator: ${e}`)}};N2.exports=Bme});var T2=I((vtt,L2)=>{var Qme=bi(),bme=bl(),{re:rE,t:iE}=Ql(),vme=(t,e)=>{if(t instanceof Qme)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(rE[iE.COERCE]);else{let i;for(;(i=rE[iE.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||i.index+i[0].length!==r.index+r[0].length)&&(r=i),rE[iE.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;rE[iE.COERCERTL].lastIndex=-1}return r===null?null:bme(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};L2.exports=vme});var O2=I((Stt,M2)=>{"use strict";M2.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Rh=I((xtt,K2)=>{"use strict";K2.exports=Pt;Pt.Node=vl;Pt.create=Pt;function Pt(t){var e=this;if(e instanceof Pt||(e=new Pt),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=e;else if(this.head)i=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)r=t(r,i.value,n),i=i.next;return r};Pt.prototype.reduceReverse=function(t,e){var r,i=this.tail;if(arguments.length>1)r=e;else if(this.tail)i=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)r=t(r,i.value,n),i=i.prev;return r};Pt.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Pt.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Pt.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Pt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>t;i--,n=n.prev)r.push(n.value);return r};Pt.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var i=0,n=this.head;n!==null&&i{"use strict";var Pme=Rh(),Sl=Symbol("max"),ra=Symbol("length"),uu=Symbol("lengthCalculator"),Fh=Symbol("allowStale"),xl=Symbol("maxAge"),ia=Symbol("dispose"),H2=Symbol("noDisposeOnSet"),si=Symbol("lruList"),ks=Symbol("cache"),G2=Symbol("updateAgeOnGet"),Qv=()=>1,j2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[Sl]=e.max||Infinity,i=e.length||Qv;if(this[uu]=typeof i!="function"?Qv:i,this[Fh]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xl]=e.maxAge||0,this[ia]=e.dispose,this[H2]=e.noDisposeOnSet||!1,this[G2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Sl]=e||Infinity,Nh(this)}get max(){return this[Sl]}set allowStale(e){this[Fh]=!!e}get allowStale(){return this[Fh]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xl]=e,Nh(this)}get maxAge(){return this[xl]}set lengthCalculator(e){typeof e!="function"&&(e=Qv),e!==this[uu]&&(this[uu]=e,this[ra]=0,this[si].forEach(r=>{r.length=this[uu](r.value,r.key),this[ra]+=r.length})),Nh(this)}get lengthCalculator(){return this[uu]}get length(){return this[ra]}get itemCount(){return this[si].length}rforEach(e,r){r=r||this;for(let i=this[si].tail;i!==null;){let n=i.prev;q2(this,e,i,r),i=n}}forEach(e,r){r=r||this;for(let i=this[si].head;i!==null;){let n=i.next;q2(this,e,i,r),i=n}}keys(){return this[si].toArray().map(e=>e.key)}values(){return this[si].toArray().map(e=>e.value)}reset(){this[ia]&&this[si]&&this[si].length&&this[si].forEach(e=>this[ia](e.key,e.value)),this[ks]=new Map,this[si]=new Pme,this[ra]=0}dump(){return this[si].map(e=>nE(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[si]}set(e,r,i){if(i=i||this[xl],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[uu](r,e);if(this[ks].has(e)){if(s>this[Sl])return gu(this,this[ks].get(e)),!1;let l=this[ks].get(e).value;return this[ia]&&(this[H2]||this[ia](e,l.value)),l.now=n,l.maxAge=i,l.value=r,this[ra]+=s-l.length,l.length=s,this.get(e),Nh(this),!0}let o=new Y2(e,r,s,n,i);return o.length>this[Sl]?(this[ia]&&this[ia](e,r),!1):(this[ra]+=o.length,this[si].unshift(o),this[ks].set(e,this[si].head),Nh(this),!0)}has(e){if(!this[ks].has(e))return!1;let r=this[ks].get(e).value;return!nE(this,r)}get(e){return bv(this,e,!0)}peek(e){return bv(this,e,!1)}pop(){let e=this[si].tail;return e?(gu(this,e),e.value):null}del(e){gu(this,this[ks].get(e))}load(e){this.reset();let r=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-r;o>0&&this.set(n.k,n.v,o)}}}prune(){this[ks].forEach((e,r)=>bv(this,r,!1))}},bv=(t,e,r)=>{let i=t[ks].get(e);if(i){let n=i.value;if(nE(t,n)){if(gu(t,i),!t[Fh])return}else r&&(t[G2]&&(i.value.now=Date.now()),t[si].unshiftNode(i));return n.value}},nE=(t,e)=>{if(!e||!e.maxAge&&!t[xl])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[xl]&&r>t[xl]},Nh=t=>{if(t[ra]>t[Sl])for(let e=t[si].tail;t[ra]>t[Sl]&&e!==null;){let r=e.prev;gu(t,e),e=r}},gu=(t,e)=>{if(e){let r=e.value;t[ia]&&t[ia](r.key,r.value),t[ra]-=r.length,t[ks].delete(r.key),t[si].removeNode(e)}},Y2=class{constructor(e,r,i,n,s){this.key=e,this.value=r,this.length=i,this.now=n,this.maxAge=s||0}},q2=(t,e,r,i)=>{let n=r.value;nE(t,n)&&(gu(t,r),t[Fh]||(n=void 0)),n&&e.call(i,n.value,n.key,t)};U2.exports=j2});var Zn=I((Ptt,W2)=>{var fu=class{constructor(e,r){if(r=Dme(r),e instanceof fu)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new fu(e.raw,r);if(e instanceof vv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!V2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Tme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=z2.get(i);if(n)return n;let s=this.options.loose,o=s?vi[di.HYPHENRANGELOOSE]:vi[di.HYPHENRANGE];e=e.replace(o,Kme(this.options.includePrerelease)),Rr("hyphen replace",e),e=e.replace(vi[di.COMPARATORTRIM],Fme),Rr("comparator trim",e,vi[di.COMPARATORTRIM]),e=e.replace(vi[di.TILDETRIM],Nme),e=e.replace(vi[di.CARETTRIM],Lme),e=e.split(/\s+/).join(" ");let a=s?vi[di.COMPARATORLOOSE]:vi[di.COMPARATOR],l=e.split(" ").map(f=>Mme(f,this.options)).join(" ").split(/\s+/).map(f=>Ome(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new vv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(V2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return z2.set(i,g),g}intersects(e,r){if(!(e instanceof fu))throw new TypeError("a Range is required");return this.set.some(i=>_2(i,r)&&e.set.some(n=>_2(n,r)&&i.every(s=>n.every(o=>s.intersects(o,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Rme(e,this.options)}catch(r){return!1}for(let r=0;rt.value==="<0.0.0-0",Tme=t=>t.value==="",_2=(t,e)=>{let r=!0,i=t.slice(),n=i.pop();for(;r&&i.length;)r=i.every(s=>n.intersects(s,e)),n=i.pop();return r},Mme=(t,e)=>(Rr("comp",t,e),t=jme(t,e),Rr("caret",t),t=Gme(t,e),Rr("tildes",t),t=Yme(t,e),Rr("xrange",t),t=qme(t,e),Rr("stars",t),t),Ji=t=>!t||t.toLowerCase()==="x"||t==="*",Gme=(t,e)=>t.trim().split(/\s+/).map(r=>Jme(r,e)).join(" "),Jme=(t,e)=>{let r=e.loose?vi[di.TILDELOOSE]:vi[di.TILDE];return t.replace(r,(i,n,s,o,a)=>{Rr("tilde",t,i,n,s,o,a);let l;return Ji(n)?l="":Ji(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Ji(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Rr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Rr("tilde return",l),l})},jme=(t,e)=>t.trim().split(/\s+/).map(r=>Wme(r,e)).join(" "),Wme=(t,e)=>{Rr("caret",t,e);let r=e.loose?vi[di.CARETLOOSE]:vi[di.CARET],i=e.includePrerelease?"-0":"";return t.replace(r,(n,s,o,a,l)=>{Rr("caret",t,n,s,o,a,l);let c;return Ji(s)?c="":Ji(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Ji(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Rr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Rr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Rr("caret return",c),c})},Yme=(t,e)=>(Rr("replaceXRanges",t,e),t.split(/\s+/).map(r=>zme(r,e)).join(" ")),zme=(t,e)=>{t=t.trim();let r=e.loose?vi[di.XRANGELOOSE]:vi[di.XRANGE];return t.replace(r,(i,n,s,o,a,l)=>{Rr("xRange",t,i,n,s,o,a,l);let c=Ji(s),u=c||Ji(o),g=u||Ji(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Rr("xRange return",i),i})},qme=(t,e)=>(Rr("replaceStars",t,e),t.trim().replace(vi[di.STAR],"")),Ome=(t,e)=>(Rr("replaceGTE0",t,e),t.trim().replace(vi[e.includePrerelease?di.GTE0PRE:di.GTE0],"")),Kme=t=>(e,r,i,n,s,o,a,l,c,u,g,f,h)=>(Ji(i)?r="":Ji(n)?r=`>=${i}.0.0${t?"-0":""}`:Ji(s)?r=`>=${i}.${n}.0${t?"-0":""}`:o?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Ji(c)?l="":Ji(u)?l=`<${+c+1}.0.0-0`:Ji(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:t?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${r} ${l}`.trim()),Ume=(t,e,r)=>{for(let i=0;i0){let n=t[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Lh=I((Dtt,X2)=>{var Th=Symbol("SemVer ANY"),Mh=class{static get ANY(){return Th}constructor(e,r){if(r=Vme(r),e instanceof Mh){if(e.loose===!!r.loose)return e;e=e.value}xv("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Th?this.value="":this.value=this.operator+this.semver.version,xv("comp",this)}parse(e){let r=this.options.loose?Z2[$2.COMPARATORLOOSE]:Z2[$2.COMPARATOR],i=e.match(r);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new eH(i[2],this.options.loose):this.semver=Th}toString(){return this.value}test(e){if(xv("Comparator.test",e,this.options.loose),this.semver===Th||e===Th)return!0;if(typeof e=="string")try{e=new eH(e,this.options)}catch(r){return!1}return Sv(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof Mh))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new tH(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new tH(this.value,r).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=Sv(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=Sv(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};X2.exports=Mh;var Vme=kh(),{re:Z2,t:$2}=Ql(),Sv=Bv(),xv=xh(),eH=bi(),tH=Zn()});var Oh=I((Rtt,rH)=>{var _me=Zn(),Xme=(t,e,r)=>{try{e=new _me(e,r)}catch(i){return!1}return e.test(t)};rH.exports=Xme});var nH=I((Ftt,iH)=>{var Zme=Zn(),$me=(t,e)=>new Zme(t,e).set.map(r=>r.map(i=>i.value).join(" ").trim().split(" "));iH.exports=$me});var oH=I((Ntt,sH)=>{var eIe=bi(),tIe=Zn(),rIe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new tIe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new eIe(i,r))}),i};sH.exports=rIe});var AH=I((Ltt,aH)=>{var iIe=bi(),nIe=Zn(),sIe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new nIe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new iIe(i,r))}),i};aH.exports=sIe});var uH=I((Ttt,lH)=>{var kv=bi(),oIe=Zn(),cH=Dh(),aIe=(t,e)=>{t=new oIe(t,e);let r=new kv("0.0.0");if(t.test(r)||(r=new kv("0.0.0-0"),t.test(r)))return r;r=null;for(let i=0;i{let a=new kv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||cH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!r||cH(r,s))&&(r=s)}return r&&t.test(r)?r:null};lH.exports=aIe});var fH=I((Mtt,gH)=>{var AIe=Zn(),lIe=(t,e)=>{try{return new AIe(t,e).range||"*"}catch(r){return null}};gH.exports=lIe});var sE=I((Ott,hH)=>{var cIe=bi(),pH=Lh(),{ANY:uIe}=pH,gIe=Zn(),fIe=Oh(),dH=Dh(),CH=$I(),hIe=tE(),pIe=eE(),dIe=(t,e,r,i)=>{t=new cIe(t,i),e=new gIe(e,i);let n,s,o,a,l;switch(r){case">":n=dH,s=hIe,o=CH,a=">",l=">=";break;case"<":n=CH,s=pIe,o=dH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(fIe(t,e,i))return!1;for(let c=0;c{h.semver===uIe&&(h=new pH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(t,f.semver))return!1;if(f.operator===l&&o(t,f.semver))return!1}return!0};hH.exports=dIe});var IH=I((Ktt,mH)=>{var CIe=sE(),mIe=(t,e,r)=>CIe(t,e,">",r);mH.exports=mIe});var yH=I((Utt,EH)=>{var IIe=sE(),EIe=(t,e,r)=>IIe(t,e,"<",r);EH.exports=EIe});var QH=I((Htt,wH)=>{var BH=Zn(),yIe=(t,e,r)=>(t=new BH(t,r),e=new BH(e,r),t.intersects(e));wH.exports=yIe});var vH=I((Gtt,bH)=>{var wIe=Oh(),BIe=Xn();bH.exports=(t,e,r)=>{let i=[],n=null,s=null,o=t.sort((u,g)=>BIe(u,g,r));for(let u of o)wIe(u,e,r)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var xH=Zn(),oE=Lh(),{ANY:Pv}=oE,Kh=Oh(),Dv=Xn(),bIe=(t,e,r={})=>{if(t===e)return!0;t=new xH(t,r),e=new xH(e,r);let i=!1;e:for(let n of t.set){for(let s of e.set){let o=QIe(n,s,r);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},QIe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===Pv){if(e.length===1&&e[0].semver===Pv)return!0;r.includePrerelease?t=[new oE(">=0.0.0-0")]:t=[new oE(">=0.0.0")]}if(e.length===1&&e[0].semver===Pv){if(r.includePrerelease)return!0;e=[new oE(">=0.0.0")]}let i=new Set,n,s;for(let h of t)h.operator===">"||h.operator===">="?n=kH(n,h,r):h.operator==="<"||h.operator==="<="?s=PH(s,h,r):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=Dv(n.semver,s.semver,r),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Kh(h,String(n),r)||s&&!Kh(h,String(s),r))return null;for(let p of e)if(!Kh(h,String(p),r))return!1;return!0}let a,l,c,u,g=s&&!r.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=kH(n,h,r),a===h&&a!==n)return!1}else if(n.operator===">="&&!Kh(n.semver,String(h),r))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=PH(s,h,r),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Kh(s.semver,String(h),r))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},kH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i>0?t:i<0||e.operator===">"&&t.operator===">="?e:t},PH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i<0?t:i>0||e.operator==="<"&&t.operator==="<="?e:t};SH.exports=bIe});var Or=I((Ytt,RH)=>{var Rv=Ql();RH.exports={re:Rv.re,src:Rv.src,tokens:Rv.t,SEMVER_SPEC_VERSION:Sh().SEMVER_SPEC_VERSION,SemVer:bi(),compareIdentifiers:zI().compareIdentifiers,rcompareIdentifiers:zI().rcompareIdentifiers,parse:bl(),valid:e2(),clean:r2(),inc:n2(),diff:c2(),major:g2(),minor:h2(),patch:d2(),prerelease:m2(),compare:Xn(),rcompare:E2(),compareLoose:w2(),compareBuild:ZI(),sort:v2(),rsort:x2(),gt:Dh(),lt:$I(),eq:XI(),neq:wv(),gte:eE(),lte:tE(),cmp:Bv(),coerce:T2(),Comparator:Lh(),Range:Zn(),satisfies:Oh(),toComparators:nH(),maxSatisfying:oH(),minSatisfying:AH(),minVersion:uH(),validRange:fH(),outside:sE(),gtr:IH(),ltr:yH(),intersects:QH(),simplifyRange:vH(),subset:DH()}});var Uv=I(AE=>{"use strict";Object.defineProperty(AE,"__esModule",{value:!0});AE.VERSION=void 0;AE.VERSION="9.1.0"});var Dt=I((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(t,e,r){if(r||arguments.length===2)for(var i=0,n=e.length,s;i{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof lE=="object"&&lE.exports?lE.exports=e():t.regexpToAst=e()})(typeof self!="undefined"?self:YH,function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},t.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var d=this.disjunction();this.consumeChar("/");for(var m={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(m,"global");break;case"i":o(m,"ignoreCase");break;case"m":o(m,"multiLine");break;case"u":o(m,"unicode");break;case"y":o(m,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:m,value:d,loc:this.loc(0)}},t.prototype.disjunction=function(){var p=[],d=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(d)}},t.prototype.alternative=function(){for(var p=[],d=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(d)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var d;switch(this.popChar()){case"=":d="Lookahead";break;case"!":d="NegativeLookahead";break}a(d);var m=this.disjunction();return this.consumeChar(")"),{type:d,value:m,loc:this.loc(p)}}l()},t.prototype.quantifier=function(p){var d,m=this.idx;switch(this.popChar()){case"*":d={atLeast:0,atMost:Infinity};break;case"+":d={atLeast:1,atMost:Infinity};break;case"?":d={atLeast:0,atMost:1};break;case"{":var E=this.integerIncludingZero();switch(this.popChar()){case"}":d={atLeast:E,atMost:E};break;case",":var B;this.isDigit()?(B=this.integerIncludingZero(),d={atLeast:E,atMost:B}):d={atLeast:E,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&d===void 0)return;a(d);break}if(!(p===!0&&d===void 0))return a(d),this.peekChar(0)==="?"?(this.consumeChar("?"),d.greedy=!1):d.greedy=!0,d.type="Quantifier",d.loc=this.loc(m),d},t.prototype.atom=function(){var p,d=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(d),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},t.prototype.characterClassEscape=function(){var p,d=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,d=!0;break;case"s":p=f;break;case"S":p=f,d=!0;break;case"w":p=g;break;case"W":p=g,d=!0;break}return a(p),{type:"Set",value:p,complement:d}},t.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` +`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var d=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:d}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},t.prototype.characterClass=function(){var p=[],d=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),d=!0);this.isClassAtom();){var m=this.classAtom(),E=m.type==="Character";if(E&&this.isRangeDash()){this.consumeChar("-");var B=this.classAtom(),b=B.type==="Character";if(b){if(B.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,r=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,d){p.length!==void 0?p.forEach(function(m){d.push(m)}):d.push(p)}function o(p,d){if(p[d]===!0)throw"duplicate flag "+d;p[d]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var d in p){var m=p[d];p.hasOwnProperty(d)&&(m.type!==void 0?this.visit(m):Array.isArray(m)&&m.forEach(function(E){this.visit(E)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var gE=I(Iu=>{"use strict";Object.defineProperty(Iu,"__esModule",{value:!0});Iu.clearRegExpParserCache=Iu.getRegExpAst=void 0;var FIe=cE(),uE={},NIe=new FIe.RegExpParser;function LIe(t){var e=t.toString();if(uE.hasOwnProperty(e))return uE[e];var r=NIe.pattern(e);return uE[e]=r,r}Iu.getRegExpAst=LIe;function TIe(){uE={}}Iu.clearRegExpParserCache=TIe});var VH=I(fn=>{"use strict";var MIe=fn&&fn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(fn,"__esModule",{value:!0});fn.canMatchCharCode=fn.firstCharOptimizedIndices=fn.getOptimizedStartCodesIndices=fn.failedOptimizationPrefixMsg=void 0;var qH=cE(),$n=Dt(),JH=gE(),sa=Hv(),WH="Complement Sets are not supported for first char optimization";fn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function OIe(t,e){e===void 0&&(e=!1);try{var r=(0,JH.getRegExpAst)(t),i=fE(r.value,{},r.flags.ignoreCase);return i}catch(s){if(s.message===WH)e&&(0,$n.PRINT_WARNING)(""+fn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+t.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,$n.PRINT_ERROR)(fn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+t.toString()+` > +`)+(" Using the regexp-to-ast library version: "+qH.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}fn.getOptimizedStartCodesIndices=OIe;function fE(t,e,r){switch(t.type){case"Disjunction":for(var i=0;i=sa.minOptimizationVal)for(var f=u.from>=sa.minOptimizationVal?u.from:sa.minOptimizationVal,h=u.to,p=(0,sa.charCodeToOptimizedIndex)(f),d=(0,sa.charCodeToOptimizedIndex)(h),m=p;m<=d;m++)e[m]=m}}});break;case"Group":fE(o.value,e,r);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&Gv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,$n.values)(e)}fn.firstCharOptimizedIndices=fE;function hE(t,e,r){var i=(0,sa.charCodeToOptimizedIndex)(t);e[i]=i,r===!0&&KIe(t,e)}function KIe(t,e){var r=String.fromCharCode(t),i=r.toUpperCase();if(i!==r){var n=(0,sa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=r.toLowerCase();if(s!==r){var n=(0,sa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function zH(t,e){return(0,$n.find)(t.value,function(r){if(typeof r=="number")return(0,$n.contains)(e,r);var i=r;return(0,$n.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function Gv(t){return t.quantifier&&t.quantifier.atLeast===0?!0:t.value?(0,$n.isArray)(t.value)?(0,$n.every)(t.value,Gv):Gv(t.value):!1}var UIe=function(t){MIe(e,t);function e(r){var i=t.call(this)||this;return i.targetCharCodes=r,i.found=!1,i}return e.prototype.visitChildren=function(r){if(this.found!==!0){switch(r.type){case"Lookahead":this.visitLookahead(r);return;case"NegativeLookahead":this.visitNegativeLookahead(r);return}t.prototype.visitChildren.call(this,r)}},e.prototype.visitCharacter=function(r){(0,$n.contains)(this.targetCharCodes,r.value)&&(this.found=!0)},e.prototype.visitSet=function(r){r.complement?zH(r,this.targetCharCodes)===void 0&&(this.found=!0):zH(r,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(qH.BaseRegExpVisitor);function HIe(t,e){if(e instanceof RegExp){var r=(0,JH.getRegExpAst)(e),i=new UIe(t);return i.visit(r),i.found}else return(0,$n.find)(e,function(n){return(0,$n.contains)(t,n.charCodeAt(0))})!==void 0}fn.canMatchCharCode=HIe});var Hv=I(je=>{"use strict";var _H=je&&je.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(je,"__esModule",{value:!0});je.charCodeToOptimizedIndex=je.minOptimizationVal=je.buildLineBreakIssueMessage=je.LineTerminatorOptimizedTester=je.isShortPattern=je.isCustomPattern=je.cloneEmptyGroups=je.performWarningRuntimeChecks=je.performRuntimeChecks=je.addStickyFlag=je.addStartOfInput=je.findUnreachablePatterns=je.findModesThatDoNotExist=je.findInvalidGroupType=je.findDuplicatePatterns=je.findUnsupportedFlags=je.findStartOfInputAnchor=je.findEmptyMatchRegExps=je.findEndOfInputAnchor=je.findInvalidPatterns=je.findMissingPatterns=je.validatePatterns=je.analyzeTokenTypes=je.enableSticky=je.disableSticky=je.SUPPORT_STICKY=je.MODES=je.DEFAULT_MODE=void 0;var XH=cE(),zt=Gh(),Ee=Dt(),Eu=VH(),ZH=gE(),ao="PATTERN";je.DEFAULT_MODE="defaultMode";je.MODES="modes";je.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function GIe(){je.SUPPORT_STICKY=!1}je.disableSticky=GIe;function jIe(){je.SUPPORT_STICKY=!0}je.enableSticky=jIe;function qIe(t,e){e=(0,Ee.defaults)(e,{useSticky:je.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(B,b){return b()}});var r=e.tracer;r("initCharCodeToOptimizedIndexMap",function(){YIe()});var i;r("Reject Lexer.NA",function(){i=(0,Ee.reject)(t,function(B){return B[ao]===zt.Lexer.NA})});var n=!1,s;r("Transform Patterns",function(){n=!1,s=(0,Ee.map)(i,function(B){var b=B[ao];if((0,Ee.isRegExp)(b)){var R=b.source;return R.length===1&&R!=="^"&&R!=="$"&&R!=="."&&!b.ignoreCase?R:R.length===2&&R[0]==="\\"&&!(0,Ee.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],R[1])?R[1]:e.useSticky?Yv(b):jv(b)}else{if((0,Ee.isFunction)(b))return n=!0,{exec:b};if((0,Ee.has)(b,"exec"))return n=!0,b;if(typeof b=="string"){if(b.length===1)return b;var H=b.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),L=new RegExp(H);return e.useSticky?Yv(L):jv(L)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;r("misc mapping",function(){o=(0,Ee.map)(i,function(B){return B.tokenTypeIdx}),a=(0,Ee.map)(i,function(B){var b=B.GROUP;if(b!==zt.Lexer.SKIPPED){if((0,Ee.isString)(b))return b;if((0,Ee.isUndefined)(b))return!1;throw Error("non exhaustive match")}}),l=(0,Ee.map)(i,function(B){var b=B.LONGER_ALT;if(b){var R=(0,Ee.isArray)(b)?(0,Ee.map)(b,function(H){return(0,Ee.indexOf)(i,H)}):[(0,Ee.indexOf)(i,b)];return R}}),c=(0,Ee.map)(i,function(B){return B.PUSH_MODE}),u=(0,Ee.map)(i,function(B){return(0,Ee.has)(B,"POP_MODE")})});var g;r("Line Terminator Handling",function(){var B=tG(e.lineTerminatorCharacters);g=(0,Ee.map)(i,function(b){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ee.map)(i,function(b){if((0,Ee.has)(b,"LINE_BREAKS"))return b.LINE_BREAKS;if(eG(b,B)===!1)return(0,Eu.canMatchCharCode)(B,b.PATTERN)}))});var f,h,p,d;r("Misc Mapping #2",function(){f=(0,Ee.map)(i,qv),h=(0,Ee.map)(s,$H),p=(0,Ee.reduce)(i,function(B,b){var R=b.GROUP;return(0,Ee.isString)(R)&&R!==zt.Lexer.SKIPPED&&(B[R]=[]),B},{}),d=(0,Ee.map)(s,function(B,b){return{pattern:s[b],longerAlt:l[b],canLineTerminator:g[b],isCustom:f[b],short:h[b],group:a[b],push:c[b],pop:u[b],tokenTypeIdx:o[b],tokenType:i[b]}})});var m=!0,E=[];return e.safeMode||r("First Char Optimization",function(){E=(0,Ee.reduce)(i,function(B,b,R){if(typeof b.PATTERN=="string"){var H=b.PATTERN.charCodeAt(0),L=Wv(H);Jv(B,L,d[R])}else if((0,Ee.isArray)(b.START_CHARS_HINT)){var K;(0,Ee.forEach)(b.START_CHARS_HINT,function(ne){var q=typeof ne=="string"?ne.charCodeAt(0):ne,A=Wv(q);K!==A&&(K=A,Jv(B,A,d[R]))})}else if((0,Ee.isRegExp)(b.PATTERN))if(b.PATTERN.unicode)m=!1,e.ensureOptimizations&&(0,Ee.PRINT_ERROR)(""+Eu.failedOptimizationPrefixMsg+(" Unable to analyze < "+b.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var J=(0,Eu.getOptimizedStartCodesIndices)(b.PATTERN,e.ensureOptimizations);(0,Ee.isEmpty)(J)&&(m=!1),(0,Ee.forEach)(J,function(ne){Jv(B,ne,d[R])})}else e.ensureOptimizations&&(0,Ee.PRINT_ERROR)(""+Eu.failedOptimizationPrefixMsg+(" TokenType: <"+b.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),m=!1;return B},[])}),r("ArrayPacking",function(){E=(0,Ee.packArray)(E)}),{emptyGroups:p,patternIdxToConfig:d,charCodeToPatternIdxToConfig:E,hasCustom:n,canBeOptimized:m}}je.analyzeTokenTypes=qIe;function WIe(t,e){var r=[],i=rG(t);r=r.concat(i.errors);var n=iG(i.valid),s=n.valid;return r=r.concat(n.errors),r=r.concat(JIe(s)),r=r.concat(nG(s)),r=r.concat(sG(s,e)),r=r.concat(oG(s)),r}je.validatePatterns=WIe;function JIe(t){var e=[],r=(0,Ee.filter)(t,function(i){return(0,Ee.isRegExp)(i[ao])});return e=e.concat(aG(r)),e=e.concat(lG(r)),e=e.concat(cG(r)),e=e.concat(uG(r)),e=e.concat(AG(r)),e}function rG(t){var e=(0,Ee.filter)(t,function(n){return!(0,Ee.has)(n,ao)}),r=(0,Ee.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:zt.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ee.difference)(t,e);return{errors:r,valid:i}}je.findMissingPatterns=rG;function iG(t){var e=(0,Ee.filter)(t,function(n){var s=n[ao];return!(0,Ee.isRegExp)(s)&&!(0,Ee.isFunction)(s)&&!(0,Ee.has)(s,"exec")&&!(0,Ee.isString)(s)}),r=(0,Ee.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:zt.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ee.difference)(t,e);return{errors:r,valid:i}}je.findInvalidPatterns=iG;var zIe=/[^\\][\$]/;function aG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ee.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return zIe.test(s.source)}}),i=(0,Ee.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findEndOfInputAnchor=aG;function AG(t){var e=(0,Ee.filter)(t,function(i){var n=i[ao];return n.test("")}),r=(0,Ee.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:zt.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return r}je.findEmptyMatchRegExps=AG;var VIe=/[^\\[][\^]|^\^/;function lG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ee.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return VIe.test(s.source)}}),i=(0,Ee.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findStartOfInputAnchor=lG;function cG(t){var e=(0,Ee.filter)(t,function(i){var n=i[ao];return n instanceof RegExp&&(n.multiline||n.global)}),r=(0,Ee.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:zt.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return r}je.findUnsupportedFlags=cG;function uG(t){var e=[],r=(0,Ee.map)(t,function(s){return(0,Ee.reduce)(t,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ee.contains)(e,a)&&a.PATTERN!==zt.Lexer.NA&&(e.push(a),o.push(a)),o},[])});r=(0,Ee.compact)(r);var i=(0,Ee.filter)(r,function(s){return s.length>1}),n=(0,Ee.map)(i,function(s){var o=(0,Ee.map)(s,function(l){return l.name}),a=(0,Ee.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:zt.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}je.findDuplicatePatterns=uG;function nG(t){var e=(0,Ee.filter)(t,function(i){if(!(0,Ee.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==zt.Lexer.SKIPPED&&n!==zt.Lexer.NA&&!(0,Ee.isString)(n)}),r=(0,Ee.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:zt.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return r}je.findInvalidGroupType=nG;function sG(t,e){var r=(0,Ee.filter)(t,function(n){return n.PUSH_MODE!==void 0&&!(0,Ee.contains)(e,n.PUSH_MODE)}),i=(0,Ee.map)(r,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:zt.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}je.findModesThatDoNotExist=sG;function oG(t){var e=[],r=(0,Ee.reduce)(t,function(i,n,s){var o=n.PATTERN;return o===zt.Lexer.NA||((0,Ee.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ee.isRegExp)(o)&&XIe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ee.forEach)(t,function(i,n){(0,Ee.forEach)(r,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:zt.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}je.findUnreachablePatterns=oG;function _Ie(t,e){if((0,Ee.isRegExp)(e)){var r=e.exec(t);return r!==null&&r.index===0}else{if((0,Ee.isFunction)(e))return e(t,0,[],{});if((0,Ee.has)(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function XIe(t){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ee.find)(e,function(r){return t.source.indexOf(r)!==-1})===void 0}function jv(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:"+t.source+")",e)}je.addStartOfInput=jv;function Yv(t){var e=t.ignoreCase?"iy":"y";return new RegExp(""+t.source,e)}je.addStickyFlag=Yv;function ZIe(t,e,r){var i=[];return(0,Ee.has)(t,je.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.DEFAULT_MODE+`> property in its definition +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ee.has)(t,je.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.MODES+`> property in its definition +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ee.has)(t,je.MODES)&&(0,Ee.has)(t,je.DEFAULT_MODE)&&!(0,Ee.has)(t.modes,t.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+je.DEFAULT_MODE+": <"+t.defaultMode+`>which does not exist +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ee.has)(t,je.MODES)&&(0,Ee.forEach)(t.modes,function(n,s){(0,Ee.forEach)(n,function(o,a){(0,Ee.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:zt.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}je.performRuntimeChecks=ZIe;function $Ie(t,e,r){var i=[],n=!1,s=(0,Ee.compact)((0,Ee.flatten)((0,Ee.mapValues)(t.modes,function(l){return l}))),o=(0,Ee.reject)(s,function(l){return l[ao]===zt.Lexer.NA}),a=tG(r);return e&&(0,Ee.forEach)(o,function(l){var c=eG(l,a);if(c!==!1){var u=gG(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ee.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Eu.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:zt.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}je.performWarningRuntimeChecks=$Ie;function eEe(t){var e={},r=(0,Ee.keys)(t);return(0,Ee.forEach)(r,function(i){var n=t[i];if((0,Ee.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}je.cloneEmptyGroups=eEe;function qv(t){var e=t.PATTERN;if((0,Ee.isRegExp)(e))return!1;if((0,Ee.isFunction)(e))return!0;if((0,Ee.has)(e,"exec"))return!0;if((0,Ee.isString)(e))return!1;throw Error("non exhaustive match")}je.isCustomPattern=qv;function $H(t){return(0,Ee.isString)(t)&&t.length===1?t.charCodeAt(0):!1}je.isShortPattern=$H;je.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,r=this.lastIndex;r Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===zt.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+t.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}je.buildLineBreakIssueMessage=gG;function tG(t){var e=(0,Ee.map)(t,function(r){return(0,Ee.isString)(r)&&r.length>0?r.charCodeAt(0):r});return e}function Jv(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}je.minOptimizationVal=256;var pE=[];function Wv(t){return t255?255+~~(t/255):t}}});var yu=I(Bt=>{"use strict";Object.defineProperty(Bt,"__esModule",{value:!0});Bt.isTokenType=Bt.hasExtendingTokensTypesMapProperty=Bt.hasExtendingTokensTypesProperty=Bt.hasCategoriesProperty=Bt.hasShortKeyProperty=Bt.singleAssignCategoriesToksMap=Bt.assignCategoriesMapProp=Bt.assignCategoriesTokensProp=Bt.assignTokenDefaultProps=Bt.expandCategories=Bt.augmentTokenTypes=Bt.tokenIdxToClass=Bt.tokenShortNameIdx=Bt.tokenStructuredMatcherNoCategories=Bt.tokenStructuredMatcher=void 0;var Kr=Dt();function tEe(t,e){var r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}Bt.tokenStructuredMatcher=tEe;function rEe(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}Bt.tokenStructuredMatcherNoCategories=rEe;Bt.tokenShortNameIdx=1;Bt.tokenIdxToClass={};function iEe(t){var e=fG(t);hG(e),dG(e),pG(e),(0,Kr.forEach)(e,function(r){r.isParent=r.categoryMatches.length>0})}Bt.augmentTokenTypes=iEe;function fG(t){for(var e=(0,Kr.cloneArr)(t),r=t,i=!0;i;){r=(0,Kr.compact)((0,Kr.flatten)((0,Kr.map)(r,function(s){return s.CATEGORIES})));var n=(0,Kr.difference)(r,e);e=e.concat(n),(0,Kr.isEmpty)(n)?i=!1:r=n}return e}Bt.expandCategories=fG;function hG(t){(0,Kr.forEach)(t,function(e){CG(e)||(Bt.tokenIdxToClass[Bt.tokenShortNameIdx]=e,e.tokenTypeIdx=Bt.tokenShortNameIdx++),zv(e)&&!(0,Kr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),zv(e)||(e.CATEGORIES=[]),mG(e)||(e.categoryMatches=[]),IG(e)||(e.categoryMatchesMap={})})}Bt.assignTokenDefaultProps=hG;function pG(t){(0,Kr.forEach)(t,function(e){e.categoryMatches=[],(0,Kr.forEach)(e.categoryMatchesMap,function(r,i){e.categoryMatches.push(Bt.tokenIdxToClass[i].tokenTypeIdx)})})}Bt.assignCategoriesTokensProp=pG;function dG(t){(0,Kr.forEach)(t,function(e){Vv([],e)})}Bt.assignCategoriesMapProp=dG;function Vv(t,e){(0,Kr.forEach)(t,function(r){e.categoryMatchesMap[r.tokenTypeIdx]=!0}),(0,Kr.forEach)(e.CATEGORIES,function(r){var i=t.concat(e);(0,Kr.contains)(i,r)||Vv(i,r)})}Bt.singleAssignCategoriesToksMap=Vv;function CG(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.hasShortKeyProperty=CG;function zv(t){return(0,Kr.has)(t,"CATEGORIES")}Bt.hasCategoriesProperty=zv;function mG(t){return(0,Kr.has)(t,"categoryMatches")}Bt.hasExtendingTokensTypesProperty=mG;function IG(t){return(0,Kr.has)(t,"categoryMatchesMap")}Bt.hasExtendingTokensTypesMapProperty=IG;function nEe(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.isTokenType=nEe});var _v=I(dE=>{"use strict";Object.defineProperty(dE,"__esModule",{value:!0});dE.defaultLexerErrorProvider=void 0;dE.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->"+t.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(t,e,r,i,n){return"unexpected character: ->"+t.charAt(e)+"<- at offset: "+e+","+(" skipped "+r+" characters.")}}});var Gh=I(Rl=>{"use strict";Object.defineProperty(Rl,"__esModule",{value:!0});Rl.Lexer=Rl.LexerDefinitionErrorType=void 0;var Ps=Hv(),Vt=Dt(),sEe=yu(),oEe=_v(),aEe=gE(),AEe;(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(AEe=Rl.LexerDefinitionErrorType||(Rl.LexerDefinitionErrorType={}));var jh={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:oEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(jh);var lEe=function(){function t(e,r){var i=this;if(r===void 0&&(r=jh),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,Vt.merge)(jh,r);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===jh.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Ps.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===jh.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,Vt.isArray)(e)?(s={modes:{}},s.modes[Ps.DEFAULT_MODE]=(0,Vt.cloneArr)(e),s[Ps.DEFAULT_MODE]=Ps.DEFAULT_MODE):(o=!1,s=(0,Vt.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Ps.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,Vt.forEach)(s.modes,function(u,g){s.modes[g]=(0,Vt.reject)(u,function(f){return(0,Vt.isUndefined)(f)})});var a=(0,Vt.keys)(s.modes);if((0,Vt.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.validatePatterns)(u,a))}),(0,Vt.isEmpty)(i.lexerDefinitionErrors)){(0,sEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Ps.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,Vt.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,Vt.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,Vt.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,Vt.forEach)(i.lexerDefinitionWarning,function(u){(0,Vt.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Ps.SUPPORT_STICKY?(i.chopInput=Vt.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=Vt.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=Vt.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=Vt.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=Vt.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,Vt.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(r.ensureOptimizations&&!(0,Vt.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,aEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,Vt.toFastProperties)(i)})})}return t.prototype.tokenize=function(e,r){if(r===void 0&&(r=this.defaultMode),!(0,Vt.isEmpty)(this.lexerDefinitionErrors)){var i=(0,Vt.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,r);return s},t.prototype.tokenizeInternal=function(e,r){var i=this,n,s,o,a,l,c,u,g,f,h,p,d,m,E,B,b,R=e,H=R.length,L=0,K=0,J=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(J),q=[],A=this.trackStartLines?1:void 0,V=this.trackStartLines?1:void 0,W=(0,Ps.cloneEmptyGroups)(this.emptyGroups),X=this.trackStartLines,F=this.config.lineTerminatorsPattern,D=0,he=[],pe=[],Ne=[],Pe=[];Object.freeze(Pe);var qe=void 0;function re(){return he}function se(wr){var Ui=(0,Ps.charCodeToOptimizedIndex)(wr),ws=pe[Ui];return ws===void 0?Pe:ws}var be=function(wr){if(Ne.length===1&&wr.tokenType.PUSH_MODE===void 0){var Ui=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(wr);q.push({offset:wr.startOffset,line:wr.startLine!==void 0?wr.startLine:void 0,column:wr.startColumn!==void 0?wr.startColumn:void 0,length:wr.image.length,message:Ui})}else{Ne.pop();var ws=(0,Vt.last)(Ne);he=i.patternIdxToConfig[ws],pe=i.charCodeToPatternIdxToConfig[ws],D=he.length;var Tf=i.canModeBeOptimized[ws]&&i.config.safeMode===!1;pe&&Tf?qe=se:qe=re}};function ae(wr){Ne.push(wr),pe=this.charCodeToPatternIdxToConfig[wr],he=this.patternIdxToConfig[wr],D=he.length,D=he.length;var Ui=this.canModeBeOptimized[wr]&&this.config.safeMode===!1;pe&&Ui?qe=se:qe=re}ae.call(this,r);for(var Ae;Lc.length){c=a,u=g,Ae=Oe;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,d=this.createTokenInstance(c,L,p,Ae.tokenType,A,V,f),this.handlePayload(d,u),h===!1?K=this.addToken(ne,K,d):W[h].push(d)),e=this.chopInput(e,f),L=L+f,V=this.computeNewColumn(V,f),X===!0&&Ae.canLineTerminator===!0){var dt=0,ri=void 0,ii=void 0;F.lastIndex=0;do ri=F.test(c),ri===!0&&(ii=F.lastIndex-1,dt++);while(ri===!0);dt!==0&&(A=A+dt,V=f-ii,this.updateTokenEndLineColumnLocation(d,h,ii,dt,A,V,f))}this.handleModes(Ae,be,ae,d)}else{for(var an=L,yr=A,Ki=V,Qi=!1;!Qi&&L <"+e+">");var n=(0,Vt.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",t.NA=/NOT_APPLICABLE/,t}();Rl.Lexer=lEe});var nA=I(Ci=>{"use strict";Object.defineProperty(Ci,"__esModule",{value:!0});Ci.tokenMatcher=Ci.createTokenInstance=Ci.EOF=Ci.createToken=Ci.hasTokenLabel=Ci.tokenName=Ci.tokenLabel=void 0;var Ds=Dt(),cEe=Gh(),Xv=yu();function uEe(t){return EG(t)?t.LABEL:t.name}Ci.tokenLabel=uEe;function gEe(t){return t.name}Ci.tokenName=gEe;function EG(t){return(0,Ds.isString)(t.LABEL)&&t.LABEL!==""}Ci.hasTokenLabel=EG;var fEe="parent",yG="categories",wG="label",BG="group",QG="push_mode",bG="pop_mode",vG="longer_alt",SG="line_breaks",xG="start_chars_hint";function kG(t){return hEe(t)}Ci.createToken=kG;function hEe(t){var e=t.pattern,r={};if(r.name=t.name,(0,Ds.isUndefined)(e)||(r.PATTERN=e),(0,Ds.has)(t,fEe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ds.has)(t,yG)&&(r.CATEGORIES=t[yG]),(0,Xv.augmentTokenTypes)([r]),(0,Ds.has)(t,wG)&&(r.LABEL=t[wG]),(0,Ds.has)(t,BG)&&(r.GROUP=t[BG]),(0,Ds.has)(t,bG)&&(r.POP_MODE=t[bG]),(0,Ds.has)(t,QG)&&(r.PUSH_MODE=t[QG]),(0,Ds.has)(t,vG)&&(r.LONGER_ALT=t[vG]),(0,Ds.has)(t,SG)&&(r.LINE_BREAKS=t[SG]),(0,Ds.has)(t,xG)&&(r.START_CHARS_HINT=t[xG]),r}Ci.EOF=kG({name:"EOF",pattern:cEe.Lexer.NA});(0,Xv.augmentTokenTypes)([Ci.EOF]);function pEe(t,e,r,i,n,s,o,a){return{image:e,startOffset:r,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}}Ci.createTokenInstance=pEe;function dEe(t,e){return(0,Xv.tokenStructuredMatcher)(t,e)}Ci.tokenMatcher=dEe});var hn=I(Tt=>{"use strict";var oa=Tt&&Tt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.serializeProduction=Tt.serializeGrammar=Tt.Terminal=Tt.Alternation=Tt.RepetitionWithSeparator=Tt.Repetition=Tt.RepetitionMandatoryWithSeparator=Tt.RepetitionMandatory=Tt.Option=Tt.Alternative=Tt.Rule=Tt.NonTerminal=Tt.AbstractProduction=void 0;var $t=Dt(),CEe=nA(),Ao=function(){function t(e){this._definition=e}return Object.defineProperty(t.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),t.prototype.accept=function(e){e.visit(this),(0,$t.forEach)(this.definition,function(r){r.accept(e)})},t}();Tt.AbstractProduction=Ao;var PG=function(t){oa(e,t);function e(r){var i=t.call(this,[])||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(r){},enumerable:!1,configurable:!0}),e.prototype.accept=function(r){r.visit(this)},e}(Ao);Tt.NonTerminal=PG;var DG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.orgText="",(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Rule=DG;var RG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.ignoreAmbiguities=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Alternative=RG;var FG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Option=FG;var NG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatory=NG;var LG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatoryWithSeparator=LG;var TG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Repetition=TG;var MG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionWithSeparator=MG;var OG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(r){this._definition=r},enumerable:!1,configurable:!0}),e}(Ao);Tt.Alternation=OG;var CE=function(){function t(e){this.idx=1,(0,$t.assign)(this,(0,$t.pick)(e,function(r){return r!==void 0}))}return t.prototype.accept=function(e){e.visit(this)},t}();Tt.Terminal=CE;function mEe(t){return(0,$t.map)(t,Yh)}Tt.serializeGrammar=mEe;function Yh(t){function e(s){return(0,$t.map)(s,Yh)}if(t instanceof PG){var r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return(0,$t.isString)(t.label)&&(r.label=t.label),r}else{if(t instanceof RG)return{type:"Alternative",definition:e(t.definition)};if(t instanceof FG)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof NG)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof LG)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Yh(new CE({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof MG)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Yh(new CE({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof TG)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof OG)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof CE){var i={type:"Terminal",name:t.terminalType.name,label:(0,CEe.tokenLabel)(t.terminalType),idx:t.idx};(0,$t.isString)(t.label)&&(i.terminalLabel=t.label);var n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(i.pattern=(0,$t.isRegExp)(n)?n.source:n),i}else{if(t instanceof DG)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}Tt.serializeProduction=Yh});var IE=I(mE=>{"use strict";Object.defineProperty(mE,"__esModule",{value:!0});mE.RestWalker=void 0;var Zv=Dt(),pn=hn(),IEe=function(){function t(){}return t.prototype.walk=function(e,r){var i=this;r===void 0&&(r=[]),(0,Zv.forEach)(e.definition,function(n,s){var o=(0,Zv.drop)(e.definition,s+1);if(n instanceof pn.NonTerminal)i.walkProdRef(n,o,r);else if(n instanceof pn.Terminal)i.walkTerminal(n,o,r);else if(n instanceof pn.Alternative)i.walkFlat(n,o,r);else if(n instanceof pn.Option)i.walkOption(n,o,r);else if(n instanceof pn.RepetitionMandatory)i.walkAtLeastOne(n,o,r);else if(n instanceof pn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,r);else if(n instanceof pn.RepetitionWithSeparator)i.walkManySep(n,o,r);else if(n instanceof pn.Repetition)i.walkMany(n,o,r);else if(n instanceof pn.Alternation)i.walkOr(n,o,r);else throw Error("non exhaustive match")})},t.prototype.walkTerminal=function(e,r,i){},t.prototype.walkProdRef=function(e,r,i){},t.prototype.walkFlat=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkOption=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkAtLeastOne=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkAtLeastOneSep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkMany=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkManySep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkOr=function(e,r,i){var n=this,s=r.concat(i);(0,Zv.forEach)(e.definition,function(o){var a=new pn.Alternative({definition:[o]});n.walk(a,s)})},t}();mE.RestWalker=IEe;function KG(t,e,r){var i=[new pn.Option({definition:[new pn.Terminal({terminalType:t.separator})].concat(t.definition)})],n=i.concat(e,r);return n}});var wu=I(EE=>{"use strict";Object.defineProperty(EE,"__esModule",{value:!0});EE.GAstVisitor=void 0;var lo=hn(),EEe=function(){function t(){}return t.prototype.visit=function(e){var r=e;switch(r.constructor){case lo.NonTerminal:return this.visitNonTerminal(r);case lo.Alternative:return this.visitAlternative(r);case lo.Option:return this.visitOption(r);case lo.RepetitionMandatory:return this.visitRepetitionMandatory(r);case lo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(r);case lo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(r);case lo.Repetition:return this.visitRepetition(r);case lo.Alternation:return this.visitAlternation(r);case lo.Terminal:return this.visitTerminal(r);case lo.Rule:return this.visitRule(r);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(e){},t.prototype.visitAlternative=function(e){},t.prototype.visitOption=function(e){},t.prototype.visitRepetition=function(e){},t.prototype.visitRepetitionMandatory=function(e){},t.prototype.visitRepetitionMandatoryWithSeparator=function(e){},t.prototype.visitRepetitionWithSeparator=function(e){},t.prototype.visitAlternation=function(e){},t.prototype.visitTerminal=function(e){},t.prototype.visitRule=function(e){},t}();EE.GAstVisitor=EEe});var Jh=I(Si=>{"use strict";var yEe=Si&&Si.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Si,"__esModule",{value:!0});Si.collectMethods=Si.DslMethodsCollectorVisitor=Si.getProductionDslName=Si.isBranchingProd=Si.isOptionalProd=Si.isSequenceProd=void 0;var qh=Dt(),dr=hn(),wEe=wu();function BEe(t){return t instanceof dr.Alternative||t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionMandatory||t instanceof dr.RepetitionMandatoryWithSeparator||t instanceof dr.RepetitionWithSeparator||t instanceof dr.Terminal||t instanceof dr.Rule}Si.isSequenceProd=BEe;function $v(t,e){e===void 0&&(e=[]);var r=t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionWithSeparator;return r?!0:t instanceof dr.Alternation?(0,qh.some)(t.definition,function(i){return $v(i,e)}):t instanceof dr.NonTerminal&&(0,qh.contains)(e,t)?!1:t instanceof dr.AbstractProduction?(t instanceof dr.NonTerminal&&e.push(t),(0,qh.every)(t.definition,function(i){return $v(i,e)})):!1}Si.isOptionalProd=$v;function QEe(t){return t instanceof dr.Alternation}Si.isBranchingProd=QEe;function bEe(t){if(t instanceof dr.NonTerminal)return"SUBRULE";if(t instanceof dr.Option)return"OPTION";if(t instanceof dr.Alternation)return"OR";if(t instanceof dr.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof dr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof dr.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof dr.Repetition)return"MANY";if(t instanceof dr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Si.getProductionDslName=bEe;var UG=function(t){yEe(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.separator="-",r.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},r}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(r){var i=r.terminalType.name+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitNonTerminal=function(r){var i=r.nonTerminalName+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitOption=function(r){this.dslMethods.option.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.dslMethods.repetitionWithSeparator.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.dslMethods.repetitionMandatory.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.dslMethods.repetitionMandatoryWithSeparator.push(r)},e.prototype.visitRepetition=function(r){this.dslMethods.repetition.push(r)},e.prototype.visitAlternation=function(r){this.dslMethods.alternation.push(r)},e}(wEe.GAstVisitor);Si.DslMethodsCollectorVisitor=UG;var yE=new UG;function vEe(t){yE.reset(),t.accept(yE);var e=yE.dslMethods;return yE.reset(),e}Si.collectMethods=vEe});var tS=I(co=>{"use strict";Object.defineProperty(co,"__esModule",{value:!0});co.firstForTerminal=co.firstForBranching=co.firstForSequence=co.first=void 0;var wE=Dt(),HG=hn(),eS=Jh();function BE(t){if(t instanceof HG.NonTerminal)return BE(t.referencedRule);if(t instanceof HG.Terminal)return YG(t);if((0,eS.isSequenceProd)(t))return GG(t);if((0,eS.isBranchingProd)(t))return jG(t);throw Error("non exhaustive match")}co.first=BE;function GG(t){for(var e=[],r=t.definition,i=0,n=r.length>i,s,o=!0;n&&o;)s=r[i],o=(0,eS.isOptionalProd)(s),e=e.concat(BE(s)),i=i+1,n=r.length>i;return(0,wE.uniq)(e)}co.firstForSequence=GG;function jG(t){var e=(0,wE.map)(t.definition,function(r){return BE(r)});return(0,wE.uniq)((0,wE.flatten)(e))}co.firstForBranching=jG;function YG(t){return[t.terminalType]}co.firstForTerminal=YG});var rS=I(QE=>{"use strict";Object.defineProperty(QE,"__esModule",{value:!0});QE.IN=void 0;QE.IN="_~IN~_"});var VG=I(es=>{"use strict";var SEe=es&&es.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(es,"__esModule",{value:!0});es.buildInProdFollowPrefix=es.buildBetweenProdsFollowPrefix=es.computeAllProdsFollows=es.ResyncFollowsWalker=void 0;var xEe=IE(),kEe=tS(),qG=Dt(),JG=rS(),PEe=hn(),zG=function(t){SEe(e,t);function e(r){var i=t.call(this)||this;return i.topProd=r,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(r,i,n){},e.prototype.walkProdRef=function(r,i,n){var s=WG(r.referencedRule,r.idx)+this.topProd.name,o=i.concat(n),a=new PEe.Alternative({definition:o}),l=(0,kEe.first)(a);this.follows[s]=l},e}(xEe.RestWalker);es.ResyncFollowsWalker=zG;function DEe(t){var e={};return(0,qG.forEach)(t,function(r){var i=new zG(r).startWalking();(0,qG.assign)(e,i)}),e}es.computeAllProdsFollows=DEe;function WG(t,e){return t.name+e+JG.IN}es.buildBetweenProdsFollowPrefix=WG;function REe(t){var e=t.terminalType.name;return e+t.idx+JG.IN}es.buildInProdFollowPrefix=REe});var Wh=I(aa=>{"use strict";Object.defineProperty(aa,"__esModule",{value:!0});aa.defaultGrammarValidatorErrorProvider=aa.defaultGrammarResolverErrorProvider=aa.defaultParserErrorProvider=void 0;var Bu=nA(),FEe=Dt(),Rs=Dt(),iS=hn(),_G=Jh();aa.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,r=t.actual,i=t.previous,n=t.ruleName,s=(0,Bu.hasTokenLabel)(e),o=s?"--> "+(0,Bu.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+r.image+"' <--";return a},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant,r=t.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,r=t.actual,i=t.previous,n=t.customUserDescription,s=t.ruleName,o="Expecting: ",a=(0,Rs.first)(r).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,Rs.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Rs.map)(c,function(h){return"["+(0,Rs.map)(h,function(p){return(0,Bu.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Rs.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: +`+g.join(` +`);return o+f+l},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,r=t.actual,i=t.customUserDescription,n=t.ruleName,s="Expecting: ",o=(0,Rs.first)(r).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,Rs.map)(e,function(u){return"["+(0,Rs.map)(u,function(g){return(0,Bu.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(aa.defaultParserErrorProvider);aa.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){var r="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-";return r}};aa.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){function r(u){return u instanceof iS.Terminal?u.terminalType.name:u instanceof iS.NonTerminal?u.nonTerminalName:""}var i=t.name,n=(0,Rs.first)(e),s=n.idx,o=(0,_G.getProductionDslName)(n),a=r(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(t){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+t.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous alternatives: <"+t.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+t.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous Alternatives Detected: <"+t.ambiguityIndices.join(" ,")+"> in "+(" inside <"+t.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(t){var e=(0,_G.getProductionDslName)(t.repetition);t.repetition.idx!==0&&(e+=t.repetition.idx);var r="The repetition <"+e+"> within Rule <"+t.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return r},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){var e="Ambiguous empty alternative: <"+(t.emptyChoiceIdx+1)+">"+(" in inside <"+t.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(t){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+t.topLevelRule.name+`> Rule. + has `+(t.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,r=FEe.map(t.leftRecursionPath,function(s){return s.name}),i=e+" --> "+r.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;t.topLevelRule instanceof iS.Rule?e=t.topLevelRule.name:e=t.topLevelRule;var r="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+t.grammarName+"<-";return r}}});var $G=I(sA=>{"use strict";var NEe=sA&&sA.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(sA,"__esModule",{value:!0});sA.GastRefResolverVisitor=sA.resolveGrammar=void 0;var LEe=Tn(),XG=Dt(),TEe=wu();function MEe(t,e){var r=new ZG(t,e);return r.resolveRefs(),r.errors}sA.resolveGrammar=MEe;var ZG=function(t){NEe(e,t);function e(r,i){var n=t.call(this)||this;return n.nameToTopRule=r,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var r=this;(0,XG.forEach)((0,XG.values)(this.nameToTopRule),function(i){r.currTopLevel=i,i.accept(r)})},e.prototype.visitNonTerminal=function(r){var i=this.nameToTopRule[r.nonTerminalName];if(i)r.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,r);this.errors.push({message:n,type:LEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:r.nonTerminalName})}},e}(TEe.GAstVisitor);sA.GastRefResolverVisitor=ZG});var Vh=I(Br=>{"use strict";var Fl=Br&&Br.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Br,"__esModule",{value:!0});Br.nextPossibleTokensAfter=Br.possiblePathsFrom=Br.NextTerminalAfterAtLeastOneSepWalker=Br.NextTerminalAfterAtLeastOneWalker=Br.NextTerminalAfterManySepWalker=Br.NextTerminalAfterManyWalker=Br.AbstractNextTerminalAfterProductionWalker=Br.NextAfterTokenWalker=Br.AbstractNextPossibleTokensWalker=void 0;var ej=IE(),xt=Dt(),OEe=tS(),Et=hn(),tj=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topProd=r,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,xt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,xt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(r,i){i===void 0&&(i=[]),this.found||t.prototype.walk.call(this,r,i)},e.prototype.walkProdRef=function(r,i,n){if(r.referencedRule.name===this.nextProductionName&&r.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(r.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,xt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(ej.RestWalker);Br.AbstractNextPossibleTokensWalker=tj;var KEe=function(t){Fl(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(r,i,n){if(this.isAtEndOfPath&&r.terminalType.name===this.nextTerminalName&&r.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Et.Alternative({definition:s});this.possibleTokTypes=(0,OEe.first)(o),this.found=!0}},e}(tj);Br.NextAfterTokenWalker=KEe;var zh=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topRule=r,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(ej.RestWalker);Br.AbstractNextTerminalAfterProductionWalker=zh;var UEe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkMany=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Et.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkMany.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManyWalker=UEe;var HEe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkManySep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Et.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkManySep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManySepWalker=HEe;var GEe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Et.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOne.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneWalker=GEe;var jEe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Et.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOneSep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneSepWalker=jEe;function rj(t,e,r){r===void 0&&(r=[]),r=(0,xt.cloneArr)(r);var i=[],n=0;function s(c){return c.concat((0,xt.drop)(t,n+1))}function o(c){var u=rj(s(c),e,r);return i.concat(u)}for(;r.length=0;W--){var X=E.definition[W],F={idx:p,def:X.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m};g.push(F),g.push(o)}else if(E instanceof Et.Alternative)g.push({idx:p,def:E.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m});else if(E instanceof Et.Rule)g.push(YEe(E,p,d,m));else throw Error("non exhaustive match")}}return u}Br.nextPossibleTokensAfter=qEe;function YEe(t,e,r,i){var n=(0,xt.cloneArr)(r);n.push(t.name);var s=(0,xt.cloneArr)(i);return s.push(1),{idx:e,def:t.definition,ruleStack:n,occurrenceStack:s}}});var _h=I(Gt=>{"use strict";var ij=Gt&&Gt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Gt,"__esModule",{value:!0});Gt.areTokenCategoriesNotUsed=Gt.isStrictPrefixOfPath=Gt.containsPath=Gt.getLookaheadPathsForOptionalProd=Gt.getLookaheadPathsForOr=Gt.lookAheadSequenceFromAlternatives=Gt.buildSingleAlternativeLookaheadFunction=Gt.buildAlternativesLookAheadFunc=Gt.buildLookaheadFuncForOptionalProd=Gt.buildLookaheadFuncForOr=Gt.getProdType=Gt.PROD_TYPE=void 0;var _t=Dt(),nj=Vh(),JEe=IE(),bE=yu(),oA=hn(),WEe=wu(),zr;(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(zr=Gt.PROD_TYPE||(Gt.PROD_TYPE={}));function zEe(t){if(t instanceof oA.Option)return zr.OPTION;if(t instanceof oA.Repetition)return zr.REPETITION;if(t instanceof oA.RepetitionMandatory)return zr.REPETITION_MANDATORY;if(t instanceof oA.RepetitionMandatoryWithSeparator)return zr.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof oA.RepetitionWithSeparator)return zr.REPETITION_WITH_SEPARATOR;if(t instanceof oA.Alternation)return zr.ALTERNATION;throw Error("non exhaustive match")}Gt.getProdType=zEe;function VEe(t,e,r,i,n,s){var o=sj(t,e,r),a=nS(o)?bE.tokenStructuredMatcherNoCategories:bE.tokenStructuredMatcher;return s(o,i,a,n)}Gt.buildLookaheadFuncForOr=VEe;function _Ee(t,e,r,i,n,s){var o=oj(t,e,n,r),a=nS(o)?bE.tokenStructuredMatcherNoCategories:bE.tokenStructuredMatcher;return s(o[0],a,i)}Gt.buildLookaheadFuncForOptionalProd=_Ee;function XEe(t,e,r,i){var n=t.length,s=(0,_t.every)(t,function(l){return(0,_t.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,_t.map)(l,function(b){return b.GATE}),u=0;u{"use strict";var aS=Mt&&Mt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Mt,"__esModule",{value:!0});Mt.checkPrefixAlternativesAmbiguities=Mt.validateSomeNonEmptyLookaheadPath=Mt.validateTooManyAlts=Mt.RepetionCollector=Mt.validateAmbiguousAlternationAlternatives=Mt.validateEmptyOrAlternative=Mt.getFirstNoneTerminal=Mt.validateNoLeftRecursion=Mt.validateRuleIsOverridden=Mt.validateRuleDoesNotAlreadyExist=Mt.OccurrenceValidationCollector=Mt.identifyProductionForDuplicates=Mt.validateGrammar=void 0;var jt=Dt(),Cr=Dt(),uo=Tn(),AS=Jh(),Qu=_h(),rye=Vh(),Fs=hn(),lS=wu();function sye(t,e,r,i,n){var s=jt.map(t,function(h){return iye(h,i)}),o=jt.map(t,function(h){return cS(h,h,i)}),a=[],l=[],c=[];(0,Cr.every)(o,Cr.isEmpty)&&(a=(0,Cr.map)(t,function(h){return uj(h,i)}),l=(0,Cr.map)(t,function(h){return gj(h,e,i)}),c=hj(t,e,i));var u=nye(t,r,i),g=(0,Cr.map)(t,function(h){return fj(h,i)}),f=(0,Cr.map)(t,function(h){return cj(h,t,n,i)});return jt.flatten(s.concat(c,o,a,l,u,g,f))}Mt.validateGrammar=sye;function iye(t,e){var r=new Cj;t.accept(r);var i=r.allProductions,n=jt.groupBy(i,pj),s=jt.pick(n,function(a){return a.length>1}),o=jt.map(jt.values(s),function(a){var l=jt.first(a),c=e.buildDuplicateFoundError(t,a),u=(0,AS.getProductionDslName)(l),g={message:c,type:uo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:l.idx},f=dj(l);return f&&(g.parameter=f),g});return o}function pj(t){return(0,AS.getProductionDslName)(t)+"_#_"+t.idx+"_#_"+dj(t)}Mt.identifyProductionForDuplicates=pj;function dj(t){return t instanceof Fs.Terminal?t.terminalType.name:t instanceof Fs.NonTerminal?t.nonTerminalName:""}var Cj=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitNonTerminal=function(r){this.allProductions.push(r)},e.prototype.visitOption=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e.prototype.visitAlternation=function(r){this.allProductions.push(r)},e.prototype.visitTerminal=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.OccurrenceValidationCollector=Cj;function cj(t,e,r,i){var n=[],s=(0,Cr.reduce)(e,function(a,l){return l.name===t.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});n.push({message:o,type:uo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return n}Mt.validateRuleDoesNotAlreadyExist=cj;function oye(t,e,r){var i=[],n;return jt.contains(e,t)||(n="Invalid rule override, rule: ->"+t+"<- cannot be overridden in the grammar: ->"+r+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:uo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),i}Mt.validateRuleIsOverridden=oye;function cS(t,e,r,i){i===void 0&&(i=[]);var n=[],s=Xh(e.definition);if(jt.isEmpty(s))return[];var o=t.name,a=jt.contains(s,t);a&&n.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:i}),type:uo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=jt.difference(s,i.concat([t])),c=jt.map(l,function(u){var g=jt.cloneArr(i);return g.push(u),cS(t,u,r,g)});return n.concat(jt.flatten(c))}Mt.validateNoLeftRecursion=cS;function Xh(t){var e=[];if(jt.isEmpty(t))return e;var r=jt.first(t);if(r instanceof Fs.NonTerminal)e.push(r.referencedRule);else if(r instanceof Fs.Alternative||r instanceof Fs.Option||r instanceof Fs.RepetitionMandatory||r instanceof Fs.RepetitionMandatoryWithSeparator||r instanceof Fs.RepetitionWithSeparator||r instanceof Fs.Repetition)e=e.concat(Xh(r.definition));else if(r instanceof Fs.Alternation)e=jt.flatten(jt.map(r.definition,function(o){return Xh(o.definition)}));else if(!(r instanceof Fs.Terminal))throw Error("non exhaustive match");var i=(0,AS.isOptionalProd)(r),n=t.length>1;if(i&&n){var s=jt.drop(t);return e.concat(Xh(s))}else return e}Mt.getFirstNoneTerminal=Xh;var uS=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.alternations=[],r}return e.prototype.visitAlternation=function(r){this.alternations.push(r)},e}(lS.GAstVisitor);function uj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){var a=jt.dropRight(o.definition),l=jt.map(a,function(c,u){var g=(0,rye.nextPossibleTokensAfter)([c],[],null,1);return jt.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:o,emptyChoiceIdx:u}),type:uo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(jt.compact(l))},[]);return n}Mt.validateEmptyOrAlternative=uj;function gj(t,e,r){var i=new uS;t.accept(i);var n=i.alternations;n=(0,Cr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=jt.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,Qu.getLookaheadPathsForOr)(l,t,c,a),g=aye(u,a,t,r),f=mj(u,a,t,r);return o.concat(g,f)},[]);return s}Mt.validateAmbiguousAlternationAlternatives=gj;var Ij=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.RepetionCollector=Ij;function fj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:o}),type:uo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:o.idx}),s},[]);return n}Mt.validateTooManyAlts=fj;function hj(t,e,r){var i=[];return(0,Cr.forEach)(t,function(n){var s=new Ij;n.accept(s);var o=s.allProductions;(0,Cr.forEach)(o,function(a){var l=(0,Qu.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,Qu.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Cr.isEmpty)((0,Cr.flatten)(f))){var h=r.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:uo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Mt.validateSomeNonEmptyLookaheadPath=hj;function aye(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Cr.forEach)(l,function(u){var g=[c];(0,Cr.forEach)(t,function(f,h){c!==h&&(0,Qu.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,Qu.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=jt.map(s,function(a){var l=(0,Cr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:uo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function mj(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(o,a,l){var c=(0,Cr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Cr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Cr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(bu,"__esModule",{value:!0});bu.validateGrammar=bu.resolveGrammar=void 0;var fS=Dt(),Aye=$G(),lye=gS(),Ej=Wh();function cye(t){t=(0,fS.defaults)(t,{errMsgProvider:Ej.defaultGrammarResolverErrorProvider});var e={};return(0,fS.forEach)(t.rules,function(r){e[r.name]=r}),(0,Aye.resolveGrammar)(e,t.errMsgProvider)}bu.resolveGrammar=cye;function uye(t){return t=(0,fS.defaults)(t,{errMsgProvider:Ej.defaultGrammarValidatorErrorProvider}),(0,lye.validateGrammar)(t.rules,t.maxLookahead,t.tokenTypes,t.errMsgProvider,t.grammarName)}bu.validateGrammar=uye});var vu=I(dn=>{"use strict";var Zh=dn&&dn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(dn,"__esModule",{value:!0});dn.EarlyExitException=dn.NotAllInputParsedException=dn.NoViableAltException=dn.MismatchedTokenException=dn.isRecognitionException=void 0;var gye=Dt(),wj="MismatchedTokenException",Bj="NoViableAltException",Qj="EarlyExitException",bj="NotAllInputParsedException",vj=[wj,Bj,Qj,bj];Object.freeze(vj);function fye(t){return(0,gye.contains)(vj,t.name)}dn.isRecognitionException=fye;var vE=function(t){Zh(e,t);function e(r,i){var n=this.constructor,s=t.call(this,r)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),hye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=wj,s}return e}(vE);dn.MismatchedTokenException=hye;var pye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Bj,s}return e}(vE);dn.NoViableAltException=pye;var dye=function(t){Zh(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.name=bj,n}return e}(vE);dn.NotAllInputParsedException=dye;var Cye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Qj,s}return e}(vE);dn.EarlyExitException=Cye});var pS=I(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.attemptInRepetitionRecovery=xi.Recoverable=xi.InRuleRecoveryException=xi.IN_RULE_RECOVERY_EXCEPTION=xi.EOF_FOLLOW_KEY=void 0;var SE=nA(),ts=Dt(),mye=vu(),Iye=rS(),Eye=Tn();xi.EOF_FOLLOW_KEY={};xi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function hS(t){this.name=xi.IN_RULE_RECOVERY_EXCEPTION,this.message=t}xi.InRuleRecoveryException=hS;hS.prototype=Error.prototype;var yye=function(){function t(){}return t.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,ts.has)(e,"recoveryEnabled")?e.recoveryEnabled:Eye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Sj)},t.prototype.getTokenToInsert=function(e){var r=(0,SE.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r},t.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},t.prototype.tryInRepetitionRecovery=function(e,r,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),d=new mye.MismatchedTokenException(p,u,s.LA(0));d.resyncedTokens=(0,ts.dropRight)(l),s.SAVE_ERROR(d)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,r);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},t.prototype.shouldInRepetitionRecoveryBeTried=function(e,r,i){return!(i===!1||e===void 0||r===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))},t.prototype.getFollowsForInRuleRecovery=function(e,r){var i=this.getCurrentGrammarPath(e,r),n=this.getNextPossibleTokenTypes(i);return n},t.prototype.tryInRuleRecovery=function(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new hS("sad sad panda")},t.prototype.canPerformInRuleRecovery=function(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)},t.prototype.canRecoverWithSingleTokenInsertion=function(e,r){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,ts.isEmpty)(r))return!1;var n=this.LA(1),s=(0,ts.find)(r,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},t.prototype.canRecoverWithSingleTokenDeletion=function(e){var r=this.tokenMatcher(this.LA(2),e);return r},t.prototype.isInCurrentRuleReSyncSet=function(e){var r=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(r);return(0,ts.contains)(i,e)},t.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),r=this.LA(1),i=2;;){var n=r.tokenType;if((0,ts.contains)(e,n))return n;r=this.LA(i),i++}},t.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return xi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(i)}},t.prototype.buildFullFollowKeyStack=function(){var e=this,r=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,ts.map)(r,function(n,s){return s===0?xi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(r[s-1])}})},t.prototype.flattenFollowSet=function(){var e=this,r=(0,ts.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,ts.flatten)(r)},t.prototype.getFollowSetFromFollowKey=function(e){if(e===xi.EOF_FOLLOW_KEY)return[SE.EOF];var r=e.ruleName+e.idxInCallingRule+Iye.IN+e.inRule;return this.resyncFollows[r]},t.prototype.addToResyncTokens=function(e,r){return this.tokenMatcher(e,SE.EOF)||r.push(e),r},t.prototype.reSyncTo=function(e){for(var r=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,r);return(0,ts.dropRight)(r)},t.prototype.attemptInRepetitionRecovery=function(e,r,i,n,s,o,a){},t.prototype.getCurrentGrammarPath=function(e,r){var i=this.getHumanReadableRuleStack(),n=(0,ts.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:r};return s},t.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,ts.map)(this.RULE_STACK,function(r){return e.shortRuleNameToFullName(r)})},t}();xi.Recoverable=yye;function Sj(t,e,r,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=SE.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(t,e,r,f)}xi.attemptInRepetitionRecovery=Sj});var xE=I(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.getKeyForAutomaticLookahead=Nt.AT_LEAST_ONE_SEP_IDX=Nt.MANY_SEP_IDX=Nt.AT_LEAST_ONE_IDX=Nt.MANY_IDX=Nt.OPTION_IDX=Nt.OR_IDX=Nt.BITS_FOR_ALT_IDX=Nt.BITS_FOR_RULE_IDX=Nt.BITS_FOR_OCCURRENCE_IDX=Nt.BITS_FOR_METHOD_TYPE=void 0;Nt.BITS_FOR_METHOD_TYPE=4;Nt.BITS_FOR_OCCURRENCE_IDX=8;Nt.BITS_FOR_RULE_IDX=12;Nt.BITS_FOR_ALT_IDX=8;Nt.OR_IDX=1<{"use strict";Object.defineProperty(kE,"__esModule",{value:!0});kE.LooksAhead=void 0;var Aa=_h(),Ns=Dt(),xj=Tn(),la=xE(),Nl=Jh(),Bye=function(){function t(){}return t.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,Ns.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:xj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,Ns.has)(e,"maxLookahead")?e.maxLookahead:xj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,Ns.isES2015MapSupported)()?new Map:[],(0,Ns.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(e){var r=this;(0,Ns.forEach)(e,function(i){r.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Nl.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,Ns.forEach)(s,function(g){var f=g.idx===0?"":g.idx;r.TRACE_INIT(""+(0,Nl.getProductionDslName)(g)+f,function(){var h=(0,Aa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||r.maxLookahead,g.hasPredicates,r.dynamicTokensEnabled,r.lookAheadBuilderForAlternatives),p=(0,la.getKeyForAutomaticLookahead)(r.fullRuleNameToShort[i.name],la.OR_IDX,g.idx);r.setLaFuncCache(p,h)})}),(0,Ns.forEach)(o,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_IDX,Aa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(a,function(g){r.computeLookaheadFunc(i,g.idx,la.OPTION_IDX,Aa.PROD_TYPE.OPTION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(l,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(c,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_SEP_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(u,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_SEP_IDX,Aa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))})})})},t.prototype.computeLookaheadFunc=function(e,r,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(r===0?"":r),function(){var l=(0,Aa.buildLookaheadFuncForOptionalProd)(r,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,la.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,r);a.setLaFuncCache(c,l)})},t.prototype.lookAheadBuilderForOptional=function(e,r,i){return(0,Aa.buildSingleAlternativeLookaheadFunction)(e,r,i)},t.prototype.lookAheadBuilderForAlternatives=function(e,r,i,n){return(0,Aa.buildAlternativesLookAheadFunc)(e,r,i,n)},t.prototype.getKeyForAutomaticLookahead=function(e,r){var i=this.getLastExplicitRuleShortName();return(0,la.getKeyForAutomaticLookahead)(i,e,r)},t.prototype.getLaFuncFromCache=function(e){},t.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},t.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},t.prototype.setLaFuncCache=function(e,r){},t.prototype.setLaFuncCacheUsingMap=function(e,r){this.lookAheadFuncsCache.set(e,r)},t.prototype.setLaFuncUsingObj=function(e,r){this.lookAheadFuncsCache[e]=r},t}();kE.LooksAhead=Bye});var Pj=I(go=>{"use strict";Object.defineProperty(go,"__esModule",{value:!0});go.addNoneTerminalToCst=go.addTerminalToCst=go.setNodeLocationFull=go.setNodeLocationOnlyOffset=void 0;function Qye(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";Object.defineProperty(aA,"__esModule",{value:!0});aA.defineNameProp=aA.functionName=aA.classNameFromInstance=void 0;var xye=Dt();function kye(t){return Dj(t.constructor)}aA.classNameFromInstance=kye;var Rj="name";function Dj(t){var e=t.name;return e||"anonymous"}aA.functionName=Dj;function Pye(t,e){var r=Object.getOwnPropertyDescriptor(t,Rj);return(0,xye.isUndefined)(r)||r.configurable?(Object.defineProperty(t,Rj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}aA.defineNameProp=Pye});var Mj=I(mi=>{"use strict";Object.defineProperty(mi,"__esModule",{value:!0});mi.validateRedundantMethods=mi.validateMissingCstMethods=mi.validateVisitor=mi.CstVisitorDefinitionError=mi.createBaseVisitorConstructorWithDefaults=mi.createBaseSemanticVisitorConstructor=mi.defaultVisit=void 0;var rs=Dt(),$h=dS();function Fj(t,e){for(var r=(0,rs.keys)(t),i=r.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return r.prototype=i,r.prototype.constructor=r,r._RULE_NAMES=e,r}mi.createBaseSemanticVisitorConstructor=Dye;function Rye(t,e,r){var i=function(){};(0,$h.defineNameProp)(i,t+"BaseSemanticsWithDefaults");var n=Object.create(r.prototype);return(0,rs.forEach)(e,function(s){n[s]=Fj}),i.prototype=n,i.prototype.constructor=i,i}mi.createBaseVisitorConstructorWithDefaults=Rye;var CS;(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(CS=mi.CstVisitorDefinitionError||(mi.CstVisitorDefinitionError={}));function Nj(t,e){var r=Lj(t,e),i=Tj(t,e);return r.concat(i)}mi.validateVisitor=Nj;function Lj(t,e){var r=(0,rs.map)(e,function(i){if(!(0,rs.isFunction)(t[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+" CST Visitor.",type:CS.MISSING_METHOD,methodName:i}});return(0,rs.compact)(r)}mi.validateMissingCstMethods=Lj;var Fye=["constructor","visit","validateVisitor"];function Tj(t,e){var r=[];for(var i in t)(0,rs.isFunction)(t[i])&&!(0,rs.contains)(Fye,i)&&!(0,rs.contains)(e,i)&&r.push({msg:"Redundant visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:CS.REDUNDANT_METHOD,methodName:i});return r}mi.validateRedundantMethods=Tj});var Kj=I(PE=>{"use strict";Object.defineProperty(PE,"__esModule",{value:!0});PE.TreeBuilder=void 0;var Su=Pj(),Ur=Dt(),Oj=Mj(),Nye=Tn(),Lye=function(){function t(){}return t.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Ur.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:Nye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Ur.NOOP,this.cstFinallyStateUpdate=Ur.NOOP,this.cstPostTerminal=Ur.NOOP,this.cstPostNonTerminal=Ur.NOOP,this.cstPostRule=Ur.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationFull,this.setNodeLocationFromNode=Su.setNodeLocationFull,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=Su.setNodeLocationOnlyOffset,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=Ur.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(e){var r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstInvocationStateUpdate=function(e,r){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},t.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},t.prototype.cstPostRuleFull=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?(i.endOffset=r.endOffset,i.endLine=r.endLine,i.endColumn=r.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?i.endOffset=r.endOffset:i.startOffset=NaN},t.prototype.cstPostTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addTerminalToCst)(i,r,e),this.setNodeLocationFromToken(i.location,r)},t.prototype.cstPostNonTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addNoneTerminalToCst)(i,r,e),this.setNodeLocationFromNode(i.location,e.location)},t.prototype.getBaseCstVisitorConstructor=function(){if((0,Ur.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Oj.createBaseSemanticVisitorConstructor)(this.className,(0,Ur.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Ur.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Oj.createBaseVisitorConstructorWithDefaults)(this.className,(0,Ur.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},t}();PE.TreeBuilder=Lye});var Hj=I(DE=>{"use strict";Object.defineProperty(DE,"__esModule",{value:!0});DE.LexerAdapter=void 0;var Uj=Tn(),Tye=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Uj.END_OF_FILE},t.prototype.LA=function(e){var r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Uj.END_OF_FILE:this.tokVector[r]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(e){this.currIdx=e},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();DE.LexerAdapter=Tye});var jj=I(RE=>{"use strict";Object.defineProperty(RE,"__esModule",{value:!0});RE.RecognizerApi=void 0;var Gj=Dt(),Mye=vu(),mS=Tn(),Oye=Wh(),Kye=gS(),Uye=hn(),Hye=function(){function t(){}return t.prototype.ACTION=function(e){return e.call(this)},t.prototype.consume=function(e,r,i){return this.consumeInternal(r,e,i)},t.prototype.subrule=function(e,r,i){return this.subruleInternal(r,e,i)},t.prototype.option=function(e,r){return this.optionInternal(r,e)},t.prototype.or=function(e,r){return this.orInternal(r,e)},t.prototype.many=function(e,r){return this.manyInternal(e,r)},t.prototype.atLeastOne=function(e,r){return this.atLeastOneInternal(e,r)},t.prototype.CONSUME=function(e,r){return this.consumeInternal(e,0,r)},t.prototype.CONSUME1=function(e,r){return this.consumeInternal(e,1,r)},t.prototype.CONSUME2=function(e,r){return this.consumeInternal(e,2,r)},t.prototype.CONSUME3=function(e,r){return this.consumeInternal(e,3,r)},t.prototype.CONSUME4=function(e,r){return this.consumeInternal(e,4,r)},t.prototype.CONSUME5=function(e,r){return this.consumeInternal(e,5,r)},t.prototype.CONSUME6=function(e,r){return this.consumeInternal(e,6,r)},t.prototype.CONSUME7=function(e,r){return this.consumeInternal(e,7,r)},t.prototype.CONSUME8=function(e,r){return this.consumeInternal(e,8,r)},t.prototype.CONSUME9=function(e,r){return this.consumeInternal(e,9,r)},t.prototype.SUBRULE=function(e,r){return this.subruleInternal(e,0,r)},t.prototype.SUBRULE1=function(e,r){return this.subruleInternal(e,1,r)},t.prototype.SUBRULE2=function(e,r){return this.subruleInternal(e,2,r)},t.prototype.SUBRULE3=function(e,r){return this.subruleInternal(e,3,r)},t.prototype.SUBRULE4=function(e,r){return this.subruleInternal(e,4,r)},t.prototype.SUBRULE5=function(e,r){return this.subruleInternal(e,5,r)},t.prototype.SUBRULE6=function(e,r){return this.subruleInternal(e,6,r)},t.prototype.SUBRULE7=function(e,r){return this.subruleInternal(e,7,r)},t.prototype.SUBRULE8=function(e,r){return this.subruleInternal(e,8,r)},t.prototype.SUBRULE9=function(e,r){return this.subruleInternal(e,9,r)},t.prototype.OPTION=function(e){return this.optionInternal(e,0)},t.prototype.OPTION1=function(e){return this.optionInternal(e,1)},t.prototype.OPTION2=function(e){return this.optionInternal(e,2)},t.prototype.OPTION3=function(e){return this.optionInternal(e,3)},t.prototype.OPTION4=function(e){return this.optionInternal(e,4)},t.prototype.OPTION5=function(e){return this.optionInternal(e,5)},t.prototype.OPTION6=function(e){return this.optionInternal(e,6)},t.prototype.OPTION7=function(e){return this.optionInternal(e,7)},t.prototype.OPTION8=function(e){return this.optionInternal(e,8)},t.prototype.OPTION9=function(e){return this.optionInternal(e,9)},t.prototype.OR=function(e){return this.orInternal(e,0)},t.prototype.OR1=function(e){return this.orInternal(e,1)},t.prototype.OR2=function(e){return this.orInternal(e,2)},t.prototype.OR3=function(e){return this.orInternal(e,3)},t.prototype.OR4=function(e){return this.orInternal(e,4)},t.prototype.OR5=function(e){return this.orInternal(e,5)},t.prototype.OR6=function(e){return this.orInternal(e,6)},t.prototype.OR7=function(e){return this.orInternal(e,7)},t.prototype.OR8=function(e){return this.orInternal(e,8)},t.prototype.OR9=function(e){return this.orInternal(e,9)},t.prototype.MANY=function(e){this.manyInternal(0,e)},t.prototype.MANY1=function(e){this.manyInternal(1,e)},t.prototype.MANY2=function(e){this.manyInternal(2,e)},t.prototype.MANY3=function(e){this.manyInternal(3,e)},t.prototype.MANY4=function(e){this.manyInternal(4,e)},t.prototype.MANY5=function(e){this.manyInternal(5,e)},t.prototype.MANY6=function(e){this.manyInternal(6,e)},t.prototype.MANY7=function(e){this.manyInternal(7,e)},t.prototype.MANY8=function(e){this.manyInternal(8,e)},t.prototype.MANY9=function(e){this.manyInternal(9,e)},t.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},t.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},t.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},t.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},t.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},t.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},t.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},t.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},t.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},t.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},t.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},t.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},t.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},t.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},t.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},t.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},t.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},t.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},t.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},t.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},t.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},t.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},t.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},t.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},t.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},t.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},t.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},t.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},t.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},t.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},t.prototype.RULE=function(e,r,i){if(i===void 0&&(i=mS.DEFAULT_RULE_CONFIG),(0,Gj.contains)(this.definedRulesNames,e)){var n=Oye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:mS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,r,i);return this[e]=o,o},t.prototype.OVERRIDE_RULE=function(e,r,i){i===void 0&&(i=mS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Kye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,r,i);return this[e]=s,s},t.prototype.BACKTRACK=function(e,r){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,r),!0}catch(n){if((0,Mye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,Uye.serializeGrammar)((0,Gj.values)(this.gastProductionsCache))},t}();RE.RecognizerApi=Hye});var Wj=I(FE=>{"use strict";Object.defineProperty(FE,"__esModule",{value:!0});FE.RecognizerEngine=void 0;var Ir=Dt(),Mn=xE(),NE=vu(),Yj=_h(),xu=Vh(),qj=Tn(),Gye=pS(),Jj=nA(),ep=yu(),jye=dS(),Yye=function(){function t(){}return t.prototype.initRecognizerEngine=function(e,r){if(this.className=(0,jye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=ep.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Ir.has)(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,Ir.isArray)(e)){if((0,Ir.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,Ir.isArray)(e))this.tokensMap=(0,Ir.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Ir.has)(e,"modes")&&(0,Ir.every)((0,Ir.flatten)((0,Ir.values)(e.modes)),ep.isTokenType)){var i=(0,Ir.flatten)((0,Ir.values)(e.modes)),n=(0,Ir.uniq)(i);this.tokensMap=(0,Ir.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Ir.isObject)(e))this.tokensMap=(0,Ir.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Jj.EOF;var s=(0,Ir.every)((0,Ir.values)(e),function(o){return(0,Ir.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?ep.tokenStructuredMatcherNoCategories:ep.tokenStructuredMatcher,(0,ep.augmentTokenTypes)((0,Ir.values)(this.tokensMap))},t.prototype.defineRule=function(e,r,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Ir.has)(i,"resyncEnabled")?i.resyncEnabled:qj.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Ir.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:qj.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<r},t.prototype.orInternal=function(e,r){var i=this.getKeyForAutomaticLookahead(Mn.OR_IDX,r),n=(0,Ir.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(r,e.ERR_MSG)},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new NE.NotAllInputParsedException(r,e))}},t.prototype.subruleInternal=function(e,r,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,r,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},t.prototype.subruleInternalError=function(e,r,i){throw(0,NE.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:i),delete e.partialCstResult),e},t.prototype.consumeInternal=function(e,r,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,r,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},t.prototype.consumeInternalError=function(e,r,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new NE.MismatchedTokenException(n,r,s))},t.prototype.consumeInternalRecovery=function(e,r,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Gye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},t.prototype.saveRecogState=function(){var e=this.errors,r=(0,Ir.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}},t.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(e,r,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r,e)},t.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},t.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},t.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Jj.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();FE.RecognizerEngine=Yye});var Vj=I(LE=>{"use strict";Object.defineProperty(LE,"__esModule",{value:!0});LE.ErrorHandler=void 0;var IS=vu(),ES=Dt(),zj=_h(),qye=Tn(),Jye=function(){function t(){}return t.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,ES.has)(e,"errorMessageProvider")?e.errorMessageProvider:qye.DEFAULT_PARSER_CONFIG.errorMessageProvider},t.prototype.SAVE_ERROR=function(e){if((0,IS.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,ES.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(t.prototype,"errors",{get:function(){return(0,ES.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),t.prototype.raiseEarlyExitException=function(e,r,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,zj.getLookaheadPathsForOptionalProd)(e,s,r,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new IS.EarlyExitException(u,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(e,r){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,zj.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new IS.NoViableAltException(c,this.LA(1),l))},t}();LE.ErrorHandler=Jye});var Zj=I(TE=>{"use strict";Object.defineProperty(TE,"__esModule",{value:!0});TE.ContentAssist=void 0;var _j=Vh(),Xj=Dt(),Wye=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(e,r){var i=this.gastProductionsCache[e];if((0,Xj.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,_j.nextPossibleTokensAfter)([i],r,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(e){var r=(0,Xj.first)(e.ruleStack),i=this.getGAstProductions(),n=i[r],s=new _j.NextAfterTokenWalker(n,e).startWalking();return s},t}();TE.ContentAssist=Wye});var oY=I(ME=>{"use strict";Object.defineProperty(ME,"__esModule",{value:!0});ME.GastRecorder=void 0;var Cn=Dt(),fo=hn(),zye=Gh(),$j=yu(),eY=nA(),Vye=Tn(),_ye=xE(),OE={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(OE);var tY=!0,rY=Math.pow(2,_ye.BITS_FOR_OCCURRENCE_IDX)-1,iY=(0,eY.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:zye.Lexer.NA});(0,$j.augmentTokenTypes)([iY]);var nY=(0,eY.createTokenInstance)(iY,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(nY);var Xye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},$ye=function(){function t(){}return t.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var r=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)r(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},t.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var r=0;r<10;r++){var i=r>0?r:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(e){},t.prototype.BACKTRACK_RECORD=function(e,r){return function(){return!0}},t.prototype.LA_RECORD=function(e){return Vye.END_OF_FILE},t.prototype.topLevelRuleRecord=function(e,r){try{var i=new fo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),r.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},t.prototype.optionInternalRecord=function(e,r){return tp.call(this,fo.Option,e,r)},t.prototype.atLeastOneInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatory,r,e)},t.prototype.atLeastOneSepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatoryWithSeparator,r,e,tY)},t.prototype.manyInternalRecord=function(e,r){tp.call(this,fo.Repetition,r,e)},t.prototype.manySepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionWithSeparator,r,e,tY)},t.prototype.orInternalRecord=function(e,r){return Zye.call(this,e,r)},t.prototype.subruleInternalRecord=function(e,r,i){if(KE(r),!e||(0,Cn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=e.ruleName,a=new fo.NonTerminal({idx:r,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Xye:OE},t.prototype.consumeInternalRecord=function(e,r,i){if(KE(r),!(0,$j.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=new fo.Terminal({idx:r,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),nY},t}();ME.GastRecorder=$ye;function tp(t,e,r,i){i===void 0&&(i=!1),KE(r);var n=(0,Cn.peek)(this.recordingProdStack),s=(0,Cn.isFunction)(e)?e:e.DEF,o=new t({definition:[],idx:r});return i&&(o.separator=e.SEP),(0,Cn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),OE}function Zye(t,e){var r=this;KE(e);var i=(0,Cn.peek)(this.recordingProdStack),n=(0,Cn.isArray)(t)===!1,s=n===!1?t:t.DEF,o=new fo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});(0,Cn.has)(t,"MAX_LOOKAHEAD")&&(o.maxLookahead=t.MAX_LOOKAHEAD);var a=(0,Cn.some)(s,function(l){return(0,Cn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,Cn.forEach)(s,function(l){var c=new fo.Alternative({definition:[]});o.definition.push(c),(0,Cn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,Cn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),r.recordingProdStack.push(c),l.ALT.call(r),r.recordingProdStack.pop()}),OE}function sY(t){return t===0?"":""+t}function KE(t){if(t<0||t>rY){var e=new Error("Invalid DSL Method idx value: <"+t+`> + `+("Idx value must be a none negative value smaller than "+(rY+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var AY=I(UE=>{"use strict";Object.defineProperty(UE,"__esModule",{value:!0});UE.PerformanceTracer=void 0;var aY=Dt(),ewe=Tn(),twe=function(){function t(){}return t.prototype.initPerformanceTracer=function(e){if((0,aY.has)(e,"traceInitPerf")){var r=e.traceInitPerf,i=typeof r=="number";this.traceInitMaxIdent=i?r:Infinity,this.traceInitPerf=i?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ewe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,aY.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t}();UE.PerformanceTracer=twe});var lY=I(HE=>{"use strict";Object.defineProperty(HE,"__esModule",{value:!0});HE.applyMixins=void 0;function rwe(t,e){e.forEach(function(r){var i=r.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(t.prototype,n,s):t.prototype[n]=r.prototype[n]}})})}HE.applyMixins=rwe});var Tn=I(or=>{"use strict";var cY=or&&or.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(or,"__esModule",{value:!0});or.EmbeddedActionsParser=or.CstParser=or.Parser=or.EMPTY_ALT=or.ParserDefinitionErrorType=or.DEFAULT_RULE_CONFIG=or.DEFAULT_PARSER_CONFIG=or.END_OF_FILE=void 0;var Wi=Dt(),iwe=VG(),uY=nA(),gY=Wh(),fY=yj(),nwe=pS(),swe=kj(),owe=Kj(),awe=Hj(),Awe=jj(),lwe=Wj(),cwe=Vj(),uwe=Zj(),gwe=oY(),fwe=AY(),hwe=lY();or.END_OF_FILE=(0,uY.createTokenInstance)(uY.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(or.END_OF_FILE);or.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:gY.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});or.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var pwe;(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(pwe=or.ParserDefinitionErrorType||(or.ParserDefinitionErrorType={}));function dwe(t){return t===void 0&&(t=void 0),function(){return t}}or.EMPTY_ALT=dwe;var GE=function(){function t(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(r),i.initLexerAdapter(),i.initLooksAhead(r),i.initRecognizerEngine(e,r),i.initRecoverable(r),i.initTreeBuilder(r),i.initContentAssist(),i.initGastRecorder(r),i.initPerformanceTracer(r),(0,Wi.has)(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,Wi.has)(r,"skipValidations")?r.skipValidations:or.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var r;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,Wi.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,Wi.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,fY.resolveGrammar)({rules:(0,Wi.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,Wi.isEmpty)(n)&&e.skipValidations===!1){var s=(0,fY.validateGrammar)({rules:(0,Wi.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,Wi.values)(e.tokensMap),errMsgProvider:gY.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,Wi.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,iwe.computeAllProdsFollows)((0,Wi.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,Wi.values)(e.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,Wi.isEmpty)(e.definitionErrors))throw r=(0,Wi.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+r.join(` +------------------------------- +`))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();or.Parser=GE;(0,hwe.applyMixins)(GE,[nwe.Recoverable,swe.LooksAhead,owe.TreeBuilder,awe.LexerAdapter,lwe.RecognizerEngine,Awe.RecognizerApi,cwe.ErrorHandler,uwe.ContentAssist,gwe.GastRecorder,fwe.PerformanceTracer]);var Cwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!0,n=t.call(this,r,s)||this,n}return e}(GE);or.CstParser=Cwe;var mwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!1,n=t.call(this,r,s)||this,n}return e}(GE);or.EmbeddedActionsParser=mwe});var pY=I(jE=>{"use strict";Object.defineProperty(jE,"__esModule",{value:!0});jE.createSyntaxDiagramsCode=void 0;var hY=Uv();function Iwe(t,e){var r=e===void 0?{}:e,i=r.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/":i,s=r.css,o=s===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` + + + + +`,u=` +
+`,g=` + +`,f=` + +`;return a+l+c+u+g+f}jE.createSyntaxDiagramsCode=Iwe});var mY=I(He=>{"use strict";Object.defineProperty(He,"__esModule",{value:!0});He.Parser=He.createSyntaxDiagramsCode=He.clearCache=He.GAstVisitor=He.serializeProduction=He.serializeGrammar=He.Terminal=He.Rule=He.RepetitionWithSeparator=He.RepetitionMandatoryWithSeparator=He.RepetitionMandatory=He.Repetition=He.Option=He.NonTerminal=He.Alternative=He.Alternation=He.defaultLexerErrorProvider=He.NoViableAltException=He.NotAllInputParsedException=He.MismatchedTokenException=He.isRecognitionException=He.EarlyExitException=He.defaultParserErrorProvider=He.tokenName=He.tokenMatcher=He.tokenLabel=He.EOF=He.createTokenInstance=He.createToken=He.LexerDefinitionErrorType=He.Lexer=He.EMPTY_ALT=He.ParserDefinitionErrorType=He.EmbeddedActionsParser=He.CstParser=He.VERSION=void 0;var Ewe=Uv();Object.defineProperty(He,"VERSION",{enumerable:!0,get:function(){return Ewe.VERSION}});var YE=Tn();Object.defineProperty(He,"CstParser",{enumerable:!0,get:function(){return YE.CstParser}});Object.defineProperty(He,"EmbeddedActionsParser",{enumerable:!0,get:function(){return YE.EmbeddedActionsParser}});Object.defineProperty(He,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return YE.ParserDefinitionErrorType}});Object.defineProperty(He,"EMPTY_ALT",{enumerable:!0,get:function(){return YE.EMPTY_ALT}});var dY=Gh();Object.defineProperty(He,"Lexer",{enumerable:!0,get:function(){return dY.Lexer}});Object.defineProperty(He,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return dY.LexerDefinitionErrorType}});var ku=nA();Object.defineProperty(He,"createToken",{enumerable:!0,get:function(){return ku.createToken}});Object.defineProperty(He,"createTokenInstance",{enumerable:!0,get:function(){return ku.createTokenInstance}});Object.defineProperty(He,"EOF",{enumerable:!0,get:function(){return ku.EOF}});Object.defineProperty(He,"tokenLabel",{enumerable:!0,get:function(){return ku.tokenLabel}});Object.defineProperty(He,"tokenMatcher",{enumerable:!0,get:function(){return ku.tokenMatcher}});Object.defineProperty(He,"tokenName",{enumerable:!0,get:function(){return ku.tokenName}});var ywe=Wh();Object.defineProperty(He,"defaultParserErrorProvider",{enumerable:!0,get:function(){return ywe.defaultParserErrorProvider}});var rp=vu();Object.defineProperty(He,"EarlyExitException",{enumerable:!0,get:function(){return rp.EarlyExitException}});Object.defineProperty(He,"isRecognitionException",{enumerable:!0,get:function(){return rp.isRecognitionException}});Object.defineProperty(He,"MismatchedTokenException",{enumerable:!0,get:function(){return rp.MismatchedTokenException}});Object.defineProperty(He,"NotAllInputParsedException",{enumerable:!0,get:function(){return rp.NotAllInputParsedException}});Object.defineProperty(He,"NoViableAltException",{enumerable:!0,get:function(){return rp.NoViableAltException}});var wwe=_v();Object.defineProperty(He,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return wwe.defaultLexerErrorProvider}});var ho=hn();Object.defineProperty(He,"Alternation",{enumerable:!0,get:function(){return ho.Alternation}});Object.defineProperty(He,"Alternative",{enumerable:!0,get:function(){return ho.Alternative}});Object.defineProperty(He,"NonTerminal",{enumerable:!0,get:function(){return ho.NonTerminal}});Object.defineProperty(He,"Option",{enumerable:!0,get:function(){return ho.Option}});Object.defineProperty(He,"Repetition",{enumerable:!0,get:function(){return ho.Repetition}});Object.defineProperty(He,"RepetitionMandatory",{enumerable:!0,get:function(){return ho.RepetitionMandatory}});Object.defineProperty(He,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionMandatoryWithSeparator}});Object.defineProperty(He,"RepetitionWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionWithSeparator}});Object.defineProperty(He,"Rule",{enumerable:!0,get:function(){return ho.Rule}});Object.defineProperty(He,"Terminal",{enumerable:!0,get:function(){return ho.Terminal}});var CY=hn();Object.defineProperty(He,"serializeGrammar",{enumerable:!0,get:function(){return CY.serializeGrammar}});Object.defineProperty(He,"serializeProduction",{enumerable:!0,get:function(){return CY.serializeProduction}});var Bwe=wu();Object.defineProperty(He,"GAstVisitor",{enumerable:!0,get:function(){return Bwe.GAstVisitor}});function Qwe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. + It performs no action other than printing this message. + Please avoid using it as it will be completely removed in the future`)}He.clearCache=Qwe;var bwe=pY();Object.defineProperty(He,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return bwe.createSyntaxDiagramsCode}});var vwe=function(){function t(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. +See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return t}();He.Parser=vwe});var yY=I((Trt,IY)=>{var qE=mY(),ca=qE.createToken,EY=qE.tokenMatcher,yS=qE.Lexer,Swe=qE.EmbeddedActionsParser;IY.exports=t=>{let e=ca({name:"LogicalOperator",pattern:yS.NA}),r=ca({name:"Or",pattern:/\|/,categories:e}),i=ca({name:"Xor",pattern:/\^/,categories:e}),n=ca({name:"And",pattern:/&/,categories:e}),s=ca({name:"Not",pattern:/!/}),o=ca({name:"LParen",pattern:/\(/}),a=ca({name:"RParen",pattern:/\)/}),l=ca({name:"Query",pattern:t}),u=[ca({name:"WhiteSpace",pattern:/\s+/,group:yS.SKIPPED}),r,i,n,o,a,s,e,l],g=new yS(u);class f extends Swe{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let m=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let E=m,B=this.CONSUME(e),b=this.SUBRULE2(this.atomicExpression);EY(B,r)?m=R=>E(R)||b(R):EY(B,i)?m=R=>!!(E(R)^b(R)):m=R=>E(R)&&b(R)}),m}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:d}=this.CONSUME(l);return m=>m(d)}},{ALT:()=>{this.CONSUME(s);let d=this.SUBRULE(this.atomicExpression);return m=>!d(m)}}])),this.RULE("parenthesisExpression",()=>{let d;return this.CONSUME(o),d=this.SUBRULE(this.expression),this.CONSUME(a),d}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var wY=I(JE=>{var xwe=yY();JE.makeParser=(t=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:r}=xwe(t),i=new r;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};JE.parse=JE.makeParser()});var QY=I((Ort,BY)=>{"use strict";BY.exports=(...t)=>[...new Set([].concat(...t))]});var wS=I((Krt,bY)=>{"use strict";var kwe=require("stream"),vY=kwe.PassThrough,Pwe=Array.prototype.slice;bY.exports=Dwe;function Dwe(){let t=[],e=!1,r=Pwe.call(arguments),i=r[r.length-1];i&&!Array.isArray(i)&&i.pipe==null?r.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=vY(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(WE,"__esModule",{value:!0});function Rwe(t){return t.reduce((e,r)=>[].concat(e,r),[])}WE.flatten=Rwe;function Fwe(t,e){let r=[[]],i=0;for(let n of t)e(n)?(i++,r[i]=[]):r[i].push(n);return r}WE.splitWhen=Fwe});var kY=I(BS=>{"use strict";Object.defineProperty(BS,"__esModule",{value:!0});function Nwe(t){return t.code==="ENOENT"}BS.isEnoentCodeError=Nwe});var DY=I(QS=>{"use strict";Object.defineProperty(QS,"__esModule",{value:!0});var PY=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Lwe(t,e){return new PY(t,e)}QS.createDirentFromStats=Lwe});var RY=I(Pu=>{"use strict";Object.defineProperty(Pu,"__esModule",{value:!0});var Twe=require("path"),Mwe=2,Owe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function Kwe(t){return t.replace(/\\/g,"/")}Pu.unixify=Kwe;function Uwe(t,e){return Twe.resolve(t,e)}Pu.makeAbsolute=Uwe;function Hwe(t){return t.replace(Owe,"\\$2")}Pu.escape=Hwe;function Gwe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(Mwe)}return t}Pu.removeLeadingDotSegment=Gwe});var NY=I((Yrt,FY)=>{FY.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var TY=I((qrt,LY)=>{var jwe=NY(),Ywe={"{":"}","(":")","[":"]"},qwe=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,Jwe=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;LY.exports=function(e,r){if(typeof e!="string"||e==="")return!1;if(jwe(e))return!0;var i=qwe,n;for(r&&r.strict===!1&&(i=Jwe);n=i.exec(e);){if(n[2])return!0;var s=n.index+n[0].length,o=n[1],a=o?Ywe[o]:null;if(o&&a){var l=e.indexOf(a,s);l!==-1&&(s=l+1)}e=e.slice(s)}return!1}});var OY=I((Jrt,MY)=>{"use strict";var Wwe=TY(),zwe=require("path").posix.dirname,Vwe=require("os").platform()==="win32",bS="/",_we=/\\/g,Xwe=/[\{\[].*[\}\]]$/,Zwe=/(^|[^\\])([\{\[]|\([^\)]+$)/,$we=/\\([\!\*\?\|\[\]\(\)\{\}])/g;MY.exports=function(e,r){var i=Object.assign({flipBackslashes:!0},r);i.flipBackslashes&&Vwe&&e.indexOf(bS)<0&&(e=e.replace(_we,bS)),Xwe.test(e)&&(e+=bS),e+="a";do e=zwe(e);while(Wwe(e)||Zwe.test(e));return e.replace($we,"$1")}});var WY=I(Hr=>{"use strict";Object.defineProperty(Hr,"__esModule",{value:!0});var eBe=require("path"),tBe=OY(),KY=Nn(),rBe=iv(),UY="**",iBe="\\",nBe=/[*?]|^!/,sBe=/\[.*]/,oBe=/(?:^|[^!*+?@])\(.*\|.*\)/,aBe=/[!*+?@]\(.*\)/,ABe=/{.*(?:,|\.\.).*}/;function GY(t,e={}){return!HY(t,e)}Hr.isStaticPattern=GY;function HY(t,e={}){return!!(e.caseSensitiveMatch===!1||t.includes(iBe)||nBe.test(t)||sBe.test(t)||oBe.test(t)||e.extglob!==!1&&aBe.test(t)||e.braceExpansion!==!1&&ABe.test(t))}Hr.isDynamicPattern=HY;function lBe(t){return zE(t)?t.slice(1):t}Hr.convertToPositivePattern=lBe;function cBe(t){return"!"+t}Hr.convertToNegativePattern=cBe;function zE(t){return t.startsWith("!")&&t[1]!=="("}Hr.isNegativePattern=zE;function jY(t){return!zE(t)}Hr.isPositivePattern=jY;function uBe(t){return t.filter(zE)}Hr.getNegativePatterns=uBe;function gBe(t){return t.filter(jY)}Hr.getPositivePatterns=gBe;function fBe(t){return tBe(t,{flipBackslashes:!1})}Hr.getBaseDirectory=fBe;function hBe(t){return t.includes(UY)}Hr.hasGlobStar=hBe;function YY(t){return t.endsWith("/"+UY)}Hr.endsWithSlashGlobStar=YY;function pBe(t){let e=eBe.basename(t);return YY(t)||GY(e)}Hr.isAffectDepthOfReadingPattern=pBe;function dBe(t){return t.reduce((e,r)=>e.concat(qY(r)),[])}Hr.expandPatternsWithBraceExpansion=dBe;function qY(t){return KY.braces(t,{expand:!0,nodupes:!0})}Hr.expandBraceExpansion=qY;function CBe(t,e){let r=rBe.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.parts.length===0?[t]:r.parts}Hr.getPatternParts=CBe;function JY(t,e){return KY.makeRe(t,e)}Hr.makeRe=JY;function mBe(t,e){return t.map(r=>JY(r,e))}Hr.convertPatternsToRe=mBe;function IBe(t,e){return e.some(r=>r.test(t))}Hr.matchAny=IBe});var VY=I(vS=>{"use strict";Object.defineProperty(vS,"__esModule",{value:!0});var EBe=wS();function yBe(t){let e=EBe(t);return t.forEach(r=>{r.once("error",i=>e.emit("error",i))}),e.once("close",()=>zY(t)),e.once("end",()=>zY(t)),e}vS.merge=yBe;function zY(t){t.forEach(e=>e.emit("close"))}});var _Y=I(VE=>{"use strict";Object.defineProperty(VE,"__esModule",{value:!0});function wBe(t){return typeof t=="string"}VE.isString=wBe;function BBe(t){return t===""}VE.isEmpty=BBe});var ga=I(ua=>{"use strict";Object.defineProperty(ua,"__esModule",{value:!0});var QBe=xY();ua.array=QBe;var bBe=kY();ua.errno=bBe;var vBe=DY();ua.fs=vBe;var SBe=RY();ua.path=SBe;var xBe=WY();ua.pattern=xBe;var kBe=VY();ua.stream=kBe;var PBe=_Y();ua.string=PBe});var tq=I(fa=>{"use strict";Object.defineProperty(fa,"__esModule",{value:!0});var Ll=ga();function DBe(t,e){let r=XY(t),i=ZY(t,e.ignore),n=r.filter(l=>Ll.pattern.isStaticPattern(l,e)),s=r.filter(l=>Ll.pattern.isDynamicPattern(l,e)),o=SS(n,i,!1),a=SS(s,i,!0);return o.concat(a)}fa.generate=DBe;function SS(t,e,r){let i=$Y(t);return"."in i?[xS(".",t,e,r)]:eq(i,e,r)}fa.convertPatternsToTasks=SS;function XY(t){return Ll.pattern.getPositivePatterns(t)}fa.getPositivePatterns=XY;function ZY(t,e){return Ll.pattern.getNegativePatterns(t).concat(e).map(Ll.pattern.convertToPositivePattern)}fa.getNegativePatternsAsPositive=ZY;function $Y(t){let e={};return t.reduce((r,i)=>{let n=Ll.pattern.getBaseDirectory(i);return n in r?r[n].push(i):r[n]=[i],r},e)}fa.groupPatternsByBaseDirectory=$Y;function eq(t,e,r){return Object.keys(t).map(i=>xS(i,t[i],e,r))}fa.convertPatternGroupsToTasks=eq;function xS(t,e,r,i){return{dynamic:i,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Ll.pattern.convertToNegativePattern))}}fa.convertPatternGroupToTask=xS});var iq=I(_E=>{"use strict";Object.defineProperty(_E,"__esModule",{value:!0});_E.read=void 0;function RBe(t,e,r){e.fs.lstat(t,(i,n)=>{if(i!==null){rq(r,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){kS(r,n);return}e.fs.stat(t,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){rq(r,s);return}kS(r,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),kS(r,o)})})}_E.read=RBe;function rq(t,e){t(e)}function kS(t,e){t(null,e)}});var nq=I(XE=>{"use strict";Object.defineProperty(XE,"__esModule",{value:!0});XE.read=void 0;function FBe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let i=e.fs.statSync(t);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw i}}XE.read=FBe});var sq=I(AA=>{"use strict";Object.defineProperty(AA,"__esModule",{value:!0});AA.createFileSystemAdapter=AA.FILE_SYSTEM_ADAPTER=void 0;var ZE=require("fs");AA.FILE_SYSTEM_ADAPTER={lstat:ZE.lstat,stat:ZE.stat,lstatSync:ZE.lstatSync,statSync:ZE.statSync};function NBe(t){return t===void 0?AA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},AA.FILE_SYSTEM_ADAPTER),t)}AA.createFileSystemAdapter=NBe});var aq=I(PS=>{"use strict";Object.defineProperty(PS,"__esModule",{value:!0});var LBe=sq(),oq=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=LBe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e!=null?e:r}};PS.default=oq});var Tl=I(lA=>{"use strict";Object.defineProperty(lA,"__esModule",{value:!0});lA.statSync=lA.stat=lA.Settings=void 0;var Aq=iq(),TBe=nq(),DS=aq();lA.Settings=DS.default;function MBe(t,e,r){if(typeof e=="function"){Aq.read(t,RS(),e);return}Aq.read(t,RS(e),r)}lA.stat=MBe;function OBe(t,e){let r=RS(e);return TBe.read(t,r)}lA.statSync=OBe;function RS(t={}){return t instanceof DS.default?t:new DS.default(t)}});var cq=I((iit,lq)=>{lq.exports=KBe;function KBe(t,e){var r,i,n,s=!0;Array.isArray(t)?(r=[],i=t.length):(n=Object.keys(t),r={},i=n.length);function o(l){function c(){e&&e(l,r),e=null}s?process.nextTick(c):c()}function a(l,c,u){r[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){t[l](function(c,u){a(l,c,u)})}):t.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var FS=I($E=>{"use strict";Object.defineProperty($E,"__esModule",{value:!0});$E.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var ey=process.versions.node.split(".");if(ey[0]===void 0||ey[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var uq=Number.parseInt(ey[0],10),UBe=Number.parseInt(ey[1],10),gq=10,HBe=10,GBe=uq>gq,jBe=uq===gq&&UBe>=HBe;$E.IS_SUPPORT_READDIR_WITH_FILE_TYPES=GBe||jBe});var hq=I(ty=>{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.createDirentFromStats=void 0;var fq=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function YBe(t,e){return new fq(t,e)}ty.createDirentFromStats=YBe});var NS=I(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.fs=void 0;var qBe=hq();ry.fs=qBe});var LS=I(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.joinPathSegments=void 0;function JBe(t,e,r){return t.endsWith(r)?t+e:t+r+e}iy.joinPathSegments=JBe});var Eq=I(cA=>{"use strict";Object.defineProperty(cA,"__esModule",{value:!0});cA.readdir=cA.readdirWithFileTypes=cA.read=void 0;var WBe=Tl(),pq=cq(),zBe=FS(),dq=NS(),Cq=LS();function VBe(t,e,r){if(!e.stats&&zBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){mq(t,e,r);return}Iq(t,e,r)}cA.read=VBe;function mq(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:Cq.joinPathSegments(t,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){TS(r,s);return}let o=s.map(a=>_Be(a,e));pq(o,(a,l)=>{if(a!==null){ny(r,a);return}TS(r,l)})})}cA.readdirWithFileTypes=mq;function _Be(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){r(i);return}r(null,t);return}t.dirent=dq.fs.createDirentFromStats(t.name,n),r(null,t)})}}function Iq(t,e,r){e.fs.readdir(t,(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(o=>{let a=Cq.joinPathSegments(t,o,e.pathSegmentSeparator);return l=>{WBe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:dq.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});pq(s,(o,a)=>{if(o!==null){ny(r,o);return}TS(r,a)})})}cA.readdir=Iq;function ny(t,e){t(e)}function TS(t,e){t(null,e)}});var bq=I(uA=>{"use strict";Object.defineProperty(uA,"__esModule",{value:!0});uA.readdir=uA.readdirWithFileTypes=uA.read=void 0;var XBe=Tl(),ZBe=FS(),yq=NS(),wq=LS();function $Be(t,e){return!e.stats&&ZBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Bq(t,e):Qq(t,e)}uA.read=$Be;function Bq(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:wq.joinPathSegments(t,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=yq.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}uA.readdirWithFileTypes=Bq;function Qq(t,e){return e.fs.readdirSync(t).map(i=>{let n=wq.joinPathSegments(t,i,e.pathSegmentSeparator),s=XBe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:yq.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}uA.readdir=Qq});var vq=I(gA=>{"use strict";Object.defineProperty(gA,"__esModule",{value:!0});gA.createFileSystemAdapter=gA.FILE_SYSTEM_ADAPTER=void 0;var Du=require("fs");gA.FILE_SYSTEM_ADAPTER={lstat:Du.lstat,stat:Du.stat,lstatSync:Du.lstatSync,statSync:Du.statSync,readdir:Du.readdir,readdirSync:Du.readdirSync};function e0e(t){return t===void 0?gA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},gA.FILE_SYSTEM_ADAPTER),t)}gA.createFileSystemAdapter=e0e});var xq=I(MS=>{"use strict";Object.defineProperty(MS,"__esModule",{value:!0});var t0e=require("path"),r0e=Tl(),i0e=vq(),Sq=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=i0e.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,t0e.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new r0e.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};MS.default=Sq});var sy=I(fA=>{"use strict";Object.defineProperty(fA,"__esModule",{value:!0});fA.Settings=fA.scandirSync=fA.scandir=void 0;var kq=Eq(),n0e=bq(),OS=xq();fA.Settings=OS.default;function s0e(t,e,r){if(typeof e=="function"){kq.read(t,KS(),e);return}kq.read(t,KS(e),r)}fA.scandir=s0e;function o0e(t,e){let r=KS(e);return n0e.read(t,r)}fA.scandirSync=o0e;function KS(t={}){return t instanceof OS.default?t:new OS.default(t)}});var Dq=I((fit,Pq)=>{"use strict";function a0e(t){var e=new t,r=e;function i(){var s=e;return s.next?e=s.next:(e=new t,r=e),s.next=null,s}function n(s){r.next=s,r=s}return{get:i,release:n}}Pq.exports=a0e});var Fq=I((hit,US)=>{"use strict";var A0e=Dq();function Rq(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var i=A0e(l0e),n=null,s=null,o=0,a=null,l={push:d,drain:po,saturated:po,pause:u,paused:!1,concurrency:r,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:m,empty:po,kill:B,killAndDrain:b,error:R};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,L=0;H;)H=H.next,L++;return L}function f(){for(var H=n,L=[];H;)L.push(H.value),H=H.next;return L}function h(){if(!!l.paused){l.paused=!1;for(var H=0;H{"use strict";Object.defineProperty(Co,"__esModule",{value:!0});Co.joinPathSegments=Co.replacePathSegmentSeparator=Co.isAppliedFilter=Co.isFatalError=void 0;function u0e(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}Co.isFatalError=u0e;function g0e(t,e){return t===null||t(e)}Co.isAppliedFilter=g0e;function f0e(t,e){return t.split(/[/\\]/).join(e)}Co.replacePathSegmentSeparator=f0e;function h0e(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}Co.joinPathSegments=h0e});var GS=I(HS=>{"use strict";Object.defineProperty(HS,"__esModule",{value:!0});var p0e=oy(),Nq=class{constructor(e,r){this._root=e,this._settings=r,this._root=p0e.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};HS.default=Nq});var YS=I(jS=>{"use strict";Object.defineProperty(jS,"__esModule",{value:!0});var d0e=require("events"),C0e=sy(),m0e=Fq(),ay=oy(),I0e=GS(),Lq=class extends I0e.default{constructor(e,r){super(e,r);this._settings=r,this._scandir=C0e.scandir,this._emitter=new d0e.EventEmitter,this._queue=m0e(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let i={directory:e,base:r};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){r(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!ay.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let i=e.path;r!==void 0&&(e.path=ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),ay.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};jS.default=Lq});var Mq=I(qS=>{"use strict";Object.defineProperty(qS,"__esModule",{value:!0});var E0e=YS(),Tq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new E0e.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{y0e(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{w0e(e,[...this._storage])}),this._reader.read()}};qS.default=Tq;function y0e(t,e){t(e)}function w0e(t,e){t(null,e)}});var Kq=I(JS=>{"use strict";Object.defineProperty(JS,"__esModule",{value:!0});var B0e=require("stream"),Q0e=YS(),Oq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Q0e.default(this._root,this._settings),this._stream=new B0e.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};JS.default=Oq});var Hq=I(WS=>{"use strict";Object.defineProperty(WS,"__esModule",{value:!0});var b0e=sy(),Ay=oy(),v0e=GS(),Uq=class extends v0e.default{constructor(){super(...arguments);this._scandir=b0e.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,r)}catch(i){this._handleError(i)}}_handleError(e){if(!!Ay.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let i=e.path;r!==void 0&&(e.path=Ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Ay.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&Ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};WS.default=Uq});var jq=I(zS=>{"use strict";Object.defineProperty(zS,"__esModule",{value:!0});var S0e=Hq(),Gq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new S0e.default(this._root,this._settings)}read(){return this._reader.read()}};zS.default=Gq});var qq=I(VS=>{"use strict";Object.defineProperty(VS,"__esModule",{value:!0});var x0e=require("path"),k0e=sy(),Yq=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,x0e.sep),this.fsScandirSettings=new k0e.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};VS.default=Yq});var XS=I(mo=>{"use strict";Object.defineProperty(mo,"__esModule",{value:!0});mo.Settings=mo.walkStream=mo.walkSync=mo.walk=void 0;var Jq=Mq(),P0e=Kq(),D0e=jq(),_S=qq();mo.Settings=_S.default;function R0e(t,e,r){if(typeof e=="function"){new Jq.default(t,ly()).read(e);return}new Jq.default(t,ly(e)).read(r)}mo.walk=R0e;function F0e(t,e){let r=ly(e);return new D0e.default(t,r).read()}mo.walkSync=F0e;function N0e(t,e){let r=ly(e);return new P0e.default(t,r).read()}mo.walkStream=N0e;function ly(t={}){return t instanceof _S.default?t:new _S.default(t)}});var $S=I(ZS=>{"use strict";Object.defineProperty(ZS,"__esModule",{value:!0});var L0e=require("path"),T0e=Tl(),Wq=ga(),zq=class{constructor(e){this._settings=e,this._fsStatSettings=new T0e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return L0e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let i={name:r,path:r,dirent:Wq.fs.createDirentFromStats(r,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!Wq.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};ZS.default=zq});var tx=I(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var M0e=require("stream"),O0e=Tl(),K0e=XS(),U0e=$S(),Vq=class extends U0e.default{constructor(){super(...arguments);this._walkStream=K0e.walkStream,this._stat=O0e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let i=e.map(this._getFullEntryPath,this),n=new M0e.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],r).then(l=>{l!==null&&r.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,r)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((r,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?r(s):i(n))})}};ex.default=Vq});var Xq=I(rx=>{"use strict";Object.defineProperty(rx,"__esModule",{value:!0});var Ru=ga(),_q=class{constructor(e,r,i){this._patterns=e,this._settings=r,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Ru.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let i=this._getPatternSegments(r),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:r,segments:i,sections:n})}}_getPatternSegments(e){return Ru.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Ru.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Ru.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Ru.array.splitWhen(e,r=>r.dynamic&&Ru.pattern.hasGlobStar(r.pattern))}};rx.default=_q});var $q=I(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var H0e=Xq(),Zq=class extends H0e.default{match(e){let r=e.split("/"),i=r.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||r.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};ix.default=Zq});var tJ=I(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var cy=ga(),G0e=$q(),eJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,i){let n=this._getMatcher(r),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new G0e.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(cy.pattern.isAffectDepthOfReadingPattern);return cy.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,i,n){let s=this._getEntryLevel(e,r.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(r))return!1;let o=cy.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,r){let i=e.split("/").length;return r.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!cy.pattern.matchAny(e,r)}};nx.default=eJ});var iJ=I(sx=>{"use strict";Object.defineProperty(sx,"__esModule",{value:!0});var ip=ga(),rJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let i=ip.pattern.convertPatternsToRe(e,this._micromatchOptions),n=ip.pattern.convertPatternsToRe(r,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,r,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,r)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let i=ip.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,r)}_isMatchToPatterns(e,r){let i=ip.path.removeLeadingDotSegment(e);return ip.pattern.matchAny(i,r)}};sx.default=rJ});var sJ=I(ox=>{"use strict";Object.defineProperty(ox,"__esModule",{value:!0});var j0e=ga(),nJ=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return j0e.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};ox.default=nJ});var AJ=I(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var oJ=ga(),aJ=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=oJ.path.makeAbsolute(this._settings.cwd,r),r=oJ.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};ax.default=aJ});var uy=I(Ax=>{"use strict";Object.defineProperty(Ax,"__esModule",{value:!0});var Y0e=require("path"),q0e=tJ(),J0e=iJ(),W0e=sJ(),z0e=AJ(),lJ=class{constructor(e){this._settings=e,this.errorFilter=new W0e.default(this._settings),this.entryFilter=new J0e.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new q0e.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new z0e.default(this._settings)}_getRootDirectory(e){return Y0e.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};Ax.default=lJ});var uJ=I(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var V0e=tx(),_0e=uy(),cJ=class extends _0e.default{constructor(){super(...arguments);this._reader=new V0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(r,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};lx.default=cJ});var fJ=I(cx=>{"use strict";Object.defineProperty(cx,"__esModule",{value:!0});var X0e=require("stream"),Z0e=tx(),$0e=uy(),gJ=class extends $0e.default{constructor(){super(...arguments);this._reader=new Z0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(r,e,i),s=new X0e.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};cx.default=gJ});var pJ=I(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var eQe=Tl(),tQe=XS(),rQe=$S(),hJ=class extends rQe.default{constructor(){super(...arguments);this._walkSync=tQe.walkSync,this._statSync=eQe.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,r);o===null||!r.entryFilter(o)||i.push(o)}return i}_getEntry(e,r,i){try{let n=this._getStat(e);return this._makeEntry(n,r)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};ux.default=hJ});var CJ=I(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var iQe=pJ(),nQe=uy(),dJ=class extends nQe.default{constructor(){super(...arguments);this._reader=new iQe.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(r,e,i).map(i.transform)}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};gx.default=dJ});var IJ=I(np=>{"use strict";Object.defineProperty(np,"__esModule",{value:!0});var Fu=require("fs"),sQe=require("os"),oQe=sQe.cpus().length;np.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Fu.lstat,lstatSync:Fu.lstatSync,stat:Fu.stat,statSync:Fu.statSync,readdir:Fu.readdir,readdirSync:Fu.readdirSync};var mJ=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,oQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},np.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};np.default=mJ});var gy=I((Oit,EJ)=>{"use strict";var yJ=tq(),aQe=uJ(),AQe=fJ(),lQe=CJ(),fx=IJ(),Ml=ga();async function px(t,e){Nu(t);let r=hx(t,aQe.default,e),i=await Promise.all(r);return Ml.array.flatten(i)}(function(t){function e(o,a){Nu(o);let l=hx(o,lQe.default,a);return Ml.array.flatten(l)}t.sync=e;function r(o,a){Nu(o);let l=hx(o,AQe.default,a);return Ml.stream.merge(l)}t.stream=r;function i(o,a){Nu(o);let l=[].concat(o),c=new fx.default(a);return yJ.generate(l,c)}t.generateTasks=i;function n(o,a){Nu(o);let l=new fx.default(a);return Ml.pattern.isDynamicPattern(o,l)}t.isDynamicPattern=n;function s(o){return Nu(o),Ml.path.escape(o)}t.escapePath=s})(px||(px={}));function hx(t,e,r){let i=[].concat(t),n=new fx.default(r),s=yJ.generate(i,n),o=new e(n);return s.map(o.read,o)}function Nu(t){if(![].concat(t).every(i=>Ml.string.isString(i)&&!Ml.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}EJ.exports=px});var BJ=I(Ol=>{"use strict";var{promisify:cQe}=require("util"),wJ=require("fs");async function dx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await cQe(wJ[t])(r))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Cx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return wJ[t](r)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Ol.isFile=dx.bind(null,"stat","isFile");Ol.isDirectory=dx.bind(null,"stat","isDirectory");Ol.isSymlink=dx.bind(null,"lstat","isSymbolicLink");Ol.isFileSync=Cx.bind(null,"statSync","isFile");Ol.isDirectorySync=Cx.bind(null,"statSync","isDirectory");Ol.isSymlinkSync=Cx.bind(null,"lstatSync","isSymbolicLink")});var xJ=I((Uit,mx)=>{"use strict";var Kl=require("path"),QJ=BJ(),bJ=t=>t.length>1?`{${t.join(",")}}`:t[0],vJ=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return Kl.isAbsolute(r)?r:Kl.join(e,r)},uQe=(t,e)=>Kl.extname(t)?`**/${t}`:`**/${t}.${bJ(e)}`,SJ=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>Kl.posix.join(t,uQe(r,e.extensions))):e.files?e.files.map(r=>Kl.posix.join(t,`**/${r}`)):e.extensions?[Kl.posix.join(t,`**/*.${bJ(e.extensions)}`)]:[Kl.posix.join(t,"**")]};mx.exports=async(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async i=>await QJ.isDirectory(vJ(i,e.cwd))?SJ(i,e):i));return[].concat.apply([],r)};mx.exports.sync=(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(i=>QJ.isDirectorySync(vJ(i,e.cwd))?SJ(i,e):i);return[].concat.apply([],r)}});var TJ=I((Hit,kJ)=>{function PJ(t){return Array.isArray(t)?t:[t]}var gQe=/^\s+$/,fQe=/^\\!/,hQe=/^\\#/,pQe=/\r?\n/g,dQe=/^\.*\/|^\.+$/,Ix="/",DJ=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",CQe=(t,e,r)=>Object.defineProperty(t,e,{value:r}),mQe=/([0-z])-([0-z])/g,IQe=t=>t.replace(mQe,(e,r,i)=>r.charCodeAt(0)<=i.charCodeAt(0)?e:""),EQe=[[/\\?\s+$/,t=>t.indexOf("\\")===0?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,t=>`\\${t}`],[/\[([^\]/]*)($|\])/g,(t,e,r)=>r==="]"?`[${IQe(e)}]`:`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`],[/\\\\\\/g,()=>"\\"]],RJ=Object.create(null),yQe=(t,e,r)=>{let i=RJ[t];if(i)return i;let n=EQe.reduce((s,o)=>s.replace(o[0],o[1].bind(t)),t);return RJ[t]=r?new RegExp(n,"i"):new RegExp(n)},Ex=t=>typeof t=="string",wQe=t=>t&&Ex(t)&&!gQe.test(t)&&t.indexOf("#")!==0,BQe=t=>t.split(pQe),FJ=class{constructor(e,r,i,n){this.origin=e,this.pattern=r,this.negative=i,this.regex=n}},QQe=(t,e)=>{let r=t,i=!1;t.indexOf("!")===0&&(i=!0,t=t.substr(1)),t=t.replace(fQe,"!").replace(hQe,"#");let n=yQe(t,i,e);return new FJ(r,t,i,n)},bQe=(t,e)=>{throw new e(t)},ha=(t,e,r)=>Ex(t)?t?ha.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),NJ=t=>dQe.test(t);ha.isNotRelative=NJ;ha.convert=t=>t;var LJ=class{constructor({ignorecase:e=!0}={}){this._rules=[],this._ignorecase=e,CQe(this,DJ,!0),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[DJ]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(wQe(e)){let r=QQe(e,this._ignorecase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,PJ(Ex(e)?BQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!r)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,r,i,n){let s=e&&ha.convert(e);return ha(s,e,bQe),this._t(s,r,i,n)}_t(e,r,i,n){if(e in r)return r[e];if(n||(n=e.split(Ix)),n.pop(),!n.length)return r[e]=this._testOne(e,i);let s=this._t(n.join(Ix)+Ix,r,i,n);return r[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return PJ(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},fy=t=>new LJ(t),vQe=()=>!1,SQe=t=>ha(t&&ha.convert(t),t,vQe);fy.isPathValid=SQe;fy.default=fy;kJ.exports=fy;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");ha.convert=t;let e=/^[a-z]:\//i;ha.isNotRelative=r=>e.test(r)||NJ(r)}});var OJ=I((Git,MJ)=>{"use strict";MJ.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var qJ=I((jit,yx)=>{"use strict";var{promisify:xQe}=require("util"),KJ=require("fs"),pa=require("path"),UJ=gy(),kQe=TJ(),sp=OJ(),HJ=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],PQe=xQe(KJ.readFile),DQe=t=>e=>e.startsWith("!")?"!"+pa.posix.join(t,e.slice(1)):pa.posix.join(t,e),RQe=(t,e)=>{let r=sp(pa.relative(e.cwd,pa.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(DQe(r))},GJ=t=>{let e=kQe();for(let r of t)e.add(RQe(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},FQe=(t,e)=>{if(t=sp(t),pa.isAbsolute(e)){if(sp(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return pa.join(t,e)},jJ=(t,e)=>r=>t.ignores(sp(pa.relative(e,FQe(e,r.path||r)))),NQe=async(t,e)=>{let r=pa.join(e,t),i=await PQe(r,"utf8");return{cwd:e,filePath:r,content:i}},LQe=(t,e)=>{let r=pa.join(e,t),i=KJ.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:i}},YJ=({ignore:t=[],cwd:e=sp(process.cwd())}={})=>({ignore:t,cwd:e});yx.exports=async t=>{t=YJ(t);let e=await UJ("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(n=>NQe(n,t.cwd))),i=GJ(r);return jJ(i,t.cwd)};yx.exports.sync=t=>{t=YJ(t);let r=UJ.sync("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}).map(n=>LQe(n,t.cwd)),i=GJ(r);return jJ(i,t.cwd)}});var VJ=I((Yit,JJ)=>{"use strict";var{Transform:TQe}=require("stream"),wx=class extends TQe{constructor(){super({objectMode:!0})}},WJ=class extends wx{constructor(e){super();this._filter=e}_transform(e,r,i){this._filter(e)&&this.push(e),i()}},zJ=class extends wx{constructor(){super();this._pushed=new Set}_transform(e,r,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};JJ.exports={FilterStream:WJ,UniqueStream:zJ}});var vx=I((qit,Ul)=>{"use strict";var _J=require("fs"),hy=QY(),MQe=wS(),py=gy(),dy=xJ(),Bx=qJ(),{FilterStream:OQe,UniqueStream:KQe}=VJ(),XJ=()=>!1,ZJ=t=>t[0]==="!",UQe=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},HQe=(t={})=>{if(!t.cwd)return;let e;try{e=_J.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},GQe=t=>t.stats instanceof _J.Stats?t.path:t,Cy=(t,e)=>{t=hy([].concat(t)),UQe(t),HQe(e);let r=[];e=P({ignore:[],expandDirectories:!0},e);for(let[i,n]of t.entries()){if(ZJ(n))continue;let s=t.slice(i).filter(a=>ZJ(a)).map(a=>a.slice(1)),o=_(P({},e),{ignore:e.ignore.concat(s)});r.push({pattern:n,options:o})}return r},jQe=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r=_(P({},r),{files:t.options.expandDirectories}):typeof t.options.expandDirectories=="object"&&(r=P(P({},r),t.options.expandDirectories)),e(t.pattern,r)},Qx=(t,e)=>t.options.expandDirectories?jQe(t,e):[t.pattern],$J=t=>t&&t.gitignore?Bx.sync({cwd:t.cwd,ignore:t.ignore}):XJ,bx=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=dy.sync(r.ignore)),{pattern:e,options:r}};Ul.exports=async(t,e)=>{let r=Cy(t,e),i=async()=>e&&e.gitignore?Bx({cwd:e.cwd,ignore:e.ignore}):XJ,n=async()=>{let l=await Promise.all(r.map(async c=>{let u=await Qx(c,dy);return Promise.all(u.map(bx(c)))}));return hy(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>py(l.pattern,l.options)));return hy(...a).filter(l=>!s(GQe(l)))};Ul.exports.sync=(t,e)=>{let r=Cy(t,e),i=[];for(let o of r){let a=Qx(o,dy.sync).map(bx(o));i.push(...a)}let n=$J(e),s=[];for(let o of i)s=hy(s,py.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Ul.exports.stream=(t,e)=>{let r=Cy(t,e),i=[];for(let a of r){let l=Qx(a,dy.sync).map(bx(a));i.push(...l)}let n=$J(e),s=new OQe(a=>!n(a)),o=new KQe;return MQe(i.map(a=>py.stream(a.pattern,a.options))).pipe(s).pipe(o)};Ul.exports.generateGlobTasks=Cy;Ul.exports.hasMagic=(t,e)=>[].concat(t).some(r=>py.isDynamicPattern(r,e));Ul.exports.gitignore=Bx});var Ca=I((da,Dy)=>{"use strict";Object.defineProperty(da,"__esModule",{value:!0});var A3=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function ibe(t){return A3.includes(t)}var nbe=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...A3];function sbe(t){return nbe.includes(t)}var obe=["null","undefined","string","number","bigint","boolean","symbol"];function abe(t){return obe.includes(t)}function Hu(t){return e=>typeof e===t}var{toString:l3}=Object.prototype,mp=t=>{let e=l3.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&j.domElement(t))return"HTMLElement";if(sbe(e))return e},er=t=>e=>mp(e)===t;function j(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(j.observable(t))return"Observable";if(j.array(t))return"Array";if(j.buffer(t))return"Buffer";let e=mp(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}j.undefined=Hu("undefined");j.string=Hu("string");var Abe=Hu("number");j.number=t=>Abe(t)&&!j.nan(t);j.bigint=Hu("bigint");j.function_=Hu("function");j.null_=t=>t===null;j.class_=t=>j.function_(t)&&t.toString().startsWith("class ");j.boolean=t=>t===!0||t===!1;j.symbol=Hu("symbol");j.numericString=t=>j.string(t)&&!j.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));j.array=(t,e)=>Array.isArray(t)?j.function_(e)?t.every(e):!0:!1;j.buffer=t=>{var e,r,i,n;return(n=(i=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||i===void 0?void 0:i.call(r,t))!==null&&n!==void 0?n:!1};j.nullOrUndefined=t=>j.null_(t)||j.undefined(t);j.object=t=>!j.null_(t)&&(typeof t=="object"||j.function_(t));j.iterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};j.asyncIterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};j.generator=t=>j.iterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.asyncGenerator=t=>j.asyncIterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.nativePromise=t=>er("Promise")(t);var lbe=t=>{var e,r;return j.function_((e=t)===null||e===void 0?void 0:e.then)&&j.function_((r=t)===null||r===void 0?void 0:r.catch)};j.promise=t=>j.nativePromise(t)||lbe(t);j.generatorFunction=er("GeneratorFunction");j.asyncGeneratorFunction=t=>mp(t)==="AsyncGeneratorFunction";j.asyncFunction=t=>mp(t)==="AsyncFunction";j.boundFunction=t=>j.function_(t)&&!t.hasOwnProperty("prototype");j.regExp=er("RegExp");j.date=er("Date");j.error=er("Error");j.map=t=>er("Map")(t);j.set=t=>er("Set")(t);j.weakMap=t=>er("WeakMap")(t);j.weakSet=t=>er("WeakSet")(t);j.int8Array=er("Int8Array");j.uint8Array=er("Uint8Array");j.uint8ClampedArray=er("Uint8ClampedArray");j.int16Array=er("Int16Array");j.uint16Array=er("Uint16Array");j.int32Array=er("Int32Array");j.uint32Array=er("Uint32Array");j.float32Array=er("Float32Array");j.float64Array=er("Float64Array");j.bigInt64Array=er("BigInt64Array");j.bigUint64Array=er("BigUint64Array");j.arrayBuffer=er("ArrayBuffer");j.sharedArrayBuffer=er("SharedArrayBuffer");j.dataView=er("DataView");j.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;j.urlInstance=t=>er("URL")(t);j.urlString=t=>{if(!j.string(t))return!1;try{return new URL(t),!0}catch(e){return!1}};j.truthy=t=>Boolean(t);j.falsy=t=>!t;j.nan=t=>Number.isNaN(t);j.primitive=t=>j.null_(t)||abe(typeof t);j.integer=t=>Number.isInteger(t);j.safeInteger=t=>Number.isSafeInteger(t);j.plainObject=t=>{if(l3.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};j.typedArray=t=>ibe(mp(t));var cbe=t=>j.safeInteger(t)&&t>=0;j.arrayLike=t=>!j.nullOrUndefined(t)&&!j.function_(t)&&cbe(t.length);j.inRange=(t,e)=>{if(j.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(j.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var ube=1,gbe=["innerHTML","ownerDocument","style","attributes","nodeValue"];j.domElement=t=>j.object(t)&&t.nodeType===ube&&j.string(t.nodeName)&&!j.plainObject(t)&&gbe.every(e=>e in t);j.observable=t=>{var e,r,i,n;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((n=(i=t)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};j.nodeStream=t=>j.object(t)&&j.function_(t.pipe)&&!j.observable(t);j.infinite=t=>t===Infinity||t===-Infinity;var c3=t=>e=>j.integer(e)&&Math.abs(e%2)===t;j.evenInteger=c3(0);j.oddInteger=c3(1);j.emptyArray=t=>j.array(t)&&t.length===0;j.nonEmptyArray=t=>j.array(t)&&t.length>0;j.emptyString=t=>j.string(t)&&t.length===0;j.nonEmptyString=t=>j.string(t)&&t.length>0;var fbe=t=>j.string(t)&&!/\S/.test(t);j.emptyStringOrWhitespace=t=>j.emptyString(t)||fbe(t);j.emptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length===0;j.nonEmptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length>0;j.emptySet=t=>j.set(t)&&t.size===0;j.nonEmptySet=t=>j.set(t)&&t.size>0;j.emptyMap=t=>j.map(t)&&t.size===0;j.nonEmptyMap=t=>j.map(t)&&t.size>0;j.propertyKey=t=>j.any([j.string,j.number,j.symbol],t);j.formData=t=>er("FormData")(t);j.urlSearchParams=t=>er("URLSearchParams")(t);var u3=(t,e,r)=>{if(!j.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};j.any=(t,...e)=>(j.array(t)?t:[t]).some(i=>u3(Array.prototype.some,i,e));j.all=(t,...e)=>u3(Array.prototype.every,t,e);var Te=(t,e,r,i={})=>{if(!t){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(r.map(o=>`\`${j(o)}\``))].join(", ")}`:`received value of type \`${j(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};da.assert={undefined:t=>Te(j.undefined(t),"undefined",t),string:t=>Te(j.string(t),"string",t),number:t=>Te(j.number(t),"number",t),bigint:t=>Te(j.bigint(t),"bigint",t),function_:t=>Te(j.function_(t),"Function",t),null_:t=>Te(j.null_(t),"null",t),class_:t=>Te(j.class_(t),"Class",t),boolean:t=>Te(j.boolean(t),"boolean",t),symbol:t=>Te(j.symbol(t),"symbol",t),numericString:t=>Te(j.numericString(t),"string with a number",t),array:(t,e)=>{Te(j.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Te(j.buffer(t),"Buffer",t),nullOrUndefined:t=>Te(j.nullOrUndefined(t),"null or undefined",t),object:t=>Te(j.object(t),"Object",t),iterable:t=>Te(j.iterable(t),"Iterable",t),asyncIterable:t=>Te(j.asyncIterable(t),"AsyncIterable",t),generator:t=>Te(j.generator(t),"Generator",t),asyncGenerator:t=>Te(j.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Te(j.nativePromise(t),"native Promise",t),promise:t=>Te(j.promise(t),"Promise",t),generatorFunction:t=>Te(j.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Te(j.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Te(j.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Te(j.boundFunction(t),"Function",t),regExp:t=>Te(j.regExp(t),"RegExp",t),date:t=>Te(j.date(t),"Date",t),error:t=>Te(j.error(t),"Error",t),map:t=>Te(j.map(t),"Map",t),set:t=>Te(j.set(t),"Set",t),weakMap:t=>Te(j.weakMap(t),"WeakMap",t),weakSet:t=>Te(j.weakSet(t),"WeakSet",t),int8Array:t=>Te(j.int8Array(t),"Int8Array",t),uint8Array:t=>Te(j.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Te(j.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Te(j.int16Array(t),"Int16Array",t),uint16Array:t=>Te(j.uint16Array(t),"Uint16Array",t),int32Array:t=>Te(j.int32Array(t),"Int32Array",t),uint32Array:t=>Te(j.uint32Array(t),"Uint32Array",t),float32Array:t=>Te(j.float32Array(t),"Float32Array",t),float64Array:t=>Te(j.float64Array(t),"Float64Array",t),bigInt64Array:t=>Te(j.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Te(j.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Te(j.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Te(j.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Te(j.dataView(t),"DataView",t),urlInstance:t=>Te(j.urlInstance(t),"URL",t),urlString:t=>Te(j.urlString(t),"string with a URL",t),truthy:t=>Te(j.truthy(t),"truthy",t),falsy:t=>Te(j.falsy(t),"falsy",t),nan:t=>Te(j.nan(t),"NaN",t),primitive:t=>Te(j.primitive(t),"primitive",t),integer:t=>Te(j.integer(t),"integer",t),safeInteger:t=>Te(j.safeInteger(t),"integer",t),plainObject:t=>Te(j.plainObject(t),"plain object",t),typedArray:t=>Te(j.typedArray(t),"TypedArray",t),arrayLike:t=>Te(j.arrayLike(t),"array-like",t),domElement:t=>Te(j.domElement(t),"HTMLElement",t),observable:t=>Te(j.observable(t),"Observable",t),nodeStream:t=>Te(j.nodeStream(t),"Node.js Stream",t),infinite:t=>Te(j.infinite(t),"infinite number",t),emptyArray:t=>Te(j.emptyArray(t),"empty array",t),nonEmptyArray:t=>Te(j.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Te(j.emptyString(t),"empty string",t),nonEmptyString:t=>Te(j.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Te(j.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Te(j.emptyObject(t),"empty object",t),nonEmptyObject:t=>Te(j.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Te(j.emptySet(t),"empty set",t),nonEmptySet:t=>Te(j.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Te(j.emptyMap(t),"empty map",t),nonEmptyMap:t=>Te(j.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Te(j.propertyKey(t),"PropertyKey",t),formData:t=>Te(j.formData(t),"FormData",t),urlSearchParams:t=>Te(j.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Te(j.evenInteger(t),"even integer",t),oddInteger:t=>Te(j.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Te(j.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Te(j.inRange(t,e),"in range",t),any:(t,...e)=>Te(j.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Te(j.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(j,{class:{value:j.class_},function:{value:j.function_},null:{value:j.null_}});Object.defineProperties(da.assert,{class:{value:da.assert.class_},function:{value:da.assert.function_},null:{value:da.assert.null_}});da.default=j;Dy.exports=j;Dy.exports.default=j;Dy.exports.assert=da.assert});var g3=I((gnt,Ux)=>{"use strict";var Hx=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},Ip=class{static fn(e){return(...r)=>new Ip((i,n,s)=>{r.push(s),e(...r).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,i)=>{this._reject=i;let n=a=>{this._isPending=!1,r(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Hx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Ip.prototype,Promise.prototype);Ux.exports=Ip;Ux.exports.CancelError=Hx});var f3=I((Gx,jx)=>{"use strict";Object.defineProperty(Gx,"__esModule",{value:!0});var hbe=require("tls"),Yx=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let i=typeof r.connect=="function",n=typeof r.secureConnect=="function",s=typeof r.close=="function",o=()=>{i&&r.connect(),t instanceof hbe.TLSSocket&&n&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),s&&t.once("close",r.close)};t.writable&&!t.connecting?o():t.connecting?t.once("connect",o):t.destroyed&&s&&r.close(t._hadError)};Gx.default=Yx;jx.exports=Yx;jx.exports.default=Yx});var h3=I((qx,Jx)=>{"use strict";Object.defineProperty(qx,"__esModule",{value:!0});var pbe=f3(),dbe=Number(process.versions.node.split(".")[0]),Wx=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||dbe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),pbe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?i(t.socket):t.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?n():t.prependOnceListener("finish",n),t.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,r(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};qx.default=Wx;Jx.exports=Wx;Jx.exports.default=Wx});var y3=I((fnt,zx)=>{"use strict";var{V4MAPPED:Cbe,ADDRCONFIG:mbe,ALL:p3,promises:{Resolver:d3},lookup:Ibe}=require("dns"),{promisify:Vx}=require("util"),Ebe=require("os"),Gu=Symbol("cacheableLookupCreateConnection"),_x=Symbol("cacheableLookupInstance"),C3=Symbol("expires"),ybe=typeof p3=="number",m3=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},wbe=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},I3=()=>{let t=!1,e=!1;for(let r of Object.values(Ebe.networkInterfaces()))for(let i of r)if(!i.internal&&(i.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Bbe=t=>Symbol.iterator in t,E3={ttl:!0},Qbe={all:!0},Xx=class{constructor({cache:e=new Map,maxTtl:r=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new d3,lookup:o=Ibe}={}){if(this.maxTtl=r,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Vx(o),this._resolver instanceof d3?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Vx(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Vx(this._resolver.resolve6.bind(this._resolver))),this._iface=I3(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,i){if(typeof r=="function"?(i=r,r={}):typeof r=="number"&&(r={family:r}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(n=>{r.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let i=await this.query(e);if(r.family===6){let n=i.filter(s=>s.family===6);r.hints&Cbe&&(ybe&&r.hints&p3||n.length===0)?wbe(i):i=n}else r.family===4&&(i=i.filter(n=>n.family===4));if(r.hints&mbe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return r.all?i:i[0]}async query(e){let r=await this._cache.get(e);if(!r){let i=this._pending[e];if(i)r=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,r=await n}}return r=r.map(i=>P({},i)),r}async _resolve(e){let r=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,E3),this._resolve6(e,E3)].map(c=>r(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(r){return{entries:[],cacheTtl:0}}}async _set(e,r,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,r[C3]=Date.now()+i;try{await this._cache.set(e,r,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Bbe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Qbe);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let i=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,i),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[C3];n>=a?this._cache.delete(s):a("lookup"in r||(r.lookup=this.lookup),e[Gu](r,i))}uninstall(e){if(m3(e),e[Gu]){if(e[_x]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Gu],delete e[Gu],delete e[_x]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=I3(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};zx.exports=Xx;zx.exports.default=Xx});var Q3=I((hnt,Zx)=>{"use strict";var bbe=typeof URL=="undefined"?require("url").URL:URL,vbe="text/plain",Sbe="us-ascii",w3=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),xbe=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let i=r[1].split(";"),n=r[2],s=e?"":r[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Sbe)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==vbe)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},B3=(t,e)=>{if(e=P({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return xbe(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new bbe(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];w3(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])w3(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};Zx.exports=B3;Zx.exports.default=B3});var S3=I((pnt,b3)=>{b3.exports=v3;function v3(t,e){if(t&&e)return v3(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){r[i]=t[i]}),r;function r(){for(var i=new Array(arguments.length),n=0;n{var x3=S3();$x.exports=x3(Ry);$x.exports.strict=x3(k3);Ry.proto=Ry(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return Ry(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return k3(this)},configurable:!0})});function Ry(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function k3(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var tk=I((Cnt,P3)=>{var kbe=ek(),Pbe=function(){},Dbe=function(t){return t.setHeader&&typeof t.abort=="function"},Rbe=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},D3=function(t,e,r){if(typeof e=="function")return D3(t,null,e);e||(e={}),r=kbe(r||Pbe);var i=t._writableState,n=t._readableState,s=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,a=function(){t.writable||l()},l=function(){o=!1,s||r.call(t)},c=function(){s=!1,o||r.call(t)},u=function(p){r.call(t,p?new Error("exited with error code: "+p):null)},g=function(p){r.call(t,p)},f=function(){if(s&&!(n&&n.ended))return r.call(t,new Error("premature close"));if(o&&!(i&&i.ended))return r.call(t,new Error("premature close"))},h=function(){t.req.on("finish",l)};return Dbe(t)?(t.on("complete",l),t.on("abort",f),t.req?h():t.on("request",h)):o&&!i&&(t.on("end",a),t.on("close",a)),Rbe(t)&&t.on("exit",u),t.on("end",c),t.on("finish",l),e.error!==!1&&t.on("error",g),t.on("close",f),function(){t.removeListener("complete",l),t.removeListener("abort",f),t.removeListener("request",h),t.req&&t.req.removeListener("finish",l),t.removeListener("end",a),t.removeListener("close",a),t.removeListener("finish",l),t.removeListener("exit",u),t.removeListener("end",c),t.removeListener("error",g),t.removeListener("close",f)}};P3.exports=D3});var N3=I((mnt,R3)=>{var Fbe=ek(),Nbe=tk(),rk=require("fs"),Ep=function(){},Lbe=/^v?\.0/.test(process.version),Fy=function(t){return typeof t=="function"},Tbe=function(t){return!Lbe||!rk?!1:(t instanceof(rk.ReadStream||Ep)||t instanceof(rk.WriteStream||Ep))&&Fy(t.close)},Mbe=function(t){return t.setHeader&&Fy(t.abort)},Obe=function(t,e,r,i){i=Fbe(i);var n=!1;t.on("close",function(){n=!0}),Nbe(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Tbe(t))return t.close(Ep);if(Mbe(t))return t.abort();if(Fy(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},F3=function(t){t()},Kbe=function(t,e){return t.pipe(e)},Ube=function(){var t=Array.prototype.slice.call(arguments),e=Fy(t[t.length-1]||Ep)&&t.pop()||Ep;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,i=t.map(function(n,s){var o=s0;return Obe(n,o,a,function(l){r||(r=l),l&&i.forEach(F3),!o&&(i.forEach(F3),e(r))})});return t.reduce(Kbe)};R3.exports=Ube});var T3=I((Int,L3)=>{"use strict";var{PassThrough:Hbe}=require("stream");L3.exports=t=>{t=P({},t);let{array:e}=t,{encoding:r}=t,i=r==="buffer",n=!1;e?n=!(r||i):r=r||"utf8",i&&(r=null);let s=new Hbe({objectMode:n});r&&s.setEncoding(r);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var M3=I((Ent,ju)=>{"use strict";var Gbe=N3(),jbe=T3(),ik=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Ny(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=P({maxBuffer:Infinity},e);let{maxBuffer:r}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=Gbe(t,jbe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>r&&o(new ik)})}),i.getBufferedValue()}ju.exports=Ny;ju.exports.default=Ny;ju.exports.buffer=(t,e)=>Ny(t,_(P({},e),{encoding:"buffer"}));ju.exports.array=(t,e)=>Ny(t,_(P({},e),{array:!0}));ju.exports.MaxBufferError=ik});var K3=I((wnt,O3)=>{"use strict";var Ybe=[200,203,204,206,300,301,404,405,410,414,501],qbe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],Jbe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},Wbe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function nk(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let i of r){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function zbe(t){let e=[];for(let r in t){let i=t[r];e.push(i===!0?r:r+"="+i)}if(!!e.length)return e.join(", ")}O3.exports=class{constructor(e,r,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=nk(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=nk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":zbe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!r.headers["cache-control"]&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&qbe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||Ybe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=nk(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of r)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let i in e)Jbe[i]||(r[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete r[n]}if(r.warning){let i=r.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?r.warning=i.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let r=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(r-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let n=r["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?r["if-none-match"]=n.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),!r||!r.headers)throw Error("Response headers missing");let i=!1;if(r.status!==void 0&&r.status!=304?i=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in r.headers&&!Wbe[o]?r.headers[o]:this._resHeaders[o];let s=Object.assign({},r,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var Ly=I((Bnt,U3)=>{"use strict";U3.exports=t=>{let e={};for(let[r,i]of Object.entries(t))e[r.toLowerCase()]=i;return e}});var j3=I((Qnt,H3)=>{"use strict";var Vbe=require("stream").Readable,_be=Ly(),G3=class extends Vbe{constructor(e,r,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=_be(r),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};H3.exports=G3});var q3=I((bnt,Y3)=>{"use strict";var Xbe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];Y3.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Xbe));for(let i of r)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var W3=I((vnt,J3)=>{"use strict";var Zbe=require("stream").PassThrough,$be=q3(),eve=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Zbe;return $be(t,e),t.pipe(e)};J3.exports=eve});var z3=I(sk=>{sk.stringify=function t(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",i=Array.isArray(e);r=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(r+=","),n=!1,i?e[s]==null?r+="null":r+=t(e[s]):e[s]!==void 0&&(r+=t(s)+":"+t(e[s])))}return r+=i?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};sk.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Z3=I((xnt,V3)=>{"use strict";var tve=require("events"),_3=z3(),rve=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(require(e[r]))(t)}return new Map},X3=class extends tve{constructor(e,r){super();if(this.opts=Object.assign({namespace:"keyv",serialize:_3.stringify,deserialize:_3.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=rve(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return r&&r.raw?n:n.value}})}set(e,r,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return r={value:r,expires:s},this.opts.serialize(r)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};V3.exports=X3});var tW=I((knt,$3)=>{"use strict";var ive=require("events"),Ty=require("url"),nve=Q3(),sve=M3(),ok=K3(),eW=j3(),ove=Ly(),ave=W3(),Ave=Z3(),yo=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Ave({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,i)=>{let n;if(typeof r=="string")n=ak(Ty.parse(r)),r={};else if(r instanceof Ty.URL)n=ak(Ty.parse(r.toString())),r={};else{let[g,...f]=(r.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=ak(_(P({},r),{pathname:g,search:h}))}r=P(P({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},r),lve(n)),r.headers=ove(r.headers);let s=new ive,o=nve(Ty.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${r.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(m=>{h=()=>{f||(f=!0,m())}}),d=m=>{if(l&&!g.forceRefresh){m.status=m.statusCode;let B=ok.fromObject(l.cachePolicy).revalidatedPolicy(g,m);if(!B.modified){let b=B.policy.responseHeaders();m=new eW(l.statusCode,b,l.body,l.url),m.cachePolicy=B.policy,m.fromCache=!0}}m.fromCache||(m.cachePolicy=new ok(g,m,g),m.fromCache=!1);let E;g.cache&&m.cachePolicy.storable()?(E=ave(m),(async()=>{try{let B=sve.buffer(m);if(await Promise.race([p,new Promise(L=>m.once("end",L))]),f)return;let b=await B,R={cachePolicy:m.cachePolicy.toObject(),url:m.url,statusCode:m.fromCache?l.statusCode:m.statusCode,body:b},H=g.strictTtl?m.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,R,H)}catch(B){s.emit("error",new yo.CacheError(B))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(B){s.emit("error",new yo.CacheError(B))}})(),s.emit("response",E||m),typeof i=="function"&&i(E||m)};try{let m=e(g,d);m.once("error",h),m.once("abort",h),s.emit("request",m)}catch(m){s.emit("error",new yo.RequestError(m))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let d=ok.fromObject(p.cachePolicy);if(d.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let m=d.responseHeaders(),E=new eW(p.statusCode,m,p.body,p.url);E.cachePolicy=d,E.fromCache=!0,s.emit("response",E),typeof i=="function"&&i(E)}else l=p,h.headers=d.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new yo.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(r)}catch(h){r.automaticFailover&&!c&&u(r),s.emit("error",new yo.CacheError(h))}})(),s}}};function lve(t){let e=P({},t);return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function ak(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}yo.RequestError=class extends Error{constructor(t){super(t.message);this.name="RequestError",Object.assign(this,t)}};yo.CacheError=class extends Error{constructor(t){super(t.message);this.name="CacheError",Object.assign(this,t)}};$3.exports=yo});var iW=I((Pnt,rW)=>{"use strict";var cve=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];rW.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(cve)),i={};for(let n of r)n in e||(i[n]={get(){let s=t[n];return typeof s=="function"?s.bind(t):s},set(s){t[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var sW=I((Dnt,nW)=>{"use strict";var{Transform:uve,PassThrough:gve}=require("stream"),Ak=require("zlib"),fve=iW();nW.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof Ak.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let i=!0,n=new uve({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new gve({autoDestroy:!1,destroy(a,l){t.destroy(),l(a)}}),o=r?Ak.createBrotliDecompress():Ak.createUnzip();return o.once("error",a=>{if(i&&!t.readable){s.end();return}s.destroy(a)}),fve(t,s),t.pipe(n).pipe(o).pipe(s),s}});var lk=I((Rnt,oW)=>{"use strict";var aW=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};oW.exports=aW});var uk=I((Fnt,AW)=>{"use strict";var hve=require("events"),pve=require("tls"),dve=require("http2"),Cve=lk(),_i=Symbol("currentStreamsCount"),lW=Symbol("request"),ns=Symbol("cachedOriginSet"),Yu=Symbol("gracefullyClosing"),mve=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Ive=(t,e,r)=>{let i=0,n=t.length;for(;i>>1;r(t[s],e)?i=s+1:n=s}return i},Eve=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,ck=(t,e)=>{for(let r of t)r[ns].lengthe[ns].includes(i))&&r[_i]+e[_i]<=e.remoteSettings.maxConcurrentStreams&&cW(r)},yve=(t,e)=>{for(let r of t)e[ns].lengthr[ns].includes(i))&&e[_i]+r[_i]<=r.remoteSettings.maxConcurrentStreams&&cW(e)},uW=({agent:t,isFree:e})=>{let r={};for(let i in t.sessions){let s=t.sessions[i].filter(o=>{let a=o[ma.kCurrentStreamsCount]{t[Yu]=!0,t[_i]===0&&t.close()},ma=class extends hve{constructor({timeout:e=6e4,maxSessions:r=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Cve({maxSize:n})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let i of mve)e[i]&&(r+=`:${e[i]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let i=this.queue[e][r];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(r),a=ma.normalizeOrigin(e,r&&r.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let d=p.remoteSettings.maxConcurrentStreams;if(d=d||p[Yu]||p.destroyed)continue;h||(g=d),m>f&&(h=p,f=m)}}if(h){if(i.length!==1){for(let{reject:p}of i){let d=new Error(`Expected the length of listeners to be 1, got ${i.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);p(d)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=dve.connect(e,P({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},r));f[_i]=0,f[Yu]=!1;let h=()=>f[_i]{this.tlsSessionCache.set(u,m)}),f.once("error",m=>{for(let{reject:E}of i)E(m);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let m=this.sessions[o];m.splice(m.indexOf(f),1),m.length===0&&delete this.sessions[o]}else{let m=new Error("Session closed without receiving a SETTINGS frame");m.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:E}of i)E(m);l()}this._tryToCreateNewSession(o,a)});let d=()=>{if(!(!(o in this.queue)||!h())){for(let m of f[ns])if(m in this.queue[o]){let{listeners:E}=this.queue[o][m];for(;E.length!==0&&h();)E.shift().resolve(f);let B=this.queue[o];if(B[m].listeners.length===0&&(delete B[m],Object.keys(B).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[ns]=f.originSet,!!h()&&(d(),ck(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let m=new Error("Agent has been destroyed");for(let E of i)E.reject(m);f.destroy();return}f[ns]=f.originSet;{let m=this.sessions;if(o in m){let E=m[o];E.splice(Ive(E,f,Eve),0,f)}else m[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),d(),l(),f[_i]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,r,i),i.length=0),f.on("remoteSettings",()=>{d(),ck(this.sessions[o],f)})}),f[lW]=f.request,f.request=(m,E)=>{if(f[Yu])throw new Error("The session is gracefully closing. No new streams are allowed.");let B=f[lW](m,E);return f.ref(),++f[_i],f[_i]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,B.once("close",()=>{if(p=h(),--f[_i],!f.destroyed&&!f.closed&&(yve(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let b=f[_i]===0;b&&f.unref(),b&&(this._freeSessionsCount>this.maxFreeSessions||f[Yu])?f.close():(ck(this.sessions[o],f),d())}}),B}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,r,i,n){return new Promise((s,o)=>{this.getSession(e,r,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,r){return ma.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof r.servername=="undefined"&&(r.servername=n),pve.connect(i,n,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[_i]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let i of r)i.destroy(e);for(let r of Object.values(this.queue))for(let i of Object.values(r))i.destroyed=!0;this.queue={}}get freeSessions(){return uW({agent:this,isFree:!0})}get busySessions(){return uW({agent:this,isFree:!1})}};ma.kCurrentStreamsCount=_i;ma.kGracefullyClosing=Yu;AW.exports={Agent:ma,globalAgent:new ma}});var gk=I((Nnt,gW)=>{"use strict";var{Readable:wve}=require("stream"),fW=class extends wve{constructor(e,r){super({highWaterMark:r,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};gW.exports=fW});var fk=I((Lnt,hW)=>{"use strict";hW.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var dW=I((Tnt,pW)=>{"use strict";pW.exports=(t,e,r)=>{for(let i of r)t.on(i,(...n)=>e.emit(i,...n))}});var mW=I((Mnt,CW)=>{"use strict";CW.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var EW=I((Knt,IW)=>{"use strict";var qu=(t,e,r)=>{IW.exports[e]=class extends t{constructor(...n){super(typeof r=="string"?r:r(n));this.name=`${super.name} [${e}]`,this.code=e}}};qu(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],i=Array.isArray(r);return i&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${i?"one of":"of"} type ${r}. Received ${typeof t[2]}`});qu(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);qu(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);qu(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);qu(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);qu(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var Ck=I((Unt,yW)=>{"use strict";var Bve=require("http2"),{Writable:Qve}=require("stream"),{Agent:wW,globalAgent:bve}=uk(),vve=gk(),Sve=fk(),xve=dW(),kve=mW(),{ERR_INVALID_ARG_TYPE:hk,ERR_INVALID_PROTOCOL:Pve,ERR_HTTP_HEADERS_SENT:BW,ERR_INVALID_HTTP_TOKEN:Dve,ERR_HTTP_INVALID_HEADER_VALUE:Rve,ERR_INVALID_CHAR:Fve}=EW(),{HTTP2_HEADER_STATUS:QW,HTTP2_HEADER_METHOD:bW,HTTP2_HEADER_PATH:vW,HTTP2_METHOD_CONNECT:Nve}=Bve.constants,Pi=Symbol("headers"),pk=Symbol("origin"),dk=Symbol("session"),SW=Symbol("options"),My=Symbol("flushedHeaders"),yp=Symbol("jobs"),Lve=/^[\^`\-\w!#$%&*+.|~]+$/,Tve=/[^\t\u0020-\u007E\u0080-\u00FF]/,xW=class extends Qve{constructor(e,r,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Sve(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(i=r,r=n?e:P({},e)):r=P(P({},e),r),r.h2session)this[dk]=r.h2session;else if(r.agent===!1)this.agent=new wW({maxFreeSessions:0});else if(typeof r.agent=="undefined"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new wW({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=bve;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new hk("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Pve(r.protocol,"https:");let s=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,o=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:a}=r;if(r.timeout=void 0,this[Pi]=Object.create(null),this[yp]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[l,c]of Object.entries(r.headers))this.setHeader(l,c);r.auth&&!("authorization"in this[Pi])&&(this[Pi].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[SW]=r,s===443?(this[pk]=`https://${o}`,":authority"in this[Pi]||(this[Pi][":authority"]=o)):(this[pk]=`https://${o}:${s}`,":authority"in this[Pi]||(this[Pi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[My]=!1}get method(){return this[Pi][bW]}set method(e){e&&(this[Pi][bW]=e.toUpperCase())}get path(){return this[Pi][vW]}set path(e){e&&(this[Pi][vW]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,r,i);this._request?n():this[yp].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[yp].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[My]||this.destroyed)return;this[My]=!0;let e=this.method===Nve,r=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||xve(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new vve(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[QW],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[QW]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[yp])o();this.emit("socket",this.socket)};if(this[dk])try{r(this[dk].request(this[Pi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[pk],this[SW],this[Pi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new hk("name","string",e);return this[Pi][e.toLowerCase()]}get headersSent(){return this[My]}removeHeader(e){if(typeof e!="string")throw new hk("name","string",e);if(this.headersSent)throw new BW("remove");delete this[Pi][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new BW("set");if(typeof e!="string"||!Lve.test(e)&&!kve(e))throw new Dve("Header name",e);if(typeof r=="undefined")throw new Rve(r,e);if(Tve.test(r))throw new Fve("header content",e);this[Pi][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let i=()=>this._request.setTimeout(e,r);return this._request?i():this[yp].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};yW.exports=xW});var PW=I((Hnt,kW)=>{"use strict";var Mve=require("tls");kW.exports=(t={})=>new Promise((e,r)=>{let i=Mve.connect(t,()=>{t.resolveSocket?(i.off("error",r),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})});var RW=I((Gnt,DW)=>{"use strict";var Ove=require("net");DW.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Ove.isIP(e)?"":e}});var LW=I((jnt,mk)=>{"use strict";var FW=require("http"),Ik=require("https"),Kve=PW(),Uve=lk(),Hve=Ck(),Gve=RW(),jve=fk(),Oy=new Uve({maxSize:100}),wp=new Map,NW=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{t.emit("free",e,r)};e.on("free",i);let n=()=>{t.removeSocket(e,r)};e.on("close",n);let s=()=>{t.removeSocket(e,r),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),t.emit("free",e,r)},Yve=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Oy.has(e)){if(wp.has(e))return(await wp.get(e)).alpnProtocol;let{path:r,agent:i}=t;t.path=t.socketPath;let n=Kve(t);wp.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Oy.set(e,o),t.path=r,o==="h2")s.destroy();else{let{globalAgent:a}=Ik,l=Ik.Agent.prototype.createConnection;i?i.createConnection===l?NW(i,s,t):s.destroy():a.createConnection===l?NW(a,s,t):s.destroy()}return wp.delete(e),o}catch(s){throw wp.delete(e),s}}return Oy.get(e)};mk.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=jve(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e=_(P(P({ALPNProtocols:["h2","http/1.1"]},t),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Gve(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Ik.globalAgent:FW.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await Yve(e)==="h2"?(n&&(e.agent=n.http2),new Hve(e,r)):FW.request(e,r)};mk.exports.protocolCache=Oy});var MW=I((Ynt,TW)=>{"use strict";var qve=require("http2"),Jve=uk(),Ek=Ck(),Wve=gk(),zve=LW(),Vve=(t,e,r)=>new Ek(t,e,r),_ve=(t,e,r)=>{let i=new Ek(t,e,r);return i.end(),i};TW.exports=_(P(_(P({},qve),{ClientRequest:Ek,IncomingMessage:Wve}),Jve),{request:Vve,get:_ve,auto:zve})});var wk=I(yk=>{"use strict";Object.defineProperty(yk,"__esModule",{value:!0});var OW=Ca();yk.default=t=>OW.default.nodeStream(t)&&OW.default.function_(t.getBoundary)});var GW=I(Bk=>{"use strict";Object.defineProperty(Bk,"__esModule",{value:!0});var KW=require("fs"),UW=require("util"),HW=Ca(),Xve=wk(),Zve=UW.promisify(KW.stat);Bk.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(HW.default.string(t))return Buffer.byteLength(t);if(HW.default.buffer(t))return t.length;if(Xve.default(t))return UW.promisify(t.getLength.bind(t))();if(t instanceof KW.ReadStream){let{size:r}=await Zve(t.path);return r===0?void 0:r}}});var bk=I(Qk=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});function $ve(t,e,r){let i={};for(let n of r)i[n]=(...s)=>{e.emit(n,...s)},t.on(n,i[n]);return()=>{for(let n of r)t.off(n,i[n])}}Qk.default=$ve});var jW=I(vk=>{"use strict";Object.defineProperty(vk,"__esModule",{value:!0});vk.default=()=>{let t=[];return{once(e,r,i){e.once(r,i),t.push({origin:e,event:r,fn:i})},unhandleAll(){for(let e of t){let{origin:r,event:i,fn:n}=e;r.removeListener(i,n)}t.length=0}}}});var qW=I(Bp=>{"use strict";Object.defineProperty(Bp,"__esModule",{value:!0});Bp.TimeoutError=void 0;var eSe=require("net"),tSe=jW(),YW=Symbol("reentry"),rSe=()=>{},Sk=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`);this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};Bp.TimeoutError=Sk;Bp.default=(t,e,r)=>{if(YW in t)return rSe;t[YW]=!0;let i=[],{once:n,unhandleAll:s}=tSe.default(),o=(g,f,h)=>{var p;let d=setTimeout(f,g,g,h);(p=d.unref)===null||p===void 0||p.call(d);let m=()=>{clearTimeout(d)};return i.push(m),m},{host:a,hostname:l}=r,c=(g,f)=>{t.destroy(new Sk(g,f))},u=()=>{for(let g of i)g();s()};if(t.once("error",g=>{if(u(),t.listenerCount("error")===0)throw g}),t.once("close",u),n(t,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};t.setTimeout(e.socket,g),i.push(()=>{t.removeListener("timeout",g)})}return n(t,"socket",g=>{var f;let{socketPath:h}=t;if(g.connecting){let p=Boolean(h!=null?h:eSe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let d=o(e.lookup,c,"lookup");n(g,"lookup",d)}if(typeof e.connect!="undefined"){let d=()=>o(e.connect,c,"connect");p?n(g,"connect",d()):n(g,"lookup",m=>{m===null&&n(g,"connect",d())})}typeof e.secureConnect!="undefined"&&r.protocol==="https:"&&n(g,"connect",()=>{let d=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",d)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(t,"upload-complete",p())}):n(t,"upload-complete",p())}}),typeof e.response!="undefined"&&n(t,"upload-complete",()=>{let g=o(e.response,c,"response");n(t,"response",g)}),u}});var WW=I(xk=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var JW=Ca();xk.default=t=>{t=t;let e={protocol:t.protocol,hostname:JW.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return JW.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var zW=I(kk=>{"use strict";Object.defineProperty(kk,"__esModule",{value:!0});var iSe=require("url"),nSe=["protocol","host","hostname","port","pathname","search"];kk.default=(t,e)=>{var r,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(i=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&i!==void 0?i:""}`}let n=new iSe.URL(t);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of nSe)e[s]&&(n[s]=e[s].toString());return n}});var _W=I(Pk=>{"use strict";Object.defineProperty(Pk,"__esModule",{value:!0});var VW=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};Pk.default=VW});var Rk=I(Dk=>{"use strict";Object.defineProperty(Dk,"__esModule",{value:!0});var sSe=async t=>{let e=[],r=0;for await(let i of t)e.push(i),r+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};Dk.default=sSe});var ZW=I(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});ql.dnsLookupIpVersionToFamily=ql.isDnsLookupIpVersion=void 0;var XW={auto:0,ipv4:4,ipv6:6};ql.isDnsLookupIpVersion=t=>t in XW;ql.dnsLookupIpVersionToFamily=t=>{if(ql.isDnsLookupIpVersion(t))return XW[t];throw new Error("Invalid DNS lookup IP version")}});var Fk=I(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.isResponseOk=void 0;Ky.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var e8=I(Nk=>{"use strict";Object.defineProperty(Nk,"__esModule",{value:!0});var $W=new Set;Nk.default=t=>{$W.has(t)||($W.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var t8=I(Lk=>{"use strict";Object.defineProperty(Lk,"__esModule",{value:!0});var ar=Ca(),oSe=(t,e)=>{if(ar.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");ar.assert.any([ar.default.string,ar.default.undefined],t.encoding),ar.assert.any([ar.default.boolean,ar.default.undefined],t.resolveBodyOnly),ar.assert.any([ar.default.boolean,ar.default.undefined],t.methodRewriting),ar.assert.any([ar.default.boolean,ar.default.undefined],t.isStream),ar.assert.any([ar.default.string,ar.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry=P({},e.retry):t.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},ar.default.object(r)?(t.retry=P(P({},t.retry),r),t.retry.methods=[...new Set(t.retry.methods.map(i=>i.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):ar.default.number(r)&&(t.retry.limit=r),ar.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(ar.default.number))),ar.default.object(t.pagination)){e&&(t.pagination=P(P({},e.pagination),t.pagination));let{pagination:i}=t;if(!ar.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!ar.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!ar.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!ar.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};Lk.default=oSe});var r8=I(Qp=>{"use strict";Object.defineProperty(Qp,"__esModule",{value:!0});Qp.retryAfterStatusCodes=void 0;Qp.retryAfterStatusCodes=new Set([413,429,503]);var aSe=({attemptCount:t,retryOptions:e,error:r,retryAfter:i})=>{if(t>e.limit)return 0;let n=e.methods.includes(r.options.method),s=e.errorCodes.includes(r.code),o=r.response&&e.statusCodes.includes(r.response.statusCode);if(!n||!s&&!o)return 0;if(r.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(r.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(t-1)*1e3+a};Qp.default=aSe});var vp=I(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});Rt.UnsupportedProtocolError=Rt.ReadError=Rt.TimeoutError=Rt.UploadError=Rt.CacheError=Rt.HTTPError=Rt.MaxRedirectsError=Rt.RequestError=Rt.setNonEnumerableProperties=Rt.knownHookEvents=Rt.withoutBody=Rt.kIsNormalizedAlready=void 0;var i8=require("util"),n8=require("stream"),ASe=require("fs"),dA=require("url"),s8=require("http"),Tk=require("http"),lSe=require("https"),cSe=h3(),uSe=y3(),o8=tW(),gSe=sW(),fSe=MW(),hSe=Ly(),ce=Ca(),pSe=GW(),a8=wk(),dSe=bk(),A8=qW(),CSe=WW(),l8=zW(),mSe=_W(),ISe=Rk(),c8=ZW(),ESe=Fk(),CA=e8(),ySe=t8(),wSe=r8(),Mk,Ii=Symbol("request"),Uy=Symbol("response"),Ju=Symbol("responseSize"),Wu=Symbol("downloadedSize"),zu=Symbol("bodySize"),Vu=Symbol("uploadedSize"),Hy=Symbol("serverResponsesPiped"),u8=Symbol("unproxyEvents"),g8=Symbol("isFromCache"),Ok=Symbol("cancelTimeouts"),f8=Symbol("startedReading"),_u=Symbol("stopReading"),Gy=Symbol("triggerRead"),mA=Symbol("body"),bp=Symbol("jobs"),h8=Symbol("originalResponse"),p8=Symbol("retryTimeout");Rt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var BSe=ce.default.string(process.versions.brotli);Rt.withoutBody=new Set(["GET","HEAD"]);Rt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function QSe(t){for(let e in t){let r=t[e];if(!ce.default.string(r)&&!ce.default.number(r)&&!ce.default.boolean(r)&&!ce.default.null_(r)&&!ce.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function bSe(t){return ce.default.object(t)&&!("statusCode"in t)}var Kk=new mSe.default,vSe=async t=>new Promise((e,r)=>{let i=n=>{r(n)};t.pending||e(),t.once("error",i),t.once("ready",()=>{t.off("error",i),e()})}),SSe=new Set([300,301,302,303,304,307,308]),xSe=["context","body","json","form"];Rt.setNonEnumerableProperties=(t,e)=>{let r={};for(let i of t)if(!!i)for(let n of xSe)n in i&&(r[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,r)};var _r=class extends Error{constructor(e,r,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,i instanceof Uk?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Uy]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,ce.default.string(r.stack)&&ce.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` +`).reverse(),a=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` +`)}${a.reverse().join(` +`)}`}}};Rt.RequestError=_r;var Hk=class extends _r{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};Rt.MaxRedirectsError=Hk;var Gk=class extends _r{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};Rt.HTTPError=Gk;var jk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="CacheError"}};Rt.CacheError=jk;var Yk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="UploadError"}};Rt.UploadError=Yk;var qk=class extends _r{constructor(e,r,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=r}};Rt.TimeoutError=qk;var jy=class extends _r{constructor(e,r){super(e.message,e,r);this.name="ReadError"}};Rt.ReadError=jy;var Jk=class extends _r{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};Rt.UnsupportedProtocolError=Jk;var kSe=["socket","connect","continue","information","upgrade","timeout"],Uk=class extends n8.Duplex{constructor(e,r={},i){super({autoDestroy:!1,highWaterMark:0});this[Wu]=0,this[Vu]=0,this.requestInitialized=!1,this[Hy]=new Set,this.redirects=[],this[_u]=!1,this[Gy]=!1,this[bp]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof Tk.IncomingMessage&&(this.options.headers=P(P({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=r;if((o||a||l)&&this._lockWrite(),Rt.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,i)}catch(c){ce.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof ASe.ReadStream&&await vSe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Ii])===null||c===void 0||c.destroy();return}for(let g of this[bp])g();this[bp].length=0,this.requestInitialized=!0}catch(u){if(u instanceof _r){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,r,i){var n,s,o,a,l;let c=r;if(ce.default.object(e)&&!ce.default.urlInstance(e))r=P(P(P({},i),e),r);else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r=P(P({},i),r),e!==void 0&&(r.url=e),ce.default.urlInstance(r.url)&&(r.url=new dA.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),ce.assert.any([ce.default.string,ce.default.undefined],r.method),ce.assert.any([ce.default.object,ce.default.undefined],r.headers),ce.assert.any([ce.default.string,ce.default.urlInstance,ce.default.undefined],r.prefixUrl),ce.assert.any([ce.default.object,ce.default.undefined],r.cookieJar),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.searchParams),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.cache),ce.assert.any([ce.default.object,ce.default.number,ce.default.undefined],r.timeout),ce.assert.any([ce.default.object,ce.default.undefined],r.context),ce.assert.any([ce.default.object,ce.default.undefined],r.hooks),ce.assert.any([ce.default.boolean,ce.default.undefined],r.decompress),ce.assert.any([ce.default.boolean,ce.default.undefined],r.ignoreInvalidCookies),ce.assert.any([ce.default.boolean,ce.default.undefined],r.followRedirect),ce.assert.any([ce.default.number,ce.default.undefined],r.maxRedirects),ce.assert.any([ce.default.boolean,ce.default.undefined],r.throwHttpErrors),ce.assert.any([ce.default.boolean,ce.default.undefined],r.http2),ce.assert.any([ce.default.boolean,ce.default.undefined],r.allowGetBody),ce.assert.any([ce.default.string,ce.default.undefined],r.localAddress),ce.assert.any([c8.isDnsLookupIpVersion,ce.default.undefined],r.dnsLookupIpVersion),ce.assert.any([ce.default.object,ce.default.undefined],r.https),ce.assert.any([ce.default.boolean,ce.default.undefined],r.rejectUnauthorized),r.https&&(ce.assert.any([ce.default.boolean,ce.default.undefined],r.https.rejectUnauthorized),ce.assert.any([ce.default.function_,ce.default.undefined],r.https.checkServerIdentity),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificateAuthority),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.key),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificate),ce.assert.any([ce.default.string,ce.default.undefined],r.https.passphrase),ce.assert.any([ce.default.string,ce.default.buffer,ce.default.array,ce.default.undefined],r.https.pfx)),ce.assert.any([ce.default.object,ce.default.undefined],r.cacheOptions),ce.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(i==null?void 0:i.headers)?r.headers=P({},r.headers):r.headers=hSe(P(P({},i==null?void 0:i.headers),r.headers)),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(i==null?void 0:i.searchParams)){let h;if(ce.default.string(r.searchParams)||r.searchParams instanceof dA.URLSearchParams)h=new dA.URLSearchParams(r.searchParams);else{QSe(r.searchParams),h=new dA.URLSearchParams;for(let p in r.searchParams){let d=r.searchParams[p];d===null?h.append(p,""):d!==void 0&&h.append(p,d)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,d)=>{h.has(d)||h.append(d,p)}),r.searchParams=h}if(r.username=(s=r.username)!==null&&s!==void 0?s:"",r.password=(o=r.password)!==null&&o!==void 0?o:"",ce.default.undefined(r.prefixUrl)?r.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),ce.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=l8.default(r.prefixUrl+r.url,r)}else(ce.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=l8.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:h}=r;Object.defineProperty(r,"prefixUrl",{set:d=>{let m=r.url;if(!m.href.startsWith(d))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${d}: ${m.href}`);r.url=new dA.URL(d+m.href.slice(h.length)),h=d},get:()=>h});let{protocol:p}=r.url;if(p==="unix:"&&(p="http:",r.url=new dA.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),p!=="http:"&&p!=="https:")throw new Jk(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:u}=r;if(u){let{setCookie:h,getCookieString:p}=u;ce.assert.function_(h),ce.assert.function_(p),h.length===4&&p.length===0&&(h=i8.promisify(h.bind(r.cookieJar)),p=i8.promisify(p.bind(r.cookieJar)),r.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=r;if(g&&(Kk.has(g)||Kk.set(g,new o8((h,p)=>{let d=h[Ii](h,p);return ce.default.promise(d)&&(d.once=(m,E)=>{if(m==="error")d.catch(E);else if(m==="abort")(async()=>{try{(await d).once("abort",E)}catch(B){}})();else throw new Error(`Unknown HTTP2 promise event: ${m}`);return d}),d},g))),r.cacheOptions=P({},r.cacheOptions),r.dnsCache===!0)Mk||(Mk=new uSe.default),r.dnsCache=Mk;else if(!ce.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${ce.default(r.dnsCache)}`);ce.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout=P(P({},i.timeout),r.timeout):r.timeout=P({},r.timeout),r.context||(r.context={});let f=r.hooks===(i==null?void 0:i.hooks);r.hooks=P({},r.hooks);for(let h of Rt.knownHookEvents)if(h in r.hooks)if(ce.default.array(r.hooks[h]))r.hooks[h]=[...r.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${ce.default(r.hooks[h])}`);else r.hooks[h]=[];if(i&&!f)for(let h of Rt.knownHookEvents)i.hooks[h].length>0&&(r.hooks[h]=[...i.hooks[h],...r.hooks[h]]);if("family"in r&&CA.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(r.https=P(P({},i.https),r.https)),"rejectUnauthorized"in r&&CA.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&CA.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&CA.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&CA.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&CA.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&CA.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&CA.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let h in r.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return r.maxRedirects=(l=r.maxRedirects)!==null&&l!==void 0?l:0,Rt.setNonEnumerableProperties([i,c],r),ySe.default(r,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,i=!ce.default.undefined(e.form),n=!ce.default.undefined(e.json),s=!ce.default.undefined(e.body),o=i||n||s,a=Rt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof n8.Readable)&&!ce.default.string(e.body)&&!ce.default.buffer(e.body)&&!a8.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!ce.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!ce.default.string(r["content-type"]);s?(a8.default(e.body)&&l&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[mA]=e.body):i?(l&&(r["content-type"]="application/x-www-form-urlencoded"),this[mA]=new dA.URLSearchParams(e.form).toString()):(l&&(r["content-type"]="application/json"),this[mA]=e.stringifyJson(e.json));let c=await pSe.default(this[mA],e.headers);ce.default.undefined(r["content-length"])&&ce.default.undefined(r["transfer-encoding"])&&!a&&!ce.default.undefined(c)&&(r["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[zu]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:i}=r;this[h8]=e,r.decompress&&(e=gSe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:s8.STATUS_CODES[n],s.url=r.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[g8]=s.isFromCache,this[Ju]=Number(e.headers["content-length"])||void 0,this[Uy]=e,e.once("end",()=>{this[Ju]=this[Wu],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new jy(a,this))}),e.once("aborted",()=>{this._beforeError(new jy({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(ce.default.object(r.cookieJar)&&o){let a=o.map(async l=>r.cookieJar.setCookie(l,i.toString()));r.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(r.followRedirect&&e.headers.location&&SSe.has(n)){if(e.resume(),this[Ii]&&(this[Ok](),delete this[Ii],this[u8]()),(n===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[mA]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new Hk(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new dA.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(c.username=r.username,c.password=r.password),this.redirects.push(u),r.url=c;for(let g of r.hooks.beforeRedirect)await g(r,s);this.emit("redirect",s,r),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(r.isStream&&r.throwHttpErrors&&!ESe.isResponseOk(s)){this._beforeError(new Gk(s));return}e.on("readable",()=>{this[Gy]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Hy])if(!a.headersSent){for(let l in e.headers){let c=r.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:i,url:n}=r;cSe.default(e),this[Ok]=A8.default(e,i,n);let s=r.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof A8.TimeoutError?new qk(l,this.timings,this):new _r(l.message,l,this),this._beforeError(l)}),this[u8]=dSe.default(e,this,kSe),this[Ii]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[mA],a=this.redirects.length===0?this:e;ce.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new Yk(l,this))})):(this._unlockWrite(),ce.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((i,n)=>{Object.assign(r,CSe.default(e)),delete r.url;let s,o=Kk.get(r.cache)(r,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});r.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,r,i,n,s;let{options:o}=this,{headers:a}=o;for(let E in a)if(ce.default.undefined(a[E]))delete a[E];else if(ce.default.null_(a[E]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${E}\` header`);if(o.decompress&&ce.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=BSe?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let E=await o.cookieJar.getCookieString(o.url.toString());ce.default.nonEmptyString(E)&&(o.headers.cookie=E)}for(let E of o.hooks.beforeRequest){let B=await E(o);if(!ce.default.undefined(B)){o.request=()=>B;break}}o.body&&this[mA]!==o.body&&(this[mA]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let E=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(E==null?void 0:E.groups){let{socketPath:B,path:b}=E.groups;Object.assign(o,{socketPath:B,path:b,host:""})}}let f=g.protocol==="https:",h;o.http2?h=fSe.auto:h=f?lSe.request:s8.request;let p=(e=o.request)!==null&&e!==void 0?e:h,d=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Ii]=p,delete o.request,delete o.timeout;let m=o;if(m.shared=(r=o.cacheOptions)===null||r===void 0?void 0:r.shared,m.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,m.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,m.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{m.family=c8.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(E){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(m.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(m.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(m.ca=o.https.certificateAuthority),o.https.certificate&&(m.cert=o.https.certificate),o.https.key&&(m.key=o.https.key),o.https.passphrase&&(m.passphrase=o.https.passphrase),o.https.pfx&&(m.pfx=o.https.pfx));try{let E=await d(g,m);ce.default.undefined(E)&&(E=h(g,m)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete m.rejectUnauthorized,o.https.checkServerIdentity&&delete m.checkServerIdentity,o.https.certificateAuthority&&delete m.ca,o.https.certificate&&delete m.cert,o.https.key&&delete m.key,o.https.passphrase&&delete m.passphrase,o.https.pfx&&delete m.pfx),bSe(E)?this._onRequest(E):this.writable?(this.once("finish",()=>{this._onResponse(E)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(E)}catch(E){throw E instanceof o8.CacheError?new jk(E,this):new _r(E.message,E,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new _r(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[_u])return;let{options:r}=this,i=this.retryCount+1;this[_u]=!0,e instanceof _r||(e=new _r(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await ISe.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await r.retry.calculateDelay({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:wSe.default({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new _r(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new _r(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[p8]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Gy]=!0;let e=this[Uy];if(e&&!this[_u]){e.readableLength&&(this[Gy]=!1);let r;for(;(r=e.read())!==null;){this[Wu]+=r.length,this[f8]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(r)}}}_write(e,r,i){let n=()=>{this._writeRequest(e,r,i)};this.requestInitialized?n():this[bp].push(n)}_writeRequest(e,r,i){this[Ii].destroyed||(this._progressCallbacks.push(()=>{this[Vu]+=Buffer.byteLength(e,r);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Ii].write(e,r,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ii in this)){e();return}if(this[Ii].destroyed){e();return}this[Ii].end(i=>{i||(this[zu]=this[Vu],this.emit("uploadProgress",this.uploadProgress),this[Ii].emit("upload-complete")),e(i)})};this.requestInitialized?r():this[bp].push(r)}_destroy(e,r){var i;this[_u]=!0,clearTimeout(this[p8]),Ii in this&&(this[Ok](),((i=this[Uy])===null||i===void 0?void 0:i.complete)||this[Ii].destroy()),e!==null&&!ce.default.undefined(e)&&!(e instanceof _r)&&(e=new _r(e.message,e,this)),r(e)}get _isAboutToError(){return this[_u]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,i;return((r=(e=this[Ii])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!((i=this[h8])===null||i===void 0?void 0:i.complete)}get socket(){var e,r;return(r=(e=this[Ii])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[Ju]?e=this[Wu]/this[Ju]:this[Ju]===this[Wu]?e=1:e=0,{percent:e,transferred:this[Wu],total:this[Ju]}}get uploadProgress(){let e;return this[zu]?e=this[Vu]/this[zu]:this[zu]===this[Vu]?e=1:e=0,{percent:e,transferred:this[Vu],total:this[zu]}}get timings(){var e;return(e=this[Ii])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[g8]}pipe(e,r){if(this[f8])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof Tk.ServerResponse&&this[Hy].add(e),super.pipe(e,r)}unpipe(e){return e instanceof Tk.ServerResponse&&this[Hy].delete(e),super.unpipe(e),this}};Rt.default=Uk});var Sp=I(Ms=>{"use strict";var PSe=Ms&&Ms.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),DSe=Ms&&Ms.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&PSe(e,t,r)};Object.defineProperty(Ms,"__esModule",{value:!0});Ms.CancelError=Ms.ParseError=void 0;var d8=vp(),C8=class extends d8.RequestError{constructor(e,r){let{options:i}=r.request;super(`${e.message} in "${i.url.toString()}"`,e,r.request);this.name="ParseError"}};Ms.ParseError=C8;var m8=class extends d8.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Ms.CancelError=m8;DSe(vp(),Ms)});var E8=I(Wk=>{"use strict";Object.defineProperty(Wk,"__esModule",{value:!0});var I8=Sp(),RSe=(t,e,r,i)=>{let{rawBody:n}=t;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":r(n.toString());if(e==="buffer")return n;throw new I8.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(s){throw new I8.ParseError(s,t)}};Wk.default=RSe});var zk=I(IA=>{"use strict";var FSe=IA&&IA.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),NSe=IA&&IA.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&FSe(e,t,r)};Object.defineProperty(IA,"__esModule",{value:!0});var LSe=require("events"),TSe=Ca(),MSe=g3(),Yy=Sp(),y8=E8(),w8=vp(),OSe=bk(),KSe=Rk(),B8=Fk(),USe=["request","response","redirect","uploadProgress","downloadProgress"];function Q8(t){let e,r,i=new LSe.EventEmitter,n=new MSe((o,a,l)=>{let c=u=>{let g=new w8.default(void 0,t);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Yy.CancelError(g))),e=g,g.once("response",async p=>{var d;if(p.retryCount=u,p.request.aborted)return;let m;try{m=await KSe.default(g),p.rawBody=m}catch(R){return}if(g._isAboutToError)return;let E=((d=p.headers["content-encoding"])!==null&&d!==void 0?d:"").toLowerCase(),B=["gzip","deflate","br"].includes(E),{options:b}=g;if(B&&!b.decompress)p.body=m;else try{p.body=y8.default(p,b.responseType,b.parseJson,b.encoding)}catch(R){if(p.body=m.toString(),B8.isResponseOk(p)){g._beforeError(R);return}}try{for(let[R,H]of b.hooks.afterResponse.entries())p=await H(p,async L=>{let K=w8.default.normalizeArguments(void 0,_(P({},L),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),b);K.hooks.afterResponse=K.hooks.afterResponse.slice(0,R);for(let ne of K.hooks.beforeRetry)await ne(K);let J=Q8(K);return l(()=>{J.catch(()=>{}),J.cancel()}),J})}catch(R){g._beforeError(new Yy.RequestError(R.message,R,g));return}if(!B8.isResponseOk(p)){g._beforeError(new Yy.HTTPError(p));return}r=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:d}=g;if(p instanceof Yy.HTTPError&&!d.throwHttpErrors){let{response:m}=p;o(g.options.resolveBodyOnly?m.body:m);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,d)=>{var m,E;if(h===((m=d.request)===null||m===void 0?void 0:m.options.body)&&TSe.default.nodeStream((E=d.request)===null||E===void 0?void 0:E.options.body)){f(d);return}c(p)}),OSe.default(g,i,USe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=r.request;return y8.default(r,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}IA.default=Q8;NSe(Sp(),IA)});var b8=I(Vk=>{"use strict";Object.defineProperty(Vk,"__esModule",{value:!0});var HSe=Sp();function GSe(t,...e){let r=(async()=>{if(t instanceof HSe.RequestError)try{for(let n of e)if(n)for(let s of n)t=await s(t)}catch(n){t=n}throw t})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}Vk.default=GSe});var x8=I(_k=>{"use strict";Object.defineProperty(_k,"__esModule",{value:!0});var v8=Ca();function S8(t){for(let e of Object.values(t))(v8.default.plainObject(e)||v8.default.array(e))&&S8(e);return Object.freeze(t)}_k.default=S8});var P8=I(k8=>{"use strict";Object.defineProperty(k8,"__esModule",{value:!0})});var Xk=I(ss=>{"use strict";var jSe=ss&&ss.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),YSe=ss&&ss.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&jSe(e,t,r)};Object.defineProperty(ss,"__esModule",{value:!0});ss.defaultHandler=void 0;var D8=Ca(),os=zk(),qSe=b8(),qy=vp(),JSe=x8(),WSe={RequestError:os.RequestError,CacheError:os.CacheError,ReadError:os.ReadError,HTTPError:os.HTTPError,MaxRedirectsError:os.MaxRedirectsError,TimeoutError:os.TimeoutError,ParseError:os.ParseError,CancelError:os.CancelError,UnsupportedProtocolError:os.UnsupportedProtocolError,UploadError:os.UploadError},zSe=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:Jy}=qy.default,R8=(...t)=>{let e;for(let r of t)e=Jy(void 0,r,e);return e},VSe=t=>t.isStream?new qy.default(void 0,t):os.default(t),_Se=t=>"defaults"in t&&"options"in t.defaults,XSe=["get","post","put","patch","head","delete"];ss.defaultHandler=(t,e)=>e(t);var F8=(t,e)=>{if(t)for(let r of t)r(e)},N8=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>t.handlers[l++](u,l===t.handlers.length?VSe:c);if(D8.default.plainObject(i)){let u=P(P({},i),n);qy.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{F8(t.options.hooks.init,n),F8((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Jy(i,n,s!=null?s:t.options);if(g[qy.kIsNormalizedAlready]=!0,u)throw new os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return qSe.default(u,t.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[t.options],s=[...t._rawHandlers],o;for(let a of i)_Se(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==ss.defaultHandler),s.length===0&&s.push(ss.defaultHandler),N8({options:R8(...n),handlers:s,mutableDefaults:Boolean(o)})};let r=async function*(i,n){let s=Jy(i,n,t.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!D8.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of r(i,n))s.push(o);return s},e.paginate.each=r,e.stream=(i,n)=>e(i,_(P({},n),{isStream:!0}));for(let i of XSe)e[i]=(n,s)=>e(n,_(P({},s),{method:i})),e.stream[i]=(n,s)=>e(n,_(P({},s),{method:i,isStream:!0}));return Object.assign(e,WSe),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:JSe.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=R8,e};ss.default=N8;YSe(P8(),ss)});var zy=I((Ia,Wy)=>{"use strict";var ZSe=Ia&&Ia.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),L8=Ia&&Ia.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&ZSe(e,t,r)};Object.defineProperty(Ia,"__esModule",{value:!0});var $Se=require("url"),T8=Xk(),exe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let i of e){let n=i.split(";");if(n[1].includes("next")){r=n[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new $Se.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[T8.defaultHandler],mutableDefaults:!1},Zk=T8.default(exe);Ia.default=Zk;Wy.exports=Zk;Wy.exports.default=Zk;Wy.exports.__esModule=!0;L8(Xk(),Ia);L8(zk(),Ia)});var U8=I(Xu=>{"use strict";var fst=require("net"),txe=require("tls"),$k=require("http"),M8=require("https"),rxe=require("events"),hst=require("assert"),ixe=require("util");Xu.httpOverHttp=nxe;Xu.httpsOverHttp=sxe;Xu.httpOverHttps=oxe;Xu.httpsOverHttps=axe;function nxe(t){var e=new Ea(t);return e.request=$k.request,e}function sxe(t){var e=new Ea(t);return e.request=$k.request,e.createSocket=O8,e.defaultPort=443,e}function oxe(t){var e=new Ea(t);return e.request=M8.request,e}function axe(t){var e=new Ea(t);return e.request=M8.request,e.createSocket=O8,e.defaultPort=443,e}function Ea(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||$k.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=K8(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};Ea.prototype.createSocket=function(e,r){var i=this,n={};i.sockets.push(n);var s=eP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),EA("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){EA("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){EA("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return EA("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,r(f)}function u(g){o.removeAllListeners(),EA(`tunneling socket could not be established, cause=%s +`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};Ea.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function O8(t,e){var r=this;Ea.prototype.createSocket.call(r,t,function(i){var n=t.request.getHeader("host"),s=eP({},r.options,{socket:i,servername:n?n.replace(/:.*$/,""):t.host}),o=txe.connect(0,s);r.sockets[r.sockets.indexOf(i)]=o,e(o)})}function K8(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function eP(t){for(var e=1,r=arguments.length;e{H8.exports=U8()});var bz=I((xot,sP)=>{var ez=Object.assign({},require("fs")),oe=typeof oe!="undefined"?oe:{},kp={},wA;for(wA in oe)oe.hasOwnProperty(wA)&&(kp[wA]=oe[wA]);var oP=[],tz="./this.program",rz=function(t,e){throw e},iz=!1,Wl=!0,Pp="";function dxe(t){return oe.locateFile?oe.locateFile(t,Pp):Pp+t}var Xy,aP,Zy,AP;Wl&&(iz?Pp=require("path").dirname(Pp)+"/":Pp=__dirname+"/",Xy=function(e,r){var i=sz(e);return i?r?i:i.toString():(Zy||(Zy=ez),AP||(AP=require("path")),e=AP.normalize(e),Zy.readFileSync(e,r?null:"utf8"))},aP=function(e){var r=Xy(e,!0);return r.buffer||(r=new Uint8Array(r)),nz(r.buffer),r},process.argv.length>1&&(tz=process.argv[1].replace(/\\/g,"/")),oP=process.argv.slice(2),typeof sP!="undefined"&&(sP.exports=oe),rz=function(t){process.exit(t)},oe.inspect=function(){return"[Emscripten Module object]"});var $y=oe.print||console.log.bind(console),Di=oe.printErr||console.warn.bind(console);for(wA in kp)kp.hasOwnProperty(wA)&&(oe[wA]=kp[wA]);kp=null;oe.arguments&&(oP=oe.arguments);oe.thisProgram&&(tz=oe.thisProgram);oe.quit&&(rz=oe.quit);var Cxe=16;function mxe(t,e){return e||(e=Cxe),Math.ceil(t/e)*e}var Ixe=0,Exe=function(t){Ixe=t},lP;oe.wasmBinary&&(lP=oe.wasmBinary);var Pst=oe.noExitRuntime||!0;typeof WebAssembly!="object"&&Gr("no native wasm support detected");function yxe(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return Zi[t>>0];case"i8":return Zi[t>>0];case"i16":return cP[t>>1];case"i32":return _e[t>>2];case"i64":return _e[t>>2];case"float":return oz[t>>2];case"double":return az[t>>3];default:Gr("invalid type for getValue: "+e)}return null}var ew,Az=!1,wxe;function nz(t,e){t||Gr("Assertion failed: "+e)}function lz(t){var e=oe["_"+t];return nz(e,"Cannot call unknown function "+t+", make sure it is exported"),e}function vxe(t,e,r,i,n){var s={string:function(h){var p=0;if(h!=null&&h!==0){var d=(h.length<<2)+1;p=gz(d),uz(h,p,d)}return p},array:function(h){var p=gz(h.length);return Bxe(h,p),p}};function o(h){return e==="string"?cz(h):e==="boolean"?Boolean(h):h}var a=lz(t),l=[],c=0;if(i)for(var u=0;u=i);)++n;if(n-e>16&&t.subarray&&fz)return fz.decode(t.subarray(e,n));for(var s="";e>10,56320|c&1023)}}return s}function cz(t,e){return t?Zu($u,t,e):""}function tw(t,e,r,i){if(!(i>0))return 0;for(var n=r,s=r+i-1,o=0;o=55296&&a<=57343){var l=t.charCodeAt(++o);a=65536+((a&1023)<<10)|l&1023}if(a<=127){if(r>=s)break;e[r++]=a}else if(a<=2047){if(r+1>=s)break;e[r++]=192|a>>6,e[r++]=128|a&63}else if(a<=65535){if(r+2>=s)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|a&63}else{if(r+3>=s)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|a&63}}return e[r]=0,r-n}function uz(t,e,r){return tw(t,$u,e,r)}function rw(t){for(var e=0,r=0;r=55296&&i<=57343&&(i=65536+((i&1023)<<10)|t.charCodeAt(++r)&1023),i<=127?++e:i<=2047?e+=2:i<=65535?e+=3:e+=4}return e}function uP(t){var e=rw(t)+1,r=hz(e);return r&&tw(t,Zi,r,e),r}function Bxe(t,e){Zi.set(t,e)}function xxe(t,e){return t%e>0&&(t+=e-t%e),t}var gP,Zi,$u,cP,kxe,_e,Pxe,oz,az;function pz(t){gP=t,oe.HEAP8=Zi=new Int8Array(t),oe.HEAP16=cP=new Int16Array(t),oe.HEAP32=_e=new Int32Array(t),oe.HEAPU8=$u=new Uint8Array(t),oe.HEAPU16=kxe=new Uint16Array(t),oe.HEAPU32=Pxe=new Uint32Array(t),oe.HEAPF32=oz=new Float32Array(t),oe.HEAPF64=az=new Float64Array(t)}var Dst=oe.INITIAL_MEMORY||16777216,fP,dz=[],Cz=[],mz=[],Dxe=!1;function Fxe(){if(oe.preRun)for(typeof oe.preRun=="function"&&(oe.preRun=[oe.preRun]);oe.preRun.length;)Rxe(oe.preRun.shift());hP(dz)}function Nxe(){Dxe=!0,!oe.noFSInit&&!y.init.initialized&&y.init(),BA.init(),hP(Cz)}function Txe(){if(oe.postRun)for(typeof oe.postRun=="function"&&(oe.postRun=[oe.postRun]);oe.postRun.length;)Lxe(oe.postRun.shift());hP(mz)}function Rxe(t){dz.unshift(t)}function Mxe(t){Cz.unshift(t)}function Lxe(t){mz.unshift(t)}var zl=0,pP=null,Dp=null;function Oxe(t){return t}function Iz(t){zl++,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl)}function dP(t){if(zl--,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl),zl==0&&(pP!==null&&(clearInterval(pP),pP=null),Dp)){var e=Dp;Dp=null,e()}}oe.preloadedImages={};oe.preloadedAudios={};function Gr(t){oe.onAbort&&oe.onAbort(t),t+="",Di(t),Az=!0,wxe=1,t="abort("+t+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(t);throw e}var Ez="data:application/octet-stream;base64,";function yz(t){return t.startsWith(Ez)}var Rp="data:application/octet-stream;base64,AGFzbQEAAAABlAInYAF/AX9gA39/fwF/YAF/AGACf38Bf2ACf38AYAV/f39/fwF/YAR/f39/AX9gA39/fwBgBH9+f38Bf2AAAX9gBX9/f35/AX5gA39+fwF/YAF/AX5gAn9+AX9gBH9/fn8BfmADf35/AX5gA39/fgF/YAR/f35/AX9gBn9/f39/fwF/YAR/f39/AGADf39+AX5gAn5/AX9gA398fwBgBH9/f38BfmADf39/AX5gBn98f39/fwF/YAV/f35/fwF/YAV/fn9/fwF/YAV/f39/fwBgAn9+AGACf38BfmACf3wAYAh/fn5/f39+fwF/YAV/f39+fwBgAABgBX5+f35/AX5gAnx/AXxgAn9+AX5gBX9/f39/AX4CeRQBYQFhAAIBYQFiAAABYQFjAAMBYQFkAAYBYQFlAAEBYQFmAAABYQFnAAYBYQFoAAABYQFpAAMBYQFqAAMBYQFrAAMBYQFsAAMBYQFtAAABYQFuAAUBYQFvAAEBYQFwAAMBYQFxAAEBYQFyAAABYQFzAAEBYQF0AAADggKAAgcCAgQAAQECAgANBAQOBwICAhwLEw0AAA0dFAwMAAcCDBAeAgMCAwIAAgEABwgUBBUIBgADAAwABAgIAgEGBgABAB8XAQEDAhMCAwUFEQICIA8GAgMYAQgCAQAABwUBGAAaAxIBAAcEAyERCCIHAQsVAQMABQMDAwAFBAACIwYAAQEAGw0bFw0BBAALCwMDDAwAAwAHJAMBBAgaAQECBQMBAwMABwcHAgICAiURCwgICwEmCQkAAAAKAAIABQAGBgUFBQEDBgYGBRISBgQBAQEAAAIJBgABAA4AAQEPCQABBBkJCQkAAAADCgoBAQIQAAAAAgEDAwkEAQoABQ4AAAkEBQFwAR8fBQcBAYACgIACBgkBfwFB0KDBAgsHvgI8AXUCAAF2AIABAXcAkwIBeADxAQF5AM8BAXoAzQEBQQDLAQFCAMoBAUMAyQEBRADIAQFFAMcBAUYAkgIBRwCRAgFIAI4CAUkA6QEBSgDiAQFLAOEBAUwAPQFNAOABAU4A+gEBTwD5AQFQAPIBAVEA+wEBUgDfAQFTAN4BAVQA3QEBVQDcAQFWAOMBAVcA2wEBWADaAQFZANkBAVoA2AEBXwDXAQEkAOoBAmFhAJwBAmJhANYBAmNhANUBAmRhANQBAmVhADECZmEA6wECZ2EAGwJoYQDOAQJpYQBJAmphANMBAmthANIBAmxhAGgCbWEA0QECbmEA6AECb2EA0AECcGEA5AECcWEAigICcmEA+AECc2EA9wECdGEA9gECdWEA5wECdmEA5gECd2EA5QECeGEAGAJ5YQAVAnphAQAJQQEAQQELHswBkAKNAo8CjAKLArYBiQKIAocChgKFAoQCgwKCAoECgAL/Af4B/QH8AVr1AfQB8wHwAe8B7gHtAewBCq2RCYACQAEBfyMAQRBrIgMgADYCDCADIAE2AgggAyACNgIEIAMoAgwEQCADKAIMIAMoAgg2AgAgAygCDCADKAIENgIECwvMDAEHfwJAIABFDQAgAEEIayIDIABBBGsoAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAyADKAIAIgFrIgNByJsBKAIASQ0BIAAgAWohACADQcybASgCAEcEQCABQf8BTQRAIAMoAggiAiABQQN2IgRBA3RB4JsBakYaIAIgAygCDCIBRgRAQbibAUG4mwEoAgBBfiAEd3E2AgAMAwsgAiABNgIMIAEgAjYCCAwCCyADKAIYIQYCQCADIAMoAgwiAUcEQCADKAIIIgIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QeidAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbybAUG8mwEoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQcCbASAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgAyAFTw0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUHQmwEoAgBGBEBB0JsBIAM2AgBBxJsBQcSbASgCACAAaiIANgIAIAMgAEEBcjYCBCADQcybASgCAEcNA0HAmwFBADYCAEHMmwFBADYCAA8LIAVBzJsBKAIARgRAQcybASADNgIAQcCbAUHAmwEoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIIIgIgAUEDdiIEQQN0QeCbAWpGGiACIAUoAgwiAUYEQEG4mwFBuJsBKAIAQX4gBHdxNgIADAILIAIgATYCDCABIAI2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEAgBSgCCCICQcibASgCAEkaIAIgATYCDCABIAI2AggMAQsCQCAFQRRqIgIoAgAiBA0AIAVBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCICQQJ0QeidAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQbybAUG8mwEoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAgRAIAEgAjYCECACIAE2AhgLIAUoAhQiAkUNACABIAI2AhQgAiABNgIYCyADIABBAXI2AgQgACADaiAANgIAIANBzJsBKAIARw0BQcCbASAANgIADwsgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgALIABB/wFNBEAgAEEDdiIBQQN0QeCbAWohAAJ/QbibASgCACICQQEgAXQiAXFFBEBBuJsBIAEgAnI2AgAgAAwBCyAAKAIICyECIAAgAzYCCCACIAM2AgwgAyAANgIMIAMgAjYCCA8LQR8hAiADQgA3AhAgAEH///8HTQRAIABBCHYiASABQYD+P2pBEHZBCHEiAXQiAiACQYDgH2pBEHZBBHEiAnQiBCAEQYCAD2pBEHZBAnEiBHRBD3YgASACciAEcmsiAUEBdCAAIAFBFWp2QQFxckEcaiECCyADIAI2AhwgAkECdEHonQFqIQECQAJAAkBBvJsBKAIAIgRBASACdCIHcUUEQEG8mwEgBCAHcjYCACABIAM2AgAgAyABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhAQNAIAEiBCgCBEF4cSAARg0CIAJBHXYhASACQQF0IQIgBCABQQRxaiIHQRBqKAIAIgENAAsgByADNgIQIAMgBDYCGAsgAyADNgIMIAMgAzYCCAwBCyAEKAIIIgAgAzYCDCAEIAM2AgggA0EANgIYIAMgBDYCDCADIAA2AggLQdibAUHYmwEoAgBBAWsiAEF/IAAbNgIACwtCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDC0AAUEBcQRAIAEoAgwoAgQQFQsgASgCDBAVCyABQRBqJAALQwEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAgwCfyMAQRBrIgAgAigCCDYCDCAAKAIMQQxqCxBDIAJBEGokAAuiLgEMfyMAQRBrIgwkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQfQBTQRAQbibASgCACIFQRAgAEELakF4cSAAQQtJGyIIQQN2IgJ2IgFBA3EEQCABQX9zQQFxIAJqIgNBA3QiAUHomwFqKAIAIgRBCGohAAJAIAQoAggiAiABQeCbAWoiAUYEQEG4mwEgBUF+IAN3cTYCAAwBCyACIAE2AgwgASACNgIICyAEIANBA3QiAUEDcjYCBCABIARqIgEgASgCBEEBcjYCBAwNCyAIQcCbASgCACIKTQ0BIAEEQAJAQQIgAnQiAEEAIABrciABIAJ0cSIAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmoiA0EDdCIAQeibAWooAgAiBCgCCCIBIABB4JsBaiIARgRAQbibASAFQX4gA3dxIgU2AgAMAQsgASAANgIMIAAgATYCCAsgBEEIaiEAIAQgCEEDcjYCBCAEIAhqIgIgA0EDdCIBIAhrIgNBAXI2AgQgASAEaiADNgIAIAoEQCAKQQN2IgFBA3RB4JsBaiEHQcybASgCACEEAn8gBUEBIAF0IgFxRQRAQbibASABIAVyNgIAIAcMAQsgBygCCAshASAHIAQ2AgggASAENgIMIAQgBzYCDCAEIAE2AggLQcybASACNgIAQcCbASADNgIADA0LQbybASgCACIGRQ0BIAZBACAGa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2akECdEHonQFqKAIAIgEoAgRBeHEgCGshAyABIQIDQAJAIAIoAhAiAEUEQCACKAIUIgBFDQELIAAoAgRBeHEgCGsiAiADIAIgA0kiAhshAyAAIAEgAhshASAAIQIMAQsLIAEgCGoiCSABTQ0CIAEoAhghCyABIAEoAgwiBEcEQCABKAIIIgBByJsBKAIASRogACAENgIMIAQgADYCCAwMCyABQRRqIgIoAgAiAEUEQCABKAIQIgBFDQQgAUEQaiECCwNAIAIhByAAIgRBFGoiAigCACIADQAgBEEQaiECIAQoAhAiAA0ACyAHQQA2AgAMCwtBfyEIIABBv39LDQAgAEELaiIAQXhxIQhBvJsBKAIAIglFDQBBACAIayEDAkACQAJAAn9BACAIQYACSQ0AGkEfIAhB////B0sNABogAEEIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAggAEEVanZBAXFyQRxqCyIFQQJ0QeidAWooAgAiAkUEQEEAIQAMAQtBACEAIAhBAEEZIAVBAXZrIAVBH0YbdCEBA0ACQCACKAIEQXhxIAhrIgcgA08NACACIQQgByIDDQBBACEDIAIhAAwDCyAAIAIoAhQiByAHIAIgAUEddkEEcWooAhAiAkYbIAAgBxshACABQQF0IQEgAg0ACwsgACAEckUEQEECIAV0IgBBACAAa3IgCXEiAEUNAyAAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmpBAnRB6J0BaigCACEACyAARQ0BCwNAIAAoAgRBeHEgCGsiASADSSECIAEgAyACGyEDIAAgBCACGyEEIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIARFDQAgA0HAmwEoAgAgCGtPDQAgBCAIaiIGIARNDQEgBCgCGCEFIAQgBCgCDCIBRwRAIAQoAggiAEHImwEoAgBJGiAAIAE2AgwgASAANgIIDAoLIARBFGoiAigCACIARQRAIAQoAhAiAEUNBCAEQRBqIQILA0AgAiEHIAAiAUEUaiICKAIAIgANACABQRBqIQIgASgCECIADQALIAdBADYCAAwJCyAIQcCbASgCACICTQRAQcybASgCACEDAkAgAiAIayIBQRBPBEBBwJsBIAE2AgBBzJsBIAMgCGoiADYCACAAIAFBAXI2AgQgAiADaiABNgIAIAMgCEEDcjYCBAwBC0HMmwFBADYCAEHAmwFBADYCACADIAJBA3I2AgQgAiADaiIAIAAoAgRBAXI2AgQLIANBCGohAAwLCyAIQcSbASgCACIGSQRAQcSbASAGIAhrIgE2AgBB0JsBQdCbASgCACICIAhqIgA2AgAgACABQQFyNgIEIAIgCEEDcjYCBCACQQhqIQAMCwtBACEAIAhBL2oiCQJ/QZCfASgCAARAQZifASgCAAwBC0GcnwFCfzcCAEGUnwFCgKCAgICABDcCAEGQnwEgDEEMakFwcUHYqtWqBXM2AgBBpJ8BQQA2AgBB9J4BQQA2AgBBgCALIgFqIgVBACABayIHcSICIAhNDQpB8J4BKAIAIgQEQEHongEoAgAiAyACaiIBIANNDQsgASAESw0LC0H0ngEtAABBBHENBQJAAkBB0JsBKAIAIgMEQEH4ngEhAANAIAMgACgCACIBTwRAIAEgACgCBGogA0sNAwsgACgCCCIADQALC0EAEDwiAUF/Rg0GIAIhBUGUnwEoAgAiA0EBayIAIAFxBEAgAiABayAAIAFqQQAgA2txaiEFCyAFIAhNDQYgBUH+////B0sNBkHwngEoAgAiBARAQeieASgCACIDIAVqIgAgA00NByAAIARLDQcLIAUQPCIAIAFHDQEMCAsgBSAGayAHcSIFQf7///8HSw0FIAUQPCIBIAAoAgAgACgCBGpGDQQgASEACwJAIABBf0YNACAIQTBqIAVNDQBBmJ8BKAIAIgEgCSAFa2pBACABa3EiAUH+////B0sEQCAAIQEMCAsgARA8QX9HBEAgASAFaiEFIAAhAQwIC0EAIAVrEDwaDAULIAAiAUF/Rw0GDAQLAAtBACEEDAcLQQAhAQwFCyABQX9HDQILQfSeAUH0ngEoAgBBBHI2AgALIAJB/v///wdLDQEgAhA8IQFBABA8IQAgAUF/Rg0BIABBf0YNASAAIAFNDQEgACABayIFIAhBKGpNDQELQeieAUHongEoAgAgBWoiADYCAEHsngEoAgAgAEkEQEHsngEgADYCAAsCQAJAAkBB0JsBKAIAIgcEQEH4ngEhAANAIAEgACgCACIDIAAoAgQiAmpGDQIgACgCCCIADQALDAILQcibASgCACIAQQAgACABTRtFBEBByJsBIAE2AgALQQAhAEH8ngEgBTYCAEH4ngEgATYCAEHYmwFBfzYCAEHcmwFBkJ8BKAIANgIAQYSfAUEANgIAA0AgAEEDdCIDQeibAWogA0HgmwFqIgI2AgAgA0HsmwFqIAI2AgAgAEEBaiIAQSBHDQALQcSbASAFQShrIgNBeCABa0EHcUEAIAFBCGpBB3EbIgBrIgI2AgBB0JsBIAAgAWoiADYCACAAIAJBAXI2AgQgASADakEoNgIEQdSbAUGgnwEoAgA2AgAMAgsgAC0ADEEIcQ0AIAMgB0sNACABIAdNDQAgACACIAVqNgIEQdCbASAHQXggB2tBB3FBACAHQQhqQQdxGyIAaiICNgIAQcSbAUHEmwEoAgAgBWoiASAAayIANgIAIAIgAEEBcjYCBCABIAdqQSg2AgRB1JsBQaCfASgCADYCAAwBC0HImwEoAgAgAUsEQEHImwEgATYCAAsgASAFaiECQfieASEAAkACQAJAAkACQAJAA0AgAiAAKAIARwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0BC0H4ngEhAANAIAcgACgCACICTwRAIAIgACgCBGoiBCAHSw0DCyAAKAIIIQAMAAsACyAAIAE2AgAgACAAKAIEIAVqNgIEIAFBeCABa0EHcUEAIAFBCGpBB3EbaiIJIAhBA3I2AgQgAkF4IAJrQQdxQQAgAkEIakEHcRtqIgUgCCAJaiIGayECIAUgB0YEQEHQmwEgBjYCAEHEmwFBxJsBKAIAIAJqIgA2AgAgBiAAQQFyNgIEDAMLIAVBzJsBKAIARgRAQcybASAGNgIAQcCbAUHAmwEoAgAgAmoiADYCACAGIABBAXI2AgQgACAGaiAANgIADAMLIAUoAgQiAEEDcUEBRgRAIABBeHEhBwJAIABB/wFNBEAgBSgCCCIDIABBA3YiAEEDdEHgmwFqRhogAyAFKAIMIgFGBEBBuJsBQbibASgCAEF+IAB3cTYCAAwCCyADIAE2AgwgASADNgIIDAELIAUoAhghCAJAIAUgBSgCDCIBRwRAIAUoAggiACABNgIMIAEgADYCCAwBCwJAIAVBFGoiACgCACIDDQAgBUEQaiIAKAIAIgMNAEEAIQEMAQsDQCAAIQQgAyIBQRRqIgAoAgAiAw0AIAFBEGohACABKAIQIgMNAAsgBEEANgIACyAIRQ0AAkAgBSAFKAIcIgNBAnRB6J0BaiIAKAIARgRAIAAgATYCACABDQFBvJsBQbybASgCAEF+IAN3cTYCAAwCCyAIQRBBFCAIKAIQIAVGG2ogATYCACABRQ0BCyABIAg2AhggBSgCECIABEAgASAANgIQIAAgATYCGAsgBSgCFCIARQ0AIAEgADYCFCAAIAE2AhgLIAUgB2ohBSACIAdqIQILIAUgBSgCBEF+cTYCBCAGIAJBAXI2AgQgAiAGaiACNgIAIAJB/wFNBEAgAkEDdiIAQQN0QeCbAWohAgJ/QbibASgCACIBQQEgAHQiAHFFBEBBuJsBIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwDC0EfIQAgAkH///8HTQRAIAJBCHYiACAAQYD+P2pBEHZBCHEiA3QiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASADciAAcmsiAEEBdCACIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRB6J0BaiEEAkBBvJsBKAIAIgNBASAAdCIBcUUEQEG8mwEgASADcjYCACAEIAY2AgAgBiAENgIYDAELIAJBAEEZIABBAXZrIABBH0YbdCEAIAQoAgAhAQNAIAEiAygCBEF4cSACRg0DIABBHXYhASAAQQF0IQAgAyABQQRxaiIEKAIQIgENAAsgBCAGNgIQIAYgAzYCGAsgBiAGNgIMIAYgBjYCCAwCC0HEmwEgBUEoayIDQXggAWtBB3FBACABQQhqQQdxGyIAayICNgIAQdCbASAAIAFqIgA2AgAgACACQQFyNgIEIAEgA2pBKDYCBEHUmwFBoJ8BKAIANgIAIAcgBEEnIARrQQdxQQAgBEEna0EHcRtqQS9rIgAgACAHQRBqSRsiAkEbNgIEIAJBgJ8BKQIANwIQIAJB+J4BKQIANwIIQYCfASACQQhqNgIAQfyeASAFNgIAQfieASABNgIAQYSfAUEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAEgBEkNAAsgAiAHRg0DIAIgAigCBEF+cTYCBCAHIAIgB2siBEEBcjYCBCACIAQ2AgAgBEH/AU0EQCAEQQN2IgBBA3RB4JsBaiECAn9BuJsBKAIAIgFBASAAdCIAcUUEQEG4mwEgACABcjYCACACDAELIAIoAggLIQAgAiAHNgIIIAAgBzYCDCAHIAI2AgwgByAANgIIDAQLQR8hACAHQgA3AhAgBEH///8HTQRAIARBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCAEIABBFWp2QQFxckEcaiEACyAHIAA2AhwgAEECdEHonQFqIQMCQEG8mwEoAgAiAkEBIAB0IgFxRQRAQbybASABIAJyNgIAIAMgBzYCACAHIAM2AhgMAQsgBEEAQRkgAEEBdmsgAEEfRht0IQAgAygCACEBA0AgASICKAIEQXhxIARGDQQgAEEddiEBIABBAXQhACACIAFBBHFqIgMoAhAiAQ0ACyADIAc2AhAgByACNgIYCyAHIAc2AgwgByAHNgIIDAMLIAMoAggiACAGNgIMIAMgBjYCCCAGQQA2AhggBiADNgIMIAYgADYCCAsgCUEIaiEADAULIAIoAggiACAHNgIMIAIgBzYCCCAHQQA2AhggByACNgIMIAcgADYCCAtBxJsBKAIAIgAgCE0NAEHEmwEgACAIayIBNgIAQdCbAUHQmwEoAgAiAiAIaiIANgIAIAAgAUEBcjYCBCACIAhBA3I2AgQgAkEIaiEADAMLQbSbAUEwNgIAQQAhAAwCCwJAIAVFDQACQCAEKAIcIgJBAnRB6J0BaiIAKAIAIARGBEAgACABNgIAIAENAUG8mwEgCUF+IAJ3cSIJNgIADAILIAVBEEEUIAUoAhAgBEYbaiABNgIAIAFFDQELIAEgBTYCGCAEKAIQIgAEQCABIAA2AhAgACABNgIYCyAEKAIUIgBFDQAgASAANgIUIAAgATYCGAsCQCADQQ9NBEAgBCADIAhqIgBBA3I2AgQgACAEaiIAIAAoAgRBAXI2AgQMAQsgBCAIQQNyNgIEIAYgA0EBcjYCBCADIAZqIAM2AgAgA0H/AU0EQCADQQN2IgBBA3RB4JsBaiECAn9BuJsBKAIAIgFBASAAdCIAcUUEQEG4mwEgACABcjYCACACDAELIAIoAggLIQAgAiAGNgIIIAAgBjYCDCAGIAI2AgwgBiAANgIIDAELQR8hACADQf///wdNBEAgA0EIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAMgAEEVanZBAXFyQRxqIQALIAYgADYCHCAGQgA3AhAgAEECdEHonQFqIQICQAJAIAlBASAAdCIBcUUEQEG8mwEgASAJcjYCACACIAY2AgAgBiACNgIYDAELIANBAEEZIABBAXZrIABBH0YbdCEAIAIoAgAhCANAIAgiASgCBEF4cSADRg0CIABBHXYhAiAAQQF0IQAgASACQQRxaiICKAIQIggNAAsgAiAGNgIQIAYgATYCGAsgBiAGNgIMIAYgBjYCCAwBCyABKAIIIgAgBjYCDCABIAY2AgggBkEANgIYIAYgATYCDCAGIAA2AggLIARBCGohAAwBCwJAIAtFDQACQCABKAIcIgJBAnRB6J0BaiIAKAIAIAFGBEAgACAENgIAIAQNAUG8mwEgBkF+IAJ3cTYCAAwCCyALQRBBFCALKAIQIAFGG2ogBDYCACAERQ0BCyAEIAs2AhggASgCECIABEAgBCAANgIQIAAgBDYCGAsgASgCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAEgAyAIaiIAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEDAELIAEgCEEDcjYCBCAJIANBAXI2AgQgAyAJaiADNgIAIAoEQCAKQQN2IgBBA3RB4JsBaiEEQcybASgCACECAn9BASAAdCIAIAVxRQRAQbibASAAIAVyNgIAIAQMAQsgBCgCCAshACAEIAI2AgggACACNgIMIAIgBDYCDCACIAA2AggLQcybASAJNgIAQcCbASADNgIACyABQQhqIQALIAxBEGokACAAC4MEAQN/IAJBgARPBEAgACABIAIQEhogAA8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCAAQQNxRQRAIAAhAgwBCyACQQFIBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAu4GAECfyMAQRBrIgQkACAEIAA2AgwgBCABNgIIIAQgAjYCBCAEKAIMIQAgBCgCCCECIAQoAgQhAyMAQSBrIgEkACABIAA2AhggASACNgIUIAEgAzYCEAJAIAEoAhRFBEAgAUEANgIcDAELIAFBATYCDCABLQAMBEAgASgCFCECIAEoAhAhAyMAQSBrIgAgASgCGDYCHCAAIAI2AhggACADNgIUIAAgACgCHDYCECAAIAAoAhBBf3M2AhADQCAAKAIUBH8gACgCGEEDcUEARwVBAAtBAXEEQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGQFWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQFWooAgAgACgCEEEQdkH/AXFBAnRBkB1qKAIAIAAoAhBB/wFxQQJ0QZAtaigCACAAKAIQQQh2Qf8BcUECdEGQJWooAgBzc3M2AhAgACAAKAIUQSBrNgIUDAELCwNAIAAoAhRBBE8EQCAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QZAVaigCACAAKAIQQRB2Qf8BcUECdEGQHWooAgAgACgCEEH/AXFBAnRBkC1qKAIAIAAoAhBBCHZB/wFxQQJ0QZAlaigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGQFWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrIgI2AhQgAg0ACwsgACAAKAIQQX9zNgIQIAEgACgCEDYCHAwBCyABKAIUIQIgASgCECEDIwBBIGsiACABKAIYNgIcIAAgAjYCGCAAIAM2AhQgACAAKAIcQQh2QYD+A3EgACgCHEEYdmogACgCHEGA/gNxQQh0aiAAKAIcQf8BcUEYdGo2AhAgACAAKAIQQX9zNgIQA0AgACgCFAR/IAAoAhhBA3FBAEcFQQALQQFxBEAgACgCEEEYdiECIAAgACgCGCIDQQFqNgIYIAAgAy0AACACc0ECdEGQNWooAgAgACgCEEEIdHM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQzQBqKAIAIAAoAhBBEHZB/wFxQQJ0QZDFAGooAgAgACgCEEH/AXFBAnRBkDVqKAIAIAAoAhBBCHZB/wFxQQJ0QZA9aigCAHNzczYCECAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QZDNAGooAgAgACgCEEEQdkH/AXFBAnRBkMUAaigCACAAKAIQQf8BcUECdEGQNWooAgAgACgCEEEIdkH/AXFBAnRBkD1qKAIAc3NzNgIQIAAgACgCDCICQQRqNgIMIAAgAigCACAAKAIQczYCECAAIAAoAhBBGHZBAnRBkM0AaigCACAAKAIQQRB2Qf8BcUECdEGQxQBqKAIAIAAoAhBB/wFxQQJ0QZA1aigCACAAKAIQQQh2Qf8BcUECdEGQPWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQzQBqKAIAIAAoAhBBEHZB/wFxQQJ0QZDFAGooAgAgACgCEEH/AXFBAnRBkDVqKAIAIAAoAhBBCHZB/wFxQQJ0QZA9aigCAHNzczYCECAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QZDNAGooAgAgACgCEEEQdkH/AXFBAnRBkMUAaigCACAAKAIQQf8BcUECdEGQNWooAgAgACgCEEEIdkH/AXFBAnRBkD1qKAIAc3NzNgIQIAAgACgCDCICQQRqNgIMIAAgAigCACAAKAIQczYCECAAIAAoAhBBGHZBAnRBkM0AaigCACAAKAIQQRB2Qf8BcUECdEGQxQBqKAIAIAAoAhBB/wFxQQJ0QZA1aigCACAAKAIQQQh2Qf8BcUECdEGQPWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQzQBqKAIAIAAoAhBBEHZB/wFxQQJ0QZDFAGooAgAgACgCEEH/AXFBAnRBkDVqKAIAIAAoAhBBCHZB/wFxQQJ0QZA9aigCAHNzczYCECAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QZDNAGooAgAgACgCEEEQdkH/AXFBAnRBkMUAaigCACAAKAIQQf8BcUECdEGQNWooAgAgACgCEEEIdkH/AXFBAnRBkD1qKAIAc3NzNgIQIAAgACgCFEEgazYCFAwBCwsDQCAAKAIUQQRPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGQzQBqKAIAIAAoAhBBEHZB/wFxQQJ0QZDFAGooAgAgACgCEEH/AXFBAnRBkDVqKAIAIAAoAhBBCHZB/wFxQQJ0QZA9aigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQQRh2IQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQQJ0QZA1aigCACAAKAIQQQh0czYCECAAIAAoAhRBAWsiAjYCFCACDQALCyAAIAAoAhBBf3M2AhAgASAAKAIQQQh2QYD+A3EgACgCEEEYdmogACgCEEGA/gNxQQh0aiAAKAIQQf8BcUEYdGo2AhwLIAEoAhwhACABQSBqJAAgBEEQaiQAIAAL7AIBAn8jAEEQayIBJAAgASAANgIMAkAgASgCDEUNACABKAIMKAIwBEAgASgCDCIAIAAoAjBBAWs2AjALIAEoAgwoAjANACABKAIMKAIgBEAgASgCDEEBNgIgIAEoAgwQMRoLIAEoAgwoAiRBAUYEQCABKAIMEGcLAkAgASgCDCgCLEUNACABKAIMLQAoQQFxDQAgASgCDCECIwBBEGsiACABKAIMKAIsNgIMIAAgAjYCCCAAQQA2AgQDQCAAKAIEIAAoAgwoAkRJBEAgACgCDCgCTCAAKAIEQQJ0aigCACAAKAIIRgRAIAAoAgwoAkwgACgCBEECdGogACgCDCgCTCAAKAIMKAJEQQFrQQJ0aigCADYCACAAKAIMIgAgACgCREEBazYCRAUgACAAKAIEQQFqNgIEDAILCwsLIAEoAgxBAEIAQQUQIRogASgCDCgCAARAIAEoAgwoAgAQGwsgASgCDBAVCyABQRBqJAALnwIBAn8jAEEQayIBJAAgASAANgIMIAEgASgCDCgCHDYCBCABKAIEIQIjAEEQayIAJAAgACACNgIMIAAoAgwQuwEgAEEQaiQAIAEgASgCBCgCFDYCCCABKAIIIAEoAgwoAhBLBEAgASABKAIMKAIQNgIICwJAIAEoAghFDQAgASgCDCgCDCABKAIEKAIQIAEoAggQGRogASgCDCIAIAEoAgggACgCDGo2AgwgASgCBCIAIAEoAgggACgCEGo2AhAgASgCDCIAIAEoAgggACgCFGo2AhQgASgCDCIAIAAoAhAgASgCCGs2AhAgASgCBCIAIAAoAhQgASgCCGs2AhQgASgCBCgCFA0AIAEoAgQgASgCBCgCCDYCEAsgAUEQaiQAC2ABAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEICEB42AgQCQCABKAIERQRAIAFBADsBDgwBCyABIAEoAgQtAAAgASgCBC0AAUEIdGo7AQ4LIAEvAQ4hACABQRBqJAAgAAvpAQEBfyMAQSBrIgIkACACIAA2AhwgAiABNwMQIAIpAxAhASMAQSBrIgAgAigCHDYCGCAAIAE3AxACQAJAAkAgACgCGC0AAEEBcUUNACAAKQMQIAAoAhgpAxAgACkDEHxWDQAgACgCGCkDCCAAKAIYKQMQIAApAxB8Wg0BCyAAKAIYQQA6AAAgAEEANgIcDAELIAAgACgCGCgCBCAAKAIYKQMQp2o2AgwgACAAKAIMNgIcCyACIAAoAhw2AgwgAigCDARAIAIoAhwiACACKQMQIAApAxB8NwMQCyACKAIMIQAgAkEgaiQAIAALbwEBfyMAQRBrIgIkACACIAA2AgggAiABOwEGIAIgAigCCEICEB42AgACQCACKAIARQRAIAJBfzYCDAwBCyACKAIAIAIvAQY6AAAgAigCACACLwEGQQh2OgABIAJBADYCDAsgAigCDBogAkEQaiQAC48BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQgAiACKAIIQgQQHjYCAAJAIAIoAgBFBEAgAkF/NgIMDAELIAIoAgAgAigCBDoAACACKAIAIAIoAgRBCHY6AAEgAigCACACKAIEQRB2OgACIAIoAgAgAigCBEEYdjoAAyACQQA2AgwLIAIoAgwaIAJBEGokAAu2AgEBfyMAQTBrIgQkACAEIAA2AiQgBCABNgIgIAQgAjcDGCAEIAM2AhQCQCAEKAIkKQMYQgEgBCgCFK2Gg1AEQCAEKAIkQQxqQRxBABAUIARCfzcDKAwBCwJAIAQoAiQoAgBFBEAgBCAEKAIkKAIIIAQoAiAgBCkDGCAEKAIUIAQoAiQoAgQRDgA3AwgMAQsgBCAEKAIkKAIAIAQoAiQoAgggBCgCICAEKQMYIAQoAhQgBCgCJCgCBBEKADcDCAsgBCkDCEIAUwRAAkAgBCgCFEEERg0AIAQoAhRBDkYNAAJAIAQoAiQgBEIIQQQQIUIAUwRAIAQoAiRBDGpBFEEAEBQMAQsgBCgCJEEMaiAEKAIAIAQoAgQQFAsLCyAEIAQpAwg3AygLIAQpAyghAiAEQTBqJAAgAgsXACAALQAAQSBxRQRAIAEgAiAAEHIaCwtQAQF/IwBBEGsiASQAIAEgADYCDANAIAEoAgwEQCABIAEoAgwoAgA2AgggASgCDCgCDBAVIAEoAgwQFSABIAEoAgg2AgwMAQsLIAFBEGokAAt9AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgAUIANwMAA0AgASkDACABKAIMKQMIWkUEQCABKAIMKAIAIAEpAwCnQQR0ahBiIAEgASkDAEIBfDcDAAwBCwsgASgCDCgCABAVIAEoAgwoAigQJSABKAIMEBULIAFBEGokAAs+AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCABAVIAEoAgwoAgwQFSABKAIMEBULIAFBEGokAAtuAQF/IwBBgAJrIgUkAAJAIARBgMAEcQ0AIAIgA0wNACAFIAFB/wFxIAIgA2siAkGAAiACQYACSSIBGxAyIAFFBEADQCAAIAVBgAIQIiACQYACayICQf8BSw0ACwsgACAFIAIQIgsgBUGAAmokAAvRAQEBfyMAQTBrIgMkACADIAA2AiggAyABNwMgIAMgAjYCHAJAIAMoAigtAChBAXEEQCADQX82AiwMAQsCQCADKAIoKAIgBEAgAygCHEUNASADKAIcQQFGDQEgAygCHEECRg0BCyADKAIoQQxqQRJBABAUIANBfzYCLAwBCyADIAMpAyA3AwggAyADKAIcNgIQIAMoAiggA0EIakIQQQYQIUIAUwRAIANBfzYCLAwBCyADKAIoQQA6ADQgA0EANgIsCyADKAIsIQAgA0EwaiQAIAALmBcBAn8jAEEwayIEJAAgBCAANgIsIAQgATYCKCAEIAI2AiQgBCADNgIgIARBADYCFAJAIAQoAiwoAoQBQQBKBEAgBCgCLCgCACgCLEECRgRAIwBBEGsiACAEKAIsNgIIIABB/4D/n382AgQgAEEANgIAAkADQCAAKAIAQR9MBEACQCAAKAIEQQFxRQ0AIAAoAghBlAFqIAAoAgBBAnRqLwEARQ0AIABBADYCDAwDCyAAIAAoAgBBAWo2AgAgACAAKAIEQQF2NgIEDAELCwJAAkAgACgCCC8BuAENACAAKAIILwG8AQ0AIAAoAggvAcgBRQ0BCyAAQQE2AgwMAQsgAEEgNgIAA0AgACgCAEGAAkgEQCAAKAIIQZQBaiAAKAIAQQJ0ai8BAARAIABBATYCDAwDBSAAIAAoAgBBAWo2AgAMAgsACwsgAEEANgIMCyAAKAIMIQAgBCgCLCgCACAANgIsCyAEKAIsIAQoAixBmBZqEHsgBCgCLCAEKAIsQaQWahB7IAQoAiwhASMAQRBrIgAkACAAIAE2AgwgACgCDCAAKAIMQZQBaiAAKAIMKAKcFhC5ASAAKAIMIAAoAgxBiBNqIAAoAgwoAqgWELkBIAAoAgwgACgCDEGwFmoQeyAAQRI2AggDQAJAIAAoAghBA0gNACAAKAIMQfwUaiAAKAIILQDgbEECdGovAQINACAAIAAoAghBAWs2AggMAQsLIAAoAgwiASABKAKoLSAAKAIIQQNsQRFqajYCqC0gACgCCCEBIABBEGokACAEIAE2AhQgBCAEKAIsKAKoLUEKakEDdjYCHCAEIAQoAiwoAqwtQQpqQQN2NgIYIAQoAhggBCgCHE0EQCAEIAQoAhg2AhwLDAELIAQgBCgCJEEFaiIANgIYIAQgADYCHAsCQAJAIAQoAhwgBCgCJEEEakkNACAEKAIoRQ0AIAQoAiwgBCgCKCAEKAIkIAQoAiAQXAwBCwJAAkAgBCgCLCgCiAFBBEcEQCAEKAIYIAQoAhxHDQELIARBAzYCEAJAIAQoAiwoArwtQRAgBCgCEGtKBEAgBCAEKAIgQQJqNgIMIAQoAiwiACAALwG4LSAEKAIMQf//A3EgBCgCLCgCvC10cjsBuC0gBCgCLC8BuC1B/wFxIQEgBCgCLCgCCCECIAQoAiwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCLC8BuC1BCHYhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsIAQoAgxB//8DcUEQIAQoAiwoArwta3U7AbgtIAQoAiwiACAAKAK8LSAEKAIQQRBrajYCvC0MAQsgBCgCLCIAIAAvAbgtIAQoAiBBAmpB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsIgAgBCgCECAAKAK8LWo2ArwtCyAEKAIsQZDgAEGQ6QAQugEMAQsgBEEDNgIIAkAgBCgCLCgCvC1BECAEKAIIa0oEQCAEIAQoAiBBBGo2AgQgBCgCLCIAIAAvAbgtIAQoAgRB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsLwG4LUH/AXEhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsLwG4LUEIdiEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwgBCgCBEH//wNxQRAgBCgCLCgCvC1rdTsBuC0gBCgCLCIAIAAoArwtIAQoAghBEGtqNgK8LQwBCyAEKAIsIgAgAC8BuC0gBCgCIEEEakH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwiACAEKAIIIAAoArwtajYCvC0LIAQoAiwhASAEKAIsKAKcFkEBaiECIAQoAiwoAqgWQQFqIQMgBCgCFEEBaiEFIwBBQGoiACQAIAAgATYCPCAAIAI2AjggACADNgI0IAAgBTYCMCAAQQU2AigCQCAAKAI8KAK8LUEQIAAoAihrSgRAIAAgACgCOEGBAms2AiQgACgCPCIBIAEvAbgtIAAoAiRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCJEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAihBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCOEGBAmtB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCKCABKAK8LWo2ArwtCyAAQQU2AiACQCAAKAI8KAK8LUEQIAAoAiBrSgRAIAAgACgCNEEBazYCHCAAKAI8IgEgAS8BuC0gACgCHEH//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwvAbgtQf8BcSECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwvAbgtQQh2IQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPCAAKAIcQf//A3FBECAAKAI8KAK8LWt1OwG4LSAAKAI8IgEgASgCvC0gACgCIEEQa2o2ArwtDAELIAAoAjwiASABLwG4LSAAKAI0QQFrQf//A3EgACgCPCgCvC10cjsBuC0gACgCPCIBIAAoAiAgASgCvC1qNgK8LQsgAEEENgIYAkAgACgCPCgCvC1BECAAKAIYa0oEQCAAIAAoAjBBBGs2AhQgACgCPCIBIAEvAbgtIAAoAhRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCFEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAhhBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCMEEEa0H//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwiASAAKAIYIAEoArwtajYCvC0LIABBADYCLANAIAAoAiwgACgCMEgEQCAAQQM2AhACQCAAKAI8KAK8LUEQIAAoAhBrSgRAIAAgACgCPEH8FGogACgCLC0A4GxBAnRqLwECNgIMIAAoAjwiASABLwG4LSAAKAIMQf//A3EgACgCPCgCvC10cjsBuC0gACgCPC8BuC1B/wFxIQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPC8BuC1BCHYhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8IAAoAgxB//8DcUEQIAAoAjwoArwta3U7AbgtIAAoAjwiASABKAK8LSAAKAIQQRBrajYCvC0MAQsgACgCPCIBIAEvAbgtIAAoAjxB/BRqIAAoAiwtAOBsQQJ0ai8BAiAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCECABKAK8LWo2ArwtCyAAIAAoAixBAWo2AiwMAQsLIAAoAjwgACgCPEGUAWogACgCOEEBaxC4ASAAKAI8IAAoAjxBiBNqIAAoAjRBAWsQuAEgAEFAayQAIAQoAiwgBCgCLEGUAWogBCgCLEGIE2oQugELCyAEKAIsEL0BIAQoAiAEQCAEKAIsELwBCyAEQTBqJAAL1AEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhFOgAPAkAgAigCGEUEQCACIAIpAxCnEBgiADYCGCAARQRAIAJBADYCHAwCCwsgAkEYEBgiADYCCCAARQRAIAItAA9BAXEEQCACKAIYEBULIAJBADYCHAwBCyACKAIIQQE6AAAgAigCCCACKAIYNgIEIAIoAgggAikDEDcDCCACKAIIQgA3AxAgAigCCCACLQAPQQFxOgABIAIgAigCCDYCHAsgAigCHCEAIAJBIGokACAAC3gBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIEEB42AgQCQCABKAIERQRAIAFBADYCDAwBCyABIAEoAgQtAAAgASgCBC0AASABKAIELQACIAEoAgQtAANBCHRqQQh0akEIdGo2AgwLIAEoAgwhACABQRBqJAAgAAt/AQN/IAAhAQJAIABBA3EEQANAIAEtAABFDQIgAUEBaiIBQQNxDQALCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAeNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4cDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEUNACADKQMYQv///////////wBWDQAgAykDGFANASADKAIgDQELIAMoAiRBDGpBEkEAEBQgA0J/NwMoDAELIAMoAiQtADVBAXEEQCADQn83AygMAQsCfyMAQRBrIgAgAygCJDYCDCAAKAIMLQA0QQFxCwRAIANCADcDKAwBCyADKQMYUARAIANCADcDKAwBCyADQgA3AxADQCADKQMQIAMpAxhUBEAgAyADKAIkIAMoAiAgAykDEKdqIAMpAxggAykDEH1BARAhIgI3AwggAkIAUwRAIAMoAiRBAToANSADKQMQUARAIANCfzcDKAwECyADIAMpAxA3AygMAwsgAykDCFAEQCADKAIkQQE6ADQFIAMgAykDCCADKQMQfDcDEAwCCwsLIAMgAykDEDcDKAsgAykDKCECIANBMGokACACCzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRCCBAeNgIAAkAgASgCAEUEQCABQgA3AwgMAQsgASABKAIALQAArSABKAIALQAHrUI4hiABKAIALQAGrUIwhnwgASgCAC0ABa1CKIZ8IAEoAgAtAAStQiCGfCABKAIALQADrUIYhnwgASgCAC0AAq1CEIZ8IAEoAgAtAAGtQgiGfHw3AwgLIAEpAwghAiABQRBqJAAgAgumAQEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIKAIgRQRAIAEoAghBDGpBEkEAEBQgAUF/NgIMDAELIAEoAggiACAAKAIgQQFrNgIgIAEoAggoAiBFBEAgASgCCEEAQgBBAhAhGiABKAIIKAIABEAgASgCCCgCABAxQQBIBEAgASgCCEEMakEUQQAQFAsLCyABQQA2AgwLIAEoAgwhACABQRBqJAAgAAvwAgICfwF+AkAgAkUNACAAIAJqIgNBAWsgAToAACAAIAE6AAAgAkEDSQ0AIANBAmsgAToAACAAIAE6AAEgA0EDayABOgAAIAAgAToAAiACQQdJDQAgA0EEayABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUEEayAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBCGsgADYCACABQQxrIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQRBrIAA2AgAgAUEUayAANgIAIAFBGGsgADYCACABQRxrIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArUKBgICAEH4hBSABIANqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBIGsiAkEfSw0ACwsL3AEBAX8jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIoBEAgASgCDCgCKEEANgIoIAEoAgwoAihCADcDICABKAIMAn4gASgCDCkDGCABKAIMKQMgVgRAIAEoAgwpAxgMAQsgASgCDCkDIAs3AxgLIAEgASgCDCkDGDcDAANAIAEpAwAgASgCDCkDCFpFBEAgASgCDCgCACABKQMAp0EEdGooAgAQFSABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAgAQFSABKAIMKAIEEBUgASgCDBAVCyABQRBqJAALYAIBfwF+IwBBEGsiASQAIAEgADYCBAJAIAEoAgQoAiRBAUcEQCABKAIEQQxqQRJBABAUIAFCfzcDCAwBCyABIAEoAgRBAEIAQQ0QITcDCAsgASkDCCECIAFBEGokACACC6UCAQJ/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNwMIIAMoAhgoAgAhASADKAIUIQQgAykDCCECIwBBIGsiACQAIAAgATYCFCAAIAQ2AhAgACACNwMIAkACQCAAKAIUKAIkQQFGBEAgACkDCEL///////////8AWA0BCyAAKAIUQQxqQRJBABAUIABCfzcDGAwBCyAAIAAoAhQgACgCECAAKQMIQQsQITcDGAsgACkDGCECIABBIGokACADIAI3AwACQCACQgBTBEAgAygCGEEIaiADKAIYKAIAEBcgA0F/NgIcDAELIAMpAwAgAykDCFIEQCADKAIYQQhqQQZBGxAUIANBfzYCHAwBCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtrAQF/IwBBIGsiAiAANgIcIAJCASACKAIcrYY3AxAgAkEMaiABNgIAA0AgAiACKAIMIgBBBGo2AgwgAiAAKAIANgIIIAIoAghBAEhFBEAgAiACKQMQQgEgAigCCK2GhDcDEAwBCwsgAikDEAsvAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIIEBUgASgCDEEANgIIIAFBEGokAAvNAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIERQRAIAIoAghBDGpBEkEAEBQgAkF/NgIMDAELIAIoAgQQOyACKAIIKAIABEAgAigCCCgCACACKAIEEDhBAEgEQCACKAIIQQxqIAIoAggoAgAQFyACQX82AgwMAgsLIAIoAgggAigCBEI4QQMQIUIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAsxAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDBBdIAEoAgwQFQsgAUEQaiQAC98EAQF/IwBBIGsiAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAkEBNgIcDAELIAIgAigCGCgCADYCDAJAIAIoAhgoAggEQCACIAIoAhgoAgg2AhAMAQsgAkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILUgECf0GQlwEoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNACAAPwBBEHRLBEAgABATRQ0BC0GQlwEgADYCACABDwtBtJsBQTA2AgBBfwuNBQEDfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAEQCABKAIMKAIAEDEaIAEoAgwoAgAQGwsgASgCDCgCHBAVIAEoAgwoAiAQJSABKAIMKAIkECUgASgCDCgCUCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCEARAIABBADYCCANAIAAoAgggACgCDCgCAEkEQCAAKAIMKAIQIAAoAghBAnRqKAIABEAgACgCDCgC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A3EQHwsgAygCpAEoAhQgA0GeAWogA0GcAWoQgQEgAygCTCADLwGeARAfIAMoAkwgAy8BnAEQHwJAAkAgAy0AhQFBAXFFDQAgAygCpAEpAyhCFFoNACADKAJMQQAQIAwBCyADKAJMIAMoAqQBKAIYECALAkACQCADKAKgAUGAAnFBgAJHDQAgAygCpAEpAyBC/////w9UBEAgAygCpAEpAyhC/////w9UDQELIAMoAkxBfxAgIAMoAkxBfxAgDAELAkAgAygCpAEpAyBC/////w9UBEAgAygCTCADKAKkASkDIKcQIAwBCyADKAJMQX8QIAsCQCADKAKkASkDKEL/////D1QEQCADKAJMIAMoAqQBKQMopxAgDAELIAMoAkxBfxAgCwsgAygCTCADKAKkASgCMBBTQf//A3EQHyADIAMoAqQBKAI0IAMoAqABEIYBQf//A3EgAygCkAFBgAYQhgFB//8DcWo2AogBIAMoAkwgAygCiAFB//8DcRAfIAMoAqABQYACcUUEQCADKAJMIAMoAqQBKAI4EFNB//8DcRAfIAMoAkwgAygCpAEoAjxB//8DcRAfIAMoAkwgAygCpAEvAUAQHyADKAJMIAMoAqQBKAJEECACQCADKAKkASkDSEL/////D1QEQCADKAJMIAMoAqQBKQNIpxAgDAELIAMoAkxBfxAgCwsCfyMAQRBrIgAgAygCTDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAJMEBYgAygCkAEQIyADQX82AqwBDAELIAMoAqgBIANB0ABqAn4jAEEQayIAIAMoAkw2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACwsQNUEASARAIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCTBAWIAMoAqQBKAIwBEAgAygCqAEgAygCpAEoAjAQigFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABBEAgAygCqAEgAygCkAFBgAYQhQFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABECMgAygCpAEoAjQEQCADKAKoASADKAKkASgCNCADKAKgARCFAUEASARAIANBfzYCrAEMAgsLIAMoAqABQYACcUUEQCADKAKkASgCOARAIAMoAqgBIAMoAqQBKAI4EIoB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HCAAIAAoAhRBAWo2AhQMAQsLIAAoAggQR0EBcUUEQCAAKAIgQRRBABAUIAAoAggQFiAAQX82AiwMAQsgACgCCBAWIAAgACgCHDYCLAsgACgCLCECIABBMGokACADIAIiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFCADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC20BAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMAkAgBCgCGEUEQCAEQQA2AhwMAQsgBCAEKAIUIAQoAhAgBCgCDCAEKAIYQQhqEJIBNgIcCyAEKAIcIQAgBEEgaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAhGiABKAIMQQA2AiQLIAFBEGokAAumAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIIKAIABEAgAigCCCgCACACKAIEEGhBAEgEQCACKAIIQQxqIAIoAggoAgAQFyACQX82AgwMAgsLIAIoAgggAkEEakIEQRMQIUIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAuNCAIBfwF+IwBBkAFrIgMkACADIAA2AoQBIAMgATYCgAEgAyACNgJ8IAMQTwJAIAMoAoABKQMIQgBSBEAgAyADKAKAASgCACgCACkDSDcDYCADIAMoAoABKAIAKAIAKQNINwNoDAELIANCADcDYCADQgA3A2gLIANCADcDcAJAA0AgAykDcCADKAKAASkDCFQEQCADKAKAASgCACADKQNwp0EEdGooAgApA0ggAykDaFQEQCADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSDcDaAsgAykDaCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAyADKAKAASgCACADKQNwp0EEdGooAgApA0ggAygCgAEoAgAgAykDcKdBBHRqKAIAKQMgfCADKAKAASgCACADKQNwp0EEdGooAgAoAjAQU0H//wNxrXxCHnw3A1ggAykDWCADKQNgVgRAIAMgAykDWDcDYAsgAykDYCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAygChAEoAgAgAygCgAEoAgAgAykDcKdBBHRqKAIAKQNIQQAQJ0EASARAIAMoAnwgAygChAEoAgAQFyADQn83A4gBDAMLIAMgAygChAEoAgBBAEEBIAMoAnwQxgFCf1EEQCADEF0gA0J/NwOIAQwDCwJ/IAMoAoABKAIAIAMpA3CnQQR0aigCACEBIwBBEGsiACQAIAAgATYCCCAAIAM2AgQCQAJAAkAgACgCCC8BCiAAKAIELwEKSA0AIAAoAggoAhAgACgCBCgCEEcNACAAKAIIKAIUIAAoAgQoAhRHDQAgACgCCCgCMCAAKAIEKAIwEIsBDQELIABBfzYCDAwBCwJAAkAgACgCCCgCGCAAKAIEKAIYRw0AIAAoAggpAyAgACgCBCkDIFINACAAKAIIKQMoIAAoAgQpAyhRDQELAkACQCAAKAIELwEMQQhxRQ0AIAAoAgQoAhgNACAAKAIEKQMgQgBSDQAgACgCBCkDKFANAQsgAEF/NgIMDAILCyAAQQA2AgwLIAAoAgwhASAAQRBqJAAgAQsEQCADKAJ8QRVBABAUIAMQXSADQn83A4gBDAMFIAMoAoABKAIAIAMpA3CnQQR0aigCACgCNCADKAI0EIkBIQAgAygCgAEoAgAgAykDcKdBBHRqKAIAIAA2AjQgAygCgAEoAgAgAykDcKdBBHRqKAIAQQE6AAQgA0EANgI0IAMQXSADIAMpA3BCAXw3A3AMAgsACwsgAwJ+IAMpA2AgAykDaH1C////////////AFQEQCADKQNgIAMpA2h9DAELQv///////////wALNwOIAQsgAykDiAEhBCADQZABaiQAIAQL1AQBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAygCECEBIwBBEGsiACQAIAAgATYCCCAAQdgAEBg2AgQCQCAAKAIERQRAIAAoAghBDkEAEBQgAEEANgIMDAELIAAoAgghAiMAQRBrIgEkACABIAI2AgggAUEYEBgiAjYCBAJAIAJFBEAgASgCCEEOQQAQFCABQQA2AgwMAQsgASgCBEEANgIAIAEoAgRCADcDCCABKAIEQQA2AhAgASABKAIENgIMCyABKAIMIQIgAUEQaiQAIAAoAgQgAjYCUCACRQRAIAAoAgQQFSAAQQA2AgwMAQsgACgCBEEANgIAIAAoAgRBADYCBCMAQRBrIgEgACgCBEEIajYCDCABKAIMQQA2AgAgASgCDEEANgIEIAEoAgxBADYCCCAAKAIEQQA2AhggACgCBEEANgIUIAAoAgRBADYCHCAAKAIEQQA2AiQgACgCBEEANgIgIAAoAgRBADoAKCAAKAIEQgA3AzggACgCBEIANwMwIAAoAgRBADYCQCAAKAIEQQA2AkggACgCBEEANgJEIAAoAgRBADYCTCAAKAIEQQA2AlQgACAAKAIENgIMCyAAKAIMIQEgAEEQaiQAIAMgASIANgIMAkAgAEUEQCADQQA2AhwMAQsgAygCDCADKAIYNgIAIAMoAgwgAygCFDYCBCADKAIUQRBxBEAgAygCDCIAIAAoAhRBAnI2AhQgAygCDCIAIAAoAhhBAnI2AhgLIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC9UBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAAkAgBCkDEEL///////////8AVwRAIAQpAxBCgICAgICAgICAf1kNAQsgBCgCCEEEQT0QFCAEQX82AhwMAQsCfyAEKQMQIQEgBCgCDCEAIAQoAhgiAigCTEF/TARAIAIgASAAEKABDAELIAIgASAAEKABC0EASARAIAQoAghBBEG0mwEoAgAQFCAEQX82AhwMAQsgBEEANgIcCyAEKAIcIQAgBEEgaiQAIAALJABBACAAEAUiACAAQRtGGyIABH9BtJsBIAA2AgBBAAVBAAsaC3ABAX8jAEEQayIDJAAgAwJ/IAFBwABxRQRAQQAgAUGAgIQCcUGAgIQCRw0BGgsgAyACQQRqNgIMIAIoAgALNgIAIAAgAUGAgAJyIAMQECIAQYFgTwRAQbSbAUEAIABrNgIAQX8hAAsgA0EQaiQAIAALMwEBfwJ/IAAQByIBQWFGBEAgABARIQELIAFBgWBPCwR/QbSbAUEAIAFrNgIAQX8FIAELC2kBAn8CQCAAKAIUIAAoAhxNDQAgAEEAQQAgACgCJBEBABogACgCFA0AQX8PCyAAKAIEIgEgACgCCCICSQRAIAAgASACa6xBASAAKAIoEQ8AGgsgAEEANgIcIABCADcDECAAQgA3AgRBAAvaAwEGfyMAQRBrIgUkACAFIAI2AgwjAEGgAWsiBCQAIARBCGpBkIcBQZABEBkaIAQgADYCNCAEIAA2AhwgBEF+IABrIgNB/////wcgA0H/////B0kbIgY2AjggBCAAIAZqIgA2AiQgBCAANgIYIARBCGohACMAQdABayIDJAAgAyACNgLMASADQaABakEAQSgQMiADIAMoAswBNgLIAQJAQQAgASADQcgBaiADQdAAaiADQaABahBxQQBIDQAgACgCTEEATiEHIAAoAgAhAiAALABKQQBMBEAgACACQV9xNgIACyACQSBxIQgCfyAAKAIwBEAgACABIANByAFqIANB0ABqIANBoAFqEHEMAQsgAEHQADYCMCAAIANB0ABqNgIQIAAgAzYCHCAAIAM2AhQgACgCLCECIAAgAzYCLCAAIAEgA0HIAWogA0HQAGogA0GgAWoQcSACRQ0AGiAAQQBBACAAKAIkEQEAGiAAQQA2AjAgACACNgIsIABBADYCHCAAQQA2AhAgACgCFBogAEEANgIUQQALGiAAIAAoAgAgCHI2AgAgB0UNAAsgA0HQAWokACAGBEAgBCgCHCIAIAAgBCgCGEZrQQA6AAALIARBoAFqJAAgBUEQaiQAC4wSAg9/AX4jAEHQAGsiBSQAIAUgATYCTCAFQTdqIRMgBUE4aiEQQQAhAQNAAkAgDUEASA0AQf////8HIA1rIAFIBEBBtJsBQT02AgBBfyENDAELIAEgDWohDQsgBSgCTCIHIQECQAJAAkACQAJAAkACQAJAIAUCfwJAIActAAAiBgRAA0ACQAJAIAZB/wFxIgZFBEAgASEGDAELIAZBJUcNASABIQYDQCABLQABQSVHDQEgBSABQQJqIgg2AkwgBkEBaiEGIAEtAAIhDiAIIQEgDkElRg0ACwsgBiAHayEBIAAEQCAAIAcgARAiCyABDQ0gBSgCTCEBIAUoAkwsAAFBMGtBCk8NAyABLQACQSRHDQMgASwAAUEwayEPQQEhESABQQNqDAQLIAUgAUEBaiIINgJMIAEtAAEhBiAIIQEMAAsACyANIQsgAA0IIBFFDQJBASEBA0AgBCABQQJ0aigCACIABEAgAyABQQN0aiAAIAIQqAFBASELIAFBAWoiAUEKRw0BDAoLC0EBIQsgAUEKTw0IA0AgBCABQQJ0aigCAA0IIAFBAWoiAUEKRw0ACwwIC0F/IQ8gAUEBagsiATYCTEEAIQgCQCABLAAAIgxBIGsiBkEfSw0AQQEgBnQiBkGJ0QRxRQ0AA0ACQCAFIAFBAWoiCDYCTCABLAABIgxBIGsiAUEgTw0AQQEgAXQiAUGJ0QRxRQ0AIAEgBnIhBiAIIQEMAQsLIAghASAGIQgLAkAgDEEqRgRAIAUCfwJAIAEsAAFBMGtBCk8NACAFKAJMIgEtAAJBJEcNACABLAABQQJ0IARqQcABa0EKNgIAIAEsAAFBA3QgA2pBgANrKAIAIQpBASERIAFBA2oMAQsgEQ0IQQAhEUEAIQogAARAIAIgAigCACIBQQRqNgIAIAEoAgAhCgsgBSgCTEEBagsiATYCTCAKQX9KDQFBACAKayEKIAhBgMAAciEIDAELIAVBzABqEKcBIgpBAEgNBiAFKAJMIQELQX8hCQJAIAEtAABBLkcNACABLQABQSpGBEACQCABLAACQTBrQQpPDQAgBSgCTCIBLQADQSRHDQAgASwAAkECdCAEakHAAWtBCjYCACABLAACQQN0IANqQYADaygCACEJIAUgAUEEaiIBNgJMDAILIBENByAABH8gAiACKAIAIgFBBGo2AgAgASgCAAVBAAshCSAFIAUoAkxBAmoiATYCTAwBCyAFIAFBAWo2AkwgBUHMAGoQpwEhCSAFKAJMIQELQQAhBgNAIAYhEkF/IQsgASwAAEHBAGtBOUsNByAFIAFBAWoiDDYCTCABLAAAIQYgDCEBIAYgEkE6bGpB74IBai0AACIGQQFrQQhJDQALIAZBE0YNAiAGRQ0GIA9BAE4EQCAEIA9BAnRqIAY2AgAgBSADIA9BA3RqKQMANwNADAQLIAANAQtBACELDAULIAVBQGsgBiACEKgBIAUoAkwhDAwCCyAPQX9KDQMLQQAhASAARQ0ECyAIQf//e3EiDiAIIAhBgMAAcRshBkEAIQtBpAghDyAQIQgCQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQCAMQQFrLAAAIgFBX3EgASABQQ9xQQNGGyABIBIbIgFB2ABrDiEEEhISEhISEhIOEg8GDg4OEgYSEhISAgUDEhIJEgESEgQACwJAIAFBwQBrDgcOEgsSDg4OAAsgAUHTAEYNCQwRCyAFKQNAIRRBpAgMBQtBACEBAkACQAJAAkACQAJAAkAgEkH/AXEOCAABAgMEFwUGFwsgBSgCQCANNgIADBYLIAUoAkAgDTYCAAwVCyAFKAJAIA2sNwMADBQLIAUoAkAgDTsBAAwTCyAFKAJAIA06AAAMEgsgBSgCQCANNgIADBELIAUoAkAgDaw3AwAMEAsgCUEIIAlBCEsbIQkgBkEIciEGQfgAIQELIBAhByABQSBxIQ4gBSkDQCIUUEUEQANAIAdBAWsiByAUp0EPcUGAhwFqLQAAIA5yOgAAIBRCD1YhDCAUQgSIIRQgDA0ACwsgBSkDQFANAyAGQQhxRQ0DIAFBBHZBpAhqIQ9BAiELDAMLIBAhASAFKQNAIhRQRQRAA0AgAUEBayIBIBSnQQdxQTByOgAAIBRCB1YhByAUQgOIIRQgBw0ACwsgASEHIAZBCHFFDQIgCSAQIAdrIgFBAWogASAJSBshCQwCCyAFKQNAIhRCf1cEQCAFQgAgFH0iFDcDQEEBIQtBpAgMAQsgBkGAEHEEQEEBIQtBpQgMAQtBpghBpAggBkEBcSILGwshDyAUIBAQRCEHCyAGQf//e3EgBiAJQX9KGyEGAkAgBSkDQCIUQgBSDQAgCQ0AQQAhCSAQIQcMCgsgCSAUUCAQIAdraiIBIAEgCUgbIQkMCQsgBSgCQCIBQdgSIAEbIgdBACAJEKsBIgEgByAJaiABGyEIIA4hBiABIAdrIAkgARshCQwICyAJBEAgBSgCQAwCC0EAIQEgAEEgIApBACAGECYMAgsgBUEANgIMIAUgBSkDQD4CCCAFIAVBCGo2AkBBfyEJIAVBCGoLIQhBACEBAkADQCAIKAIAIgdFDQECQCAFQQRqIAcQqgEiB0EASCIODQAgByAJIAFrSw0AIAhBBGohCCAJIAEgB2oiAUsNAQwCCwtBfyELIA4NBQsgAEEgIAogASAGECYgAUUEQEEAIQEMAQtBACEIIAUoAkAhDANAIAwoAgAiB0UNASAFQQRqIAcQqgEiByAIaiIIIAFKDQEgACAFQQRqIAcQIiAMQQRqIQwgASAISw0ACwsgAEEgIAogASAGQYDAAHMQJiAKIAEgASAKSBshAQwFCyAAIAUrA0AgCiAJIAYgAUEXERkAIQEMBAsgBSAFKQNAPAA3QQEhCSATIQcgDiEGDAILQX8hCwsgBUHQAGokACALDwsgAEEgIAsgCCAHayIOIAkgCSAOSBsiDGoiCCAKIAggCkobIgEgCCAGECYgACAPIAsQIiAAQTAgASAIIAZBgIAEcxAmIABBMCAMIA5BABAmIAAgByAOECIgAEEgIAEgCCAGQYDAAHMQJgwACwALkAIBA38CQCABIAIoAhAiBAR/IAQFQQAhBAJ/IAIgAi0ASiIDQQFrIANyOgBKIAIoAgAiA0EIcQRAIAIgA0EgcjYCAEF/DAELIAJCADcCBCACIAIoAiwiAzYCHCACIAM2AhQgAiADIAIoAjBqNgIQQQALDQEgAigCEAsgAigCFCIFa0sEQCACIAAgASACKAIkEQEADwsCfyACLABLQX9KBEAgASEEA0AgASAEIgNFDQIaIAAgA0EBayIEai0AAEEKRw0ACyACIAAgAyACKAIkEQEAIgQgA0kNAiAAIANqIQAgAigCFCEFIAEgA2sMAQsgAQshBCAFIAAgBBAZGiACIAIoAhQgBGo2AhQgASEECyAEC0gCAX8BfiMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBCADKAIMQQhqEFchBCADQRBqJAAgBAt3AQF/IwBBEGsiASAANgIIIAFChSo3AwACQCABKAIIRQRAIAFBADYCDAwBCwNAIAEoAggtAAAEQCABIAEoAggtAACtIAEpAwBCIX58Qv////8PgzcDACABIAEoAghBAWo2AggMAQsLIAEgASkDAD4CDAsgASgCDAuHBQEBfyMAQTBrIgUkACAFIAA2AiggBSABNgIkIAUgAjcDGCAFIAM2AhQgBSAENgIQAkACQAJAIAUoAihFDQAgBSgCJEUNACAFKQMYQv///////////wBYDQELIAUoAhBBEkEAEBQgBUEAOgAvDAELIAUoAigoAgBFBEAgBSgCKEGAAiAFKAIQEFlBAXFFBEAgBUEAOgAvDAILCyAFIAUoAiQQdDYCDCAFIAUoAgwgBSgCKCgCAHA2AgggBSAFKAIoKAIQIAUoAghBAnRqKAIANgIEA0ACQCAFKAIERQ0AAkAgBSgCBCgCHCAFKAIMRw0AIAUoAiQgBSgCBCgCABBaDQACQAJAIAUoAhRBCHEEQCAFKAIEKQMIQn9SDQELIAUoAgQpAxBCf1ENAQsgBSgCEEEKQQAQFCAFQQA6AC8MBAsMAQsgBSAFKAIEKAIYNgIEDAELCyAFKAIERQRAIAVBIBAYIgA2AgQgAEUEQCAFKAIQQQ5BABAUIAVBADoALwwCCyAFKAIEIAUoAiQ2AgAgBSgCBCAFKAIoKAIQIAUoAghBAnRqKAIANgIYIAUoAigoAhAgBSgCCEECdGogBSgCBDYCACAFKAIEIAUoAgw2AhwgBSgCBEJ/NwMIIAUoAigiACAAKQMIQgF8NwMIAkAgBSgCKCIAKQMIuiAAKAIAuEQAAAAAAADoP6JkRQ0AIAUoAigoAgBBgICAgHhPDQAgBSgCKCAFKAIoKAIAQQF0IAUoAhAQWUEBcUUEQCAFQQA6AC8MAwsLCyAFKAIUQQhxBEAgBSgCBCAFKQMYNwMICyAFKAIEIAUpAxg3AxAgBUEBOgAvCyAFLQAvQQFxIQAgBUEwaiQAIAALWQIBfwF+AkACf0EAIABFDQAaIACtIAGtfiIDpyICIAAgAXJBgIAESQ0AGkF/IAIgA0IgiKcbCyICEBgiAEUNACAAQQRrLQAAQQNxRQ0AIABBACACEDILIAAL1BEBAX8jAEGwAWsiBiQAIAYgADYCqAEgBiABNgKkASAGIAI2AqABIAYgAzYCnAEgBiAENgKYASAGIAU2ApQBIAZBADYCkAEDQCAGKAKQAUEPS0UEQCAGQSBqIAYoApABQQF0akEAOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFPRQRAIAZBIGogBigCpAEgBigCjAFBAXRqLwEAQQF0aiIAIAAvAQBBAWo7AQAgBiAGKAKMAUEBajYCjAEMAQsLIAYgBigCmAEoAgA2AoABIAZBDzYChAEDQAJAIAYoAoQBQQFJDQAgBkEgaiAGKAKEAUEBdGovAQANACAGIAYoAoQBQQFrNgKEAQwBCwsgBigCgAEgBigChAFLBEAgBiAGKAKEATYCgAELAkAgBigChAFFBEAgBkHAADoAWCAGQQE6AFkgBkEAOwFaIAYoApwBIgEoAgAhACABIABBBGo2AgAgACAGQdgAaigBADYBACAGKAKcASIBKAIAIQAgASAAQQRqNgIAIAAgBkHYAGooAQA2AQAgBigCmAFBATYCACAGQQA2AqwBDAELIAZBATYCiAEDQAJAIAYoAogBIAYoAoQBTw0AIAZBIGogBigCiAFBAXRqLwEADQAgBiAGKAKIAUEBajYCiAEMAQsLIAYoAoABIAYoAogBSQRAIAYgBigCiAE2AoABCyAGQQE2AnQgBkEBNgKQAQNAIAYoApABQQ9NBEAgBiAGKAJ0QQF0NgJ0IAYgBigCdCAGQSBqIAYoApABQQF0ai8BAGs2AnQgBigCdEEASARAIAZBfzYCrAEMAwUgBiAGKAKQAUEBajYCkAEMAgsACwsCQCAGKAJ0QQBMDQAgBigCqAEEQCAGKAKEAUEBRg0BCyAGQX82AqwBDAELIAZBADsBAiAGQQE2ApABA0AgBigCkAFBD09FBEAgBigCkAFBAWpBAXQgBmogBigCkAFBAXQgBmovAQAgBkEgaiAGKAKQAUEBdGovAQBqOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFJBEAgBigCpAEgBigCjAFBAXRqLwEABEAgBigClAEhASAGKAKkASAGKAKMASICQQF0ai8BAEEBdCAGaiIDLwEAIQAgAyAAQQFqOwEAIABB//8DcUEBdCABaiACOwEACyAGIAYoAowBQQFqNgKMAQwBCwsCQAJAAkACQCAGKAKoAQ4CAAECCyAGIAYoApQBIgA2AkwgBiAANgJQIAZBFDYCSAwCCyAGQYDwADYCUCAGQcDwADYCTCAGQYECNgJIDAELIAZBgPEANgJQIAZBwPEANgJMIAZBADYCSAsgBkEANgJsIAZBADYCjAEgBiAGKAKIATYCkAEgBiAGKAKcASgCADYCVCAGIAYoAoABNgJ8IAZBADYCeCAGQX82AmAgBkEBIAYoAoABdDYCcCAGIAYoAnBBAWs2AlwCQAJAIAYoAqgBQQFGBEAgBigCcEHUBksNAQsgBigCqAFBAkcNASAGKAJwQdAETQ0BCyAGQQE2AqwBDAELA0AgBiAGKAKQASAGKAJ4azoAWQJAIAYoAkggBigClAEgBigCjAFBAXRqLwEAQQFqSwRAIAZBADoAWCAGIAYoApQBIAYoAowBQQF0ai8BADsBWgwBCwJAIAYoApQBIAYoAowBQQF0ai8BACAGKAJITwRAIAYgBigCTCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOgBYIAYgBigCUCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOwFaDAELIAZB4AA6AFggBkEAOwFaCwsgBkEBIAYoApABIAYoAnhrdDYCaCAGQQEgBigCfHQ2AmQgBiAGKAJkNgKIAQNAIAYgBigCZCAGKAJoazYCZCAGKAJUIAYoAmQgBigCbCAGKAJ4dmpBAnRqIAZB2ABqKAEANgEAIAYoAmQNAAsgBkEBIAYoApABQQFrdDYCaANAIAYoAmwgBigCaHEEQCAGIAYoAmhBAXY2AmgMAQsLAkAgBigCaARAIAYgBigCbCAGKAJoQQFrcTYCbCAGIAYoAmggBigCbGo2AmwMAQsgBkEANgJsCyAGIAYoAowBQQFqNgKMASAGQSBqIAYoApABQQF0aiIBLwEAQQFrIQAgASAAOwEAAkAgAEH//wNxRQRAIAYoApABIAYoAoQBRg0BIAYgBigCpAEgBigClAEgBigCjAFBAXRqLwEAQQF0ai8BADYCkAELAkAgBigCkAEgBigCgAFNDQAgBigCYCAGKAJsIAYoAlxxRg0AIAYoAnhFBEAgBiAGKAKAATYCeAsgBiAGKAJUIAYoAogBQQJ0ajYCVCAGIAYoApABIAYoAnhrNgJ8IAZBASAGKAJ8dDYCdANAAkAgBigChAEgBigCfCAGKAJ4ak0NACAGIAYoAnQgBkEgaiAGKAJ8IAYoAnhqQQF0ai8BAGs2AnQgBigCdEEATA0AIAYgBigCfEEBajYCfCAGIAYoAnRBAXQ2AnQMAQsLIAYgBigCcEEBIAYoAnx0ajYCcAJAAkAgBigCqAFBAUYEQCAGKAJwQdQGSw0BCyAGKAKoAUECRw0BIAYoAnBB0ARNDQELIAZBATYCrAEMBAsgBiAGKAJsIAYoAlxxNgJgIAYoApwBKAIAIAYoAmBBAnRqIAYoAnw6AAAgBigCnAEoAgAgBigCYEECdGogBigCgAE6AAEgBigCnAEoAgAgBigCYEECdGogBigCVCAGKAKcASgCAGtBAnU7AQILDAELCyAGKAJsBEAgBkHAADoAWCAGIAYoApABIAYoAnhrOgBZIAZBADsBWiAGKAJUIAYoAmxBAnRqIAZB2ABqKAEANgEACyAGKAKcASIAIAAoAgAgBigCcEECdGo2AgAgBigCmAEgBigCgAE2AgAgBkEANgKsAQsgBigCrAEhACAGQbABaiQAIAALsQIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIYKAIENgIMIAMoAgwgAygCEEsEQCADIAMoAhA2AgwLAkAgAygCDEUEQCADQQA2AhwMAQsgAygCGCIAIAAoAgQgAygCDGs2AgQgAygCFCADKAIYKAIAIAMoAgwQGRoCQCADKAIYKAIcKAIYQQFGBEAgAygCGCgCMCADKAIUIAMoAgwQPiEAIAMoAhggADYCMAwBCyADKAIYKAIcKAIYQQJGBEAgAygCGCgCMCADKAIUIAMoAgwQGiEAIAMoAhggADYCMAsLIAMoAhgiACADKAIMIAAoAgBqNgIAIAMoAhgiACADKAIMIAAoAghqNgIIIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC+0BAQF/IwBBEGsiASAANgIIAkACQAJAIAEoAghFDQAgASgCCCgCIEUNACABKAIIKAIkDQELIAFBATYCDAwBCyABIAEoAggoAhw2AgQCQAJAIAEoAgRFDQAgASgCBCgCACABKAIIRw0AIAEoAgQoAgRBKkYNASABKAIEKAIEQTlGDQEgASgCBCgCBEHFAEYNASABKAIEKAIEQckARg0BIAEoAgQoAgRB2wBGDQEgASgCBCgCBEHnAEYNASABKAIEKAIEQfEARg0BIAEoAgQoAgRBmgVGDQELIAFBATYCDAwBCyABQQA2AgwLIAEoAgwL0gQBAX8jAEEgayIDIAA2AhwgAyABNgIYIAMgAjYCFCADIAMoAhxB3BZqIAMoAhRBAnRqKAIANgIQIAMgAygCFEEBdDYCDANAAkAgAygCDCADKAIcKALQKEoNAAJAIAMoAgwgAygCHCgC0ChODQAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBOBEAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBHDQEgAygCHCADKAIMQQJ0akHgFmooAgAgAygCHEHYKGpqLQAAIAMoAhxB3BZqIAMoAgxBAnRqKAIAIAMoAhxB2Chqai0AAEoNAQsgAyADKAIMQQFqNgIMCyADKAIYIAMoAhBBAnRqLwEAIAMoAhggAygCHEHcFmogAygCDEECdGooAgBBAnRqLwEASA0AAkAgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEcNACADKAIQIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQAMAQsgAygCHEHcFmogAygCFEECdGogAygCHEHcFmogAygCDEECdGooAgA2AgAgAyADKAIMNgIUIAMgAygCDEEBdDYCDAwBCwsgAygCHEHcFmogAygCFEECdGogAygCEDYCAAvXEwEDfyMAQTBrIgIkACACIAA2AiwgAiABNgIoIAIgAigCKCgCADYCJCACIAIoAigoAggoAgA2AiAgAiACKAIoKAIIKAIMNgIcIAJBfzYCECACKAIsQQA2AtAoIAIoAixBvQQ2AtQoIAJBADYCGANAIAIoAhggAigCHEgEQAJAIAIoAiQgAigCGEECdGovAQAEQCACIAIoAhgiATYCECACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohACAEIAA2AtAoIABBAnQgA2ogATYCACACKAIYIAIoAixB2ChqakEAOgAADAELIAIoAiQgAigCGEECdGpBADsBAgsgAiACKAIYQQFqNgIYDAELCwNAIAIoAiwoAtAoQQJIBEACQCACKAIQQQJIBEAgAiACKAIQQQFqIgA2AhAMAQtBACEACyACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohASAEIAE2AtAoIAFBAnQgA2ogADYCACACIAA2AgwgAigCJCACKAIMQQJ0akEBOwEAIAIoAgwgAigCLEHYKGpqQQA6AAAgAigCLCIAIAAoAqgtQQFrNgKoLSACKAIgBEAgAigCLCIAIAAoAqwtIAIoAiAgAigCDEECdGovAQJrNgKsLQsMAQsLIAIoAiggAigCEDYCBCACIAIoAiwoAtAoQQJtNgIYA0AgAigCGEEBTgRAIAIoAiwgAigCJCACKAIYEHogAiACKAIYQQFrNgIYDAELCyACIAIoAhw2AgwDQCACIAIoAiwoAuAWNgIYIAIoAixB3BZqIQEgAigCLCIDKALQKCEAIAMgAEEBazYC0CggAigCLCAAQQJ0IAFqKAIANgLgFiACKAIsIAIoAiRBARB6IAIgAigCLCgC4BY2AhQgAigCGCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAhQhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIkIAIoAgxBAnRqIAIoAiQgAigCGEECdGovAQAgAigCJCACKAIUQQJ0ai8BAGo7AQAgAigCDCACKAIsQdgoamoCfyACKAIYIAIoAixB2Chqai0AACACKAIUIAIoAixB2Chqai0AAE4EQCACKAIYIAIoAixB2Chqai0AAAwBCyACKAIUIAIoAixB2Chqai0AAAtBAWo6AAAgAigCJCACKAIUQQJ0aiACKAIMIgA7AQIgAigCJCACKAIYQQJ0aiAAOwECIAIgAigCDCIAQQFqNgIMIAIoAiwgADYC4BYgAigCLCACKAIkQQEQeiACKAIsKALQKEECTg0ACyACKAIsKALgFiEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAighASMAQUBqIgAgAigCLDYCPCAAIAE2AjggACAAKAI4KAIANgI0IAAgACgCOCgCBDYCMCAAIAAoAjgoAggoAgA2AiwgACAAKAI4KAIIKAIENgIoIAAgACgCOCgCCCgCCDYCJCAAIAAoAjgoAggoAhA2AiAgAEEANgIEIABBADYCEANAIAAoAhBBD0wEQCAAKAI8QbwWaiAAKAIQQQF0akEAOwEAIAAgACgCEEEBajYCEAwBCwsgACgCNCAAKAI8QdwWaiAAKAI8KALUKEECdGooAgBBAnRqQQA7AQIgACAAKAI8KALUKEEBajYCHANAIAAoAhxBvQRIBEAgACAAKAI8QdwWaiAAKAIcQQJ0aigCADYCGCAAIAAoAjQgACgCNCAAKAIYQQJ0ai8BAkECdGovAQJBAWo2AhAgACgCECAAKAIgSgRAIAAgACgCIDYCECAAIAAoAgRBAWo2AgQLIAAoAjQgACgCGEECdGogACgCEDsBAiAAKAIYIAAoAjBMBEAgACgCPCAAKAIQQQF0akG8FmoiASABLwEAQQFqOwEAIABBADYCDCAAKAIYIAAoAiROBEAgACAAKAIoIAAoAhggACgCJGtBAnRqKAIANgIMCyAAIAAoAjQgACgCGEECdGovAQA7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EANAIAMpAxAgAykDCFpFBEAgAygCKCgCACADKQMQp0EEdGoQkAEgAyADKQMQQgF8NwMQDAELCyADKAIoIAMpAwgiATcDECADKAIoIAE3AwggA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALzAEBAX8jAEEgayICJAAgAiAANwMQIAIgATYCDCACQTAQGCIBNgIIAkAgAUUEQCACKAIMQQ5BABAUIAJBADYCHAwBCyACKAIIQQA2AgAgAigCCEIANwMQIAIoAghCADcDCCACKAIIQgA3AyAgAigCCEIANwMYIAIoAghBADYCKCACKAIIQQA6ACwgAigCCCACKQMQIAIoAgwQgwFBAXFFBEAgAigCCBAkIAJBADYCHAwBCyACIAIoAgg2AhwLIAIoAhwhASACQSBqJAAgAQvWAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIANBDGpCBBApNgIIAkAgAygCCEUEQCADQX82AhwMAQsDQCADKAIUBEAgAygCFCgCBCADKAIQcUGABnEEQCADKAIIQgAQLBogAygCCCADKAIULwEIEB8gAygCCCADKAIULwEKEB8CfyMAQRBrIgAgAygCCDYCDCAAKAIMLQAAQQFxRQsEQCADKAIYQQhqQRRBABAUIAMoAggQFiADQX82AhwMBAsgAygCGCADQQxqQgQQNUEASARAIAMoAggQFiADQX82AhwMBAsgAygCFC8BCgRAIAMoAhggAygCFCgCDCADKAIULwEKrRA1QQBIBEAgAygCCBAWIANBfzYCHAwFCwsLIAMgAygCFCgCADYCFAwBCwsgAygCCBAWIANBADYCHAsgAygCHCEAIANBIGokACAAC2gBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADsBBgNAIAIoAgwEQCACKAIMKAIEIAIoAghxQYAGcQRAIAIgAigCDC8BCiACLwEGQQRqajsBBgsgAiACKAIMKAIANgIMDAELCyACLwEGC/ABAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggAUEANgIEA0AgASgCDARAAkACQCABKAIMLwEIQfXGAUYNACABKAIMLwEIQfXgAUYNACABKAIMLwEIQYGyAkYNACABKAIMLwEIQQFHDQELIAEgASgCDCgCADYCACABKAIIIAEoAgxGBEAg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IAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCEASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQL0IWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJIQgQQHhogASgCSBAqBEAgASgCOEEBQQAQFCABQQA2AkwMAQsgASABKAJIEB1B//8Dca03AyggASABKAJIEB1B//8Dca03AyAgASkDICABKQMoUgRAIAEoAjhBE0EAEBQgAUEANgJMDAELIAEgASgCSBAqrTcDGCABIAEoAkgQKq03AxAgASkDECABKQMQIAEpAxh8VgRAIAEoAjhBBEEWEBQgAUEANgJMDAELIAEpAxAgASkDGHwgASkDQCABKQMIfFYEQCABKAI4QRVBABAUIAFBADYCTAwBCwJAIAEoAjxBBHFFDQAgASkDECABKQMYfCABKQNAIAEpAwh8UQ0AIAEoAjhBFUEAEBQgAUEANgJMDAELIAEgASkDICABKAI4EIQBIgU2AjQgBUUEQCABQQA2AkwMAQsgASgCNEEAOgAsIAEoAjQgASkDGDcDGCABKAI0IAEpAxA3AyAgASABKAI0NgJMCyABKAJMIQUgAUHQAGokACAAIAU2AlALIAAoAlBFBEAgAEEANgJsDAELIAAoAmQgACkDMEIUfBAsGiAAIAAoAmQQHTsBTiAAKAJQKQMgIAAoAlApAxh8IAApA1ggACkDMHxWBEAg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IAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEFwgAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQeBogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2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mwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgEL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQNwJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQcCABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQKwJ/IAEoAqQBBEAgASgCpAEQK0ECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEHAgASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMIQgSGIAgpAwAiA0I8iIQhAiAIKQMQIAgpAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIAhBIGokACACIAZCgICAgICAgICAf4OEvws5AwALrRcDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCQCABvSIYQn9XBEBBASESQa4IIRMgAZoiAb0hGAwBCyAEQYAQcQRAQQEhEkGxCCETDAELQbQIQa8IIARBAXEiEhshEyASRSEXCwJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECYgACATIBIQIiAAQeQLQbUSIAVBIHEiAxtBjw1BuRIgAxsgASABYhtBAxAiDAELIAlBEGohEAJAAn8CQCABIAlBLGoQqQEiASABoCIBRAAAAAAAAAAAYgRAIAkgCSgCLCIGQQFrNgIsIAVBIHIiFEHhAEcNAQwDCyAFQSByIhRB4QBGDQIgCSgCLCELQQYgAyADQQBIGwwBCyAJIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBQQYgAyADQQBIGwshCiAJQTBqIAlB0AJqIAtBAEgbIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQA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HCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCGCABKAIUSQtBAXENAAsgASgCKEGCAiABKAIUIAEoAhhrazYCYCABKAIoKAJgIAEoAigoAnRLBEAgASgCKCABKAIoKAJ0NgJgCwsLAkAgASgCKCgCYEEDTwRAIAEgASgCKCgCYEEDazoAEyABQQE7ARAgASgCKCICKAKkLSACKAKgLUEBdGogAS8BEDsBACABLQATIQMgASgCKCICKAKYLSEEIAIgAigCoC0iAkEBajYCoC0gAiAEaiADOgAAIAEgAS8BEEEBazsBECABKAIoIAEtABNB0N0Aai0AAEECdGpBmAlqIgIgAi8BAEEBajsBACABKAIoQYgTagJ/IAEvARBBgAJJBEAgAS8BEC0A0FkMAQsgAS8BEEEHdkGAAmotANBZC0ECdGoiAiACLwEAQQFqOwEAIAEgASgCKCgCoC0gASgCKCgCnC1BAWtGNgIgIAEoAigiAiACKAJ0IAEoAigoAmBrNgJ0IAEoAigiAiABKAIoKAJgIAIoAmxqNgJsIAEoAihBADYCYAwBCyABIAEoAigiAigCOCACKAJsai0AADoADyABKAIoIgIoAqQtIAIoAqAtQQF0akEAOwEAIAEtAA8hAyABKAIoIgIoApgtIQQgAiACKAKgLSICQQFqNgKgLSACIARqIAM6AAAgASgCKCABLQAPQQJ0aiICIAIvAZQBQQFqOwGUASABIAEoAigoAqAtIAEoAigoApwtQQFrRjYCICABKAIoIgIgAigCdEEBazYCdCABKAIoIgIgAigCbEEBajYCbAsgASgCIARAIAEoAigCfyABKAIoKAJcQQBOBEAgASgCKCgCOCABKAIoKAJcagwBC0EACyABKAIoKAJsIAEoAigoAlxrQQAQKCABKAIoIAEoAigoAmw2AlwgASgCKCgCABAcIAEoAigoAgAoAhBFBEAgAUEANgIsDAQLCwwBCwsgASgCKEEANgK0LSABKAIkQQRGBEAgASgCKAJ/IAEoAigoAlxBAE4EQCABKAIoKAI4IAEoAigoAlxqDAELQQALIAEoAigoAmwgASgCKCgCXGtBARAoIAEoAiggASgCKCgCbDYCXCABKAIoKAIAEBwgASgCKCgCACgCEEUEQCABQQI2AiwMAgsgAUEDNgIsDAELIAEoAigoAqAtBEAgASgCKAJ/IAEoAigoAlxBAE4EQCABKAIoKAI4IAEoAigoAlxqDAELQQALIAEoAigoAmwgASgCKCgCXGtBABAoIAEoAiggASgCKCgCbDYCXCABKAIoKAIAEBwgASgCKCgCACgCEEUEQCABQQA2AiwMAgsLIAFBATYCLAsgASgCLCECIAFBMGokACACDAELIAAoAiwgACgCNCAAKAIsKAKEAUEMbEGA7wBqKAIIEQMACwsLNgIEAkAgACgCBEECRwRAIAAoAgRBA0cNAQsgACgCLEGaBTYCBAsCQCAAKAIEBEAgACgCBEECRw0BCyAAKAI4KAIQRQRAIAAoAixBfzYCKAsgAEEANgI8DAILIAAoAgRBAUYEQAJAIAAoAjRBAUYEQCAAKAIsIQIjAEEgayIBJAAgASACNgIcIAFBAzYCGAJAIAEoAhwoArwtQRAgASgCGGtKBEAgAUECNgIUIAEoAhwiAiACLwG4LSABKAIUQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQMgASgCHCgCCCEEIAEoAhwiBigCFCECIAYgAkEBajYCFCACIARqIAM6AAAgASgCHC8BuC1BCHYhAyABKAIcKAIIIQQgASgCHCIGKAIUIQIgBiACQQFqNgIUIAIgBGogAzoAACABKAIcIAEoAhRB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiAiACKAK8LSABKAIYQRBrajYCvC0MAQsgASgCHCICIAIvAbgtQQIgASgCHCgCvC10cjsBuC0gASgCHCICIAEoAhggAigCvC1qNgK8LQsgAUGS6AAvAQA2AhACQCABKAIcKAK8LUEQIAEoAhBrSgRAIAFBkOgALwEANgIMIAEoAhwiAiACLwG4LSABKAIMQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQMgASgCHCgCCCEEIAEoAhwiBigCFCECIAYgAkEBajYCFCACIARqIAM6AAAgASgCHC8BuC1BCHYhAyABKAIcKAIIIQQgASgCHCIGKAIUIQIgBiACQQFqNgIUIAIgBGogAzoAACABKAIcIAEoAgxB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiAiACKAK8LSABKAIQQRBrajYCvC0MAQsgASgCHCICIAIvAbgtQZDoAC8BACABKAIcKAK8LXRyOwG4LSABKAIcIgIgASgCECACKAK8LWo2ArwtCyABKAIcELsBIAFBIGokAAwBCyAAKAI0QQVHBEAgACgCLEEAQQBBABBcIAAoAjRBA0YEQCAAKAIsKAJEIAAoAiwoAkxBAWtBAXRqQQA7AQAgACgCLCgCREEAIAAoAiwoAkxBAWtBAXQQMiAAKAIsKAJ0RQRAIAAoAixBADYCbCAAKAIsQQA2AlwgACgCLEEANgK0LQsLCwsgACgCOBAcIAAoAjgoAhBFBEAgACgCLEF/NgIoIABBADYCPAwDCwsLIAAoAjRBBEcEQCAAQQA2AjwMAQsgACgCLCgCGEEATARAIABBATYCPAwBCwJAIAAoAiwoAhhBAkYEQCAAKAI4KAIwQf8BcSECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAjgoAjBBCHZB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCMEEQdkH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAI4KAIwQRh2IQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCCEH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAI4KAIIQQh2Qf8BcSECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAjgoAghBEHZB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCCEEYdiECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAADAELIAAoAiwgACgCOCgCMEEQdhBMIAAoAiwgACgCOCgCMEH//wNxEEwLIAAoAjgQHCAAKAIsKAIYQQBKBEAgACgCLEEAIAAoAiwoAhhrNgIYCyAAIAAoAiwoAhRFNgI8CyAAKAI8IQEgAEFAayQAIAUgATYCCAwBCyAFKAIMQRBqIQEjAEHgAGsiACQAIAAgATYCWCAAQQI2AlQCQAJAAkAgACgCWBBLDQAgACgCWCgCDEUNACAAKAJYKAIADQEgACgCWCgCBEUNAQsgAEF+NgJcDAELIAAgACgCWCgCHDYCUCAAKAJQKAIEQb/+AEYEQCAAKAJQQcD+ADYCBAsgACAAKAJYKAIMNgJIIAAgACgCWCgCEDYCQCAAIAAoAlgoAgA2AkwgACAAKAJYKAIENgJEIAAgACgCUCgCPDYCPCAAIAAoAlAoAkA2AjggACAAKAJENgI0IAAgACgCQDYCMCAAQQA2AhADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAJQKAIEQbT+AGsOHwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fCyAAKAJQKAIMRQRAIAAoAlBBwP4ANgIEDCELA0AgACgCOEEQSQRAIAAoAkRFDSEgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLAkAgACgCUCgCDEECcUUNACAAKAI8QZ+WAkcNACAAKAJQKAIoRQRAIAAoAlBBDzYCKAtBAEEAQQAQGiEBIAAoAlAgATYCHCAAIAAoAjw6AAwgACAAKAI8QQh2OgANIAAoAlAoAhwgAEEMakECEBohASAAKAJQIAE2AhwgAEEANgI8IABBADYCOCAAKAJQQbX+ADYCBAwhCyAAKAJQQQA2AhQgACgCUCgCJARAIAAoAlAoAiRBfzYCMAsCQCAAKAJQKAIMQQFxBEAgACgCPEH/AXFBCHQgACgCPEEIdmpBH3BFDQELIAAoAlhBmgw2AhggACgCUEHR/gA2AgQMIQsgACgCPEEPcUEIRwRAIAAoAlhBmw82AhggACgCUEHR/gA2AgQMIQsgACAAKAI8QQR2NgI8IAAgACgCOEEEazYCOCAAIAAoAjxBD3FBCGo2AhQgACgCUCgCKEUEQCAAKAJQIAAoAhQ2AigLAkAgACgCFEEPTQRAIAAoAhQgACgCUCgCKE0NAQsgACgCWEGTDTYCGCAAKAJQQdH+ADYCBAwhCyAAKAJQQQEgACgCFHQ2AhhBAEEAQQAQPiEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG9/gBBv/4AIAAoAjxBgARxGzYCBCAAQQA2AjwgAEEANgI4DCALA0AgACgCOEEQSQRAIAAoAkRFDSAgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPDYCFCAAKAJQKAIUQf8BcUEIRwRAIAAoAlhBmw82AhggACgCUEHR/gA2AgQMIAsgACgCUCgCFEGAwANxBEAgACgCWEGgCTYCGCAAKAJQQdH+ADYCBAwgCyAAKAJQKAIkBEAgACgCUCgCJCAAKAI8QQh2QQFxNgIACwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAKAJQKAIcIABBDGpBAhAaIQEgACgCUCABNgIcCyAAQQA2AjwgAEEANgI4IAAoAlBBtv4ANgIECwNAIAAoAjhBIEkEQCAAKAJERQ0fIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAKAJQKAIkBEAgACgCUCgCJCAAKAI8NgIECwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAIAAoAjxBEHY6AA4gACAAKAI8QRh2OgAPIAAoAlAoAhwgAEEMakEEEBohASAAKAJQIAE2AhwLIABBADYCPCAAQQA2AjggACgCUEG3/gA2AgQLA0AgACgCOEEQSQRAIAAoAkRFDR4gACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAoAiQEQCAAKAJQKAIkIAAoAjxB/wFxNgIIIAAoAlAoAiQgACgCPEEIdjYCDAsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAgACgCPDoADCAAIAAoAjxBCHY6AA0gACgCUCgCHCAAQQxqQQIQGiEBIAAoAlAgATYCHAsgAEEANgI8IABBADYCOCAAKAJQQbj+ADYCBAsCQCAAKAJQKAIUQYAIcQRAA0AgACgCOEEQSQRAIAAoAkRFDR8gACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPDYCRCAAKAJQKAIkBEAgACgCUCgCJCAAKAI8NgIUCwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAKAJQKAIcIABBDGpBAhAaIQEgACgCUCABNgIcCyAAQQA2AjwgAEEANgI4DAELIAAoAlAoAiQEQCAAKAJQKAIkQQA2AhALCyAAKAJQQbn+ADYCBAsgACgCUCgCFEGACHEEQCAAIAAoAlAoAkQ2AiwgACgCLCAAKAJESwRAIAAgACgCRDYCLAsgACgCLARAAkAgACgCUCgCJEUNACAAKAJQKAIkKAIQRQ0AIAAgACgCUCgCJCgCFCAAKAJQKAJEazYCFCAAKAJQKAIkKAIQIAAoAhRqIAAoAkwCfyAAKAJQKAIkKAIYIAAoAhQgACgCLGpJBEAgACgCUCgCJCgCGCAAKAIUawwBCyAAKAIsCxAZGgsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAoAlAoAhwgACgCTCAAKAIsEBohASAAKAJQIAE2AhwLIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACgCUCIBIAEoAkQgACgCLGs2AkQLIAAoAlAoAkQNGwsgACgCUEEANgJEIAAoAlBBuv4ANgIECwJAIAAoAlAoAhRBgBBxBEAgACgCREUNGyAAQQA2AiwDQCAAKAJMIQEgACAAKAIsIgJBAWo2AiwgACABIAJqLQAANgIUAkAgACgCUCgCJEUNACAAKAJQKAIkKAIcRQ0AIAAoAlAoAkQgACgCUCgCJCgCIE8NACAAKAIUIQIgACgCUCgCJCgCHCEDIAAoAlAiBCgCRCEBIAQgAUEBajYCRCABIANqIAI6AAALIAAoAhQEfyAAKAIsIAAoAkRJBUEAC0EBcQ0ACwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACgCUCgCHCAAKAJMIAAoAiwQGiEBIAAoAlAgATYCHAsgACAAKAJEIAAoAixrNgJEIAAgACgCLCAAKAJMajYCTCAAKAIUDRsMAQsgACgCUCgCJARAIAAoAlAoAiRBADYCHAsLIAAoAlBBADYCRCAAKAJQQbv+ADYCBAsCQCAAKAJQKAIUQYAgcQRAIAAoAkRFDRogAEEANgIsA0AgACgCTCEBIAAgACgCLCICQQFqNgIsIAAgASACai0AADYCFAJAIAAoAlAoAiRFDQAgACgCUCgCJCgCJEUNACAAKAJQKAJEIAAoAlAoAiQoAihPDQAgACgCFCECIAAoAlAoAiQoAiQhAyAAKAJQIgQoAkQhASAEIAFBAWo2AkQgASADaiACOgAACyAAKAIUBH8gACgCLCAAKAJESQVBAAtBAXENAAsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAoAlAoAhwgACgCTCAAKAIsEBohASAAKAJQIAE2AhwLIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACgCFA0aDAELIAAoAlAoAiQEQCAAKAJQKAIkQQA2AiQLCyAAKAJQQbz+ADYCBAsgACgCUCgCFEGABHEEQANAIAAoAjhBEEkEQCAAKAJERQ0aIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCwJAIAAoAlAoAgxBBHFFDQAgACgCPCAAKAJQKAIcQf//A3FGDQAgACgCWEH7DDYCGCAAKAJQQdH+ADYCBAwaCyAAQQA2AjwgAEEANgI4CyAAKAJQKAIkBEAgACgCUCgCJCAAKAJQKAIUQQl1QQFxNgIsIAAoAlAoAiRBATYCMAtBAEEAQQAQGiEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG//gA2AgQMGAsDQCAAKAI4QSBJBEAgACgCREUNGCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCUCAAKAI8QQh2QYD+A3EgACgCPEEYdmogACgCPEGA/gNxQQh0aiAAKAI8Qf8BcUEYdGoiATYCHCAAKAJYIAE2AjAgAEEANgI8IABBADYCOCAAKAJQQb7+ADYCBAsgACgCUCgCEEUEQCAAKAJYIAAoAkg2AgwgACgCWCAAKAJANgIQIAAoAlggACgCTDYCACAAKAJYIAAoAkQ2AgQgACgCUCAAKAI8NgI8IAAoAlAgACgCODYCQCAAQQI2AlwMGAtBAEEAQQAQPiEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG//gA2AgQLIAAoAlRBBUYNFCAAKAJUQQZGDRQLIAAoAlAoAggEQCAAIAAoAjwgACgCOEEHcXY2AjwgACAAKAI4IAAoAjhBB3FrNgI4IAAoAlBBzv4ANgIEDBULA0AgACgCOEEDSQRAIAAoAkRFDRUgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPEEBcTYCCCAAIAAoAjxBAXY2AjwgACAAKAI4QQFrNgI4AkACQAJAAkACQCAAKAI8QQNxDgQAAQIDBAsgACgCUEHB/gA2AgQMAwsjAEEQayIBIAAoAlA2AgwgASgCDEGw8gA2AlAgASgCDEEJNgJYIAEoAgxBsIIBNgJUIAEoAgxBBTYCXCAAKAJQQcf+ADYCBCAAKAJUQQZGBEAgACAAKAI8QQJ2NgI8IAAgACgCOEECazYCOAwXCwwCCyAAKAJQQcT+ADYCBAwBCyAAKAJYQfANNgIYIAAoAlBB0f4ANgIECyAAIAAoAjxBAnY2AjwgACAAKAI4QQJrNgI4DBQLIAAgACgCPCAAKAI4QQdxdjYCPCAAIAAoAjggACgCOEEHcWs2AjgDQCAAKAI4QSBJBEAgACgCREUNFCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCPEH//wNxIAAoAjxBEHZB//8Dc0cEQCAAKAJYQaEKNgIYIAAoAlBB0f4ANgIEDBQLIAAoAlAgACgCPEH//wNxNgJEIABBADYCPCAAQQA2AjggACgCUEHC/gA2AgQgACgCVEEGRg0SCyAAKAJQQcP+ADYCBAsgACAAKAJQKAJENgIsIAAoAiwEQCAAKAIsIAAoAkRLBEAgACAAKAJENgIsCyAAKAIsIAAoAkBLBEAgACAAKAJANgIsCyAAKAIsRQ0RIAAoAkggACgCTCAAKAIsEBkaIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACAAKAJAIAAoAixrNgJAIAAgACgCLCAAKAJIajYCSCAAKAJQIgEgASgCRCAAKAIsazYCRAwSCyAAKAJQQb/+ADYCBAwRCwNAIAAoAjhBDkkEQCAAKAJERQ0RIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAKAJQIAAoAjxBH3FBgQJqNgJkIAAgACgCPEEFdjYCPCAAIAAoAjhBBWs2AjggACgCUCAAKAI8QR9xQQFqNgJoIAAgACgCPEEFdjYCPCAAIAAoAjhBBWs2AjggACgCUCAAKAI8QQ9xQQRqNgJgIAAgACgCPEEEdjYCPCAAIAAoAjhBBGs2AjgCQCAAKAJQKAJkQZ4CTQRAIAAoAlAoAmhBHk0NAQsgACgCWEH9CTYCGCAAKAJQQdH+ADYCBAwRCyAAKAJQQQA2AmwgACgCUEHF/gA2AgQLA0AgACgCUCgCbCAAKAJQKAJgSQRAA0AgACgCOEEDSQRAIAAoAkRFDRIgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAjxBB3EhAiAAKAJQQfQAaiEDIAAoAlAiBCgCbCEBIAQgAUEBajYCbCABQQF0QYDyAGovAQBBAXQgA2ogAjsBACAAIAAoAjxBA3Y2AjwgACAAKAI4QQNrNgI4DAELCwNAIAAoAlAoAmxBE0kEQCAAKAJQQfQAaiECIAAoAlAiAygCbCEBIAMgAUEBajYCbCABQQF0QYDyAGovAQBBAXQgAmpBADsBAAwBCwsgACgCUCAAKAJQQbQKajYCcCAAKAJQIAAoAlAoAnA2AlAgACgCUEEHNgJYIABBACAAKAJQQfQAakETIAAoAlBB8ABqIAAoAlBB2ABqIAAoAlBB9AVqEHc2AhAgACgCEARAIAAoAlhBhwk2AhggACgCUEHR/gA2AgQMEAsgACgCUEEANgJsIAAoAlBBxv4ANgIECwNAAkAgACgCUCgCbCAAKAJQKAJkIAAoAlAoAmhqTw0AA0ACQCAAIAAoAlAoAlAgACgCPEEBIAAoAlAoAlh0QQFrcUECdGooAQA2ASAgAC0AISAAKAI4TQ0AIAAoAkRFDREgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLAkAgAC8BIkEQSQRAIAAgACgCPCAALQAhdjYCPCAAIAAoAjggAC0AIWs2AjggAC8BIiECIAAoAlBB9ABqIQMgACgCUCIEKAJsIQEgBCABQQFqNgJsIAFBAXQgA2ogAjsBAAwBCwJAIAAvASJBEEYEQANAIAAoAjggAC0AIUECakkEQCAAKAJERQ0UIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAIAAoAjwgAC0AIXY2AjwgACAAKAI4IAAtACFrNgI4IAAoAlAoAmxFBEAgACgCWEHPCTYCGCAAKAJQQdH+ADYCBAwECyAAIAAoAlAgACgCUCgCbEEBdGovAXI2AhQgACAAKAI8QQNxQQNqNgIsIAAgACgCPEECdjYCPCAAIAAoAjhBAms2AjgMAQsCQCAALwEiQRFGBEADQCAAKAI4IAAtACFBA2pJBEAgACgCREUNFSAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACAAKAI8IAAtACF2NgI8IAAgACgCOCAALQAhazYCOCAAQQA2AhQgACAAKAI8QQdxQQNqNgIsIAAgACgCPEEDdjYCPCAAIAAoAjhBA2s2AjgMAQsDQCAAKAI4IAAtACFBB2pJBEAgACgCREUNFCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACAAKAI8IAAtACF2NgI8IAAgACgCOCAALQAhazYCOCAAQQA2AhQgACAAKAI8Qf8AcUELajYCLCAAIAAoAjxBB3Y2AjwgACAAKAI4QQdrNgI4CwsgACgCUCgCbCAAKAIsaiAAKAJQKAJkIAAoAlAoAmhqSwRAIAAoAlhBzwk2AhggACgCUEHR/gA2AgQMAgsDQCAAIAAoAiwiAUEBazYCLCABBEAgACgCFCECIAAoAlBB9ABqIQMgACgCUCIEKAJsIQEgBCABQQFqNgJsIAFBAXQgA2ogAjsBAAwBCwsLDAELCyAAKAJQKAIEQdH+AEYNDiAAKAJQLwH0BEUEQCAAKAJYQfULNgIYIAAoAlBB0f4ANgIEDA8LIAAoAlAgACgCUEG0Cmo2AnAgACgCUCAAKAJQKAJwNgJQIAAoAlBBCTYCWCAAQQEgACgCUEH0AGogACgCUCgCZCAAKAJQQfAAaiAAKAJQQdgAaiAAKAJQQfQFahB3NgIQIAAoAhAEQCAAKAJYQesINgIYIAAoAlBB0f4ANgIEDA8LIAAoAlAgACgCUCgCcDYCVCAAKAJQQQY2AlwgAEECIAAoAlBB9ABqIAAoAlAoAmRBAXRqIAAoAlAoAmggACgCUEHwAGogACgCUEHcAGogACgCUEH0BWoQdzYCECAAKAIQBEAgACgCWEG5CTYCGCAAKAJQQdH+ADYCBAwPCyAAKAJQQcf+ADYCBCAAKAJUQQZGDQ0LIAAoAlBByP4ANgIECwJAIAAoAkRBBkkNACAAKAJAQYICSQ0AIAAoAlggACgCSDYCDCAAKAJYIAAoAkA2AhAgACgCWCAAKAJMNgIAIAAoAlggACgCRDYCBCAAKAJQIAAoAjw2AjwgACgCUCAAKAI4NgJAIAAoAjAhAiMAQeAAayIBIAAoAlg2AlwgASACNgJYIAEgASgCXCgCHDYCVCABIAEoAlwoAgA2AlAgASABKAJQIAEoAlwoAgRBBWtqNgJMIAEgASgCXCgCDDYCSCABIAEoAkggASgCWCABKAJcKAIQa2s2AkQgASABKAJIIAEoAlwoAhBBgQJrajYCQCABIAEoAlQoAiw2AjwgASABKAJUKAIwNgI4IAEgASgCVCgCNDYCNCABIAEoAlQoAjg2AjAgASABKAJUKAI8NgIsIAEgASgCVCgCQDYCKCABIAEoAlQoAlA2AiQgASABKAJUKAJUNgIgIAFBASABKAJUKAJYdEEBazYCHCABQQEgASgCVCgCXHRBAWs2AhgDQCABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiQgASgCLCABKAIccUECdGooAQA2ARACQAJAA0AgASABLQARNgIMIAEgASgCLCABKAIMdjYCLCABIAEoAiggASgCDGs2AiggASABLQAQNgIMIAEoAgxFBEAgAS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgi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ZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AbmFuAC9kZXYvdXJhbmRvbQBpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2sAaW5jb3JyZWN0IGhlYWRlciBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAGluY29ycmVjdCBkYXRhIGNoZWNrAGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrAGhlYWRlciBjcmMgbWlzbWF0Y2gAaW5mAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABPcGVyYXRpb24gbm90IHN1cHBvcnRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAEVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQAQ29udGFpbmluZyB6aXAgYXJjaGl2ZSB3YXMgY2xvc2VkAENsb3NpbmcgemlwIGFyY2hpdmUgZmFpbGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAFVua25vd24gZXJyb3IgJWQAcmIAcitiAHJ3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CADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";yz(Rp)||(Rp=dxe(Rp));function Kxe(t){try{if(t==Rp&&lP)return new Uint8Array(lP);var e=sz(t);if(e)return e;if(aP)return aP(t);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(r){Gr(r)}}function Uxe(t,e){var r,i,n;try{n=Kxe(t),i=new WebAssembly.Module(n),r=new WebAssembly.Instance(i,e)}catch(o){var s=o.toString();throw Di("failed to compile wasm module: "+s),(s.includes("imported Memory")||s.includes("memory import"))&&Di("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),o}return[r,i]}function Gxe(){var t={a:Hxe};function e(n,s){var o=n.exports;oe.asm=o,ew=oe.asm.u,pz(ew.buffer),fP=oe.asm.za,Mxe(oe.asm.v),dP("wasm-instantiate")}if(Iz("wasm-instantiate"),oe.instantiateWasm)try{var r=oe.instantiateWasm(t,e);return r}catch(n){return Di("Module.instantiateWasm callback failed with error: "+n),!1}var i=Uxe(Rp,t);return e(i[0]),oe.asm}var ai,ya;function hP(t){for(;t.length>0;){var e=t.shift();if(typeof e=="function"){e(oe);continue}var r=e.func;typeof r=="number"?e.arg===void 0?fP.get(r)():fP.get(r)(e.arg):r(e.arg===void 0?null:e.arg)}}function iw(t,e){var r=new Date(_e[t>>2]*1e3);_e[e>>2]=r.getUTCSeconds(),_e[e+4>>2]=r.getUTCMinutes(),_e[e+8>>2]=r.getUTCHours(),_e[e+12>>2]=r.getUTCDate(),_e[e+16>>2]=r.getUTCMonth(),_e[e+20>>2]=r.getUTCFullYear()-1900,_e[e+24>>2]=r.getUTCDay(),_e[e+36>>2]=0,_e[e+32>>2]=0;var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[e+28>>2]=n,iw.GMTString||(iw.GMTString=uP("GMT")),_e[e+40>>2]=iw.GMTString,e}function jxe(t,e){return iw(t,e)}var yt={splitPath:function(t){var e=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return e.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];n==="."?t.splice(i,1):n===".."?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e=t.charAt(0)==="/",r=t.substr(-1)==="/";return t=yt.normalizeArray(t.split("/").filter(function(i){return!!i}),!e).join("/"),!t&&!e&&(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=yt.splitPath(t),r=e[0],i=e[1];return!r&&!i?".":(i&&(i=i.substr(0,i.length-1)),r+i)},basename:function(t){if(t==="/")return"/";t=yt.normalize(t),t=t.replace(/\/$/,"");var e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)},extname:function(t){return yt.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return yt.normalize(t.join("/"))},join2:function(t,e){return yt.normalize(t+"/"+e)}};function Yxe(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}else if(Wl)try{var e=require("crypto");return function(){return e.randomBytes(1)[0]}}catch(r){}return function(){Gr("randomDevice")}}var wa={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:y.cwd();if(typeof i!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";t=i+"/"+t,e=i.charAt(0)==="/"}return t=yt.normalizeArray(t.split("/").filter(function(n){return!!n}),!e).join("/"),(e?"/":"")+t||"."},relative:function(t,e){t=wa.resolve(t).substr(1),e=wa.resolve(e).substr(1);function r(c){for(var u=0;u=0&&c[g]==="";g--);return u>g?[]:c.slice(u,g-u+1)}for(var i=r(t.split("/")),n=r(e.split("/")),s=Math.min(i.length,n.length),o=s,a=0;a0?e=i.slice(0,n).toString("utf-8"):e=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(e=window.prompt("Input: "),e!==null&&(e+=` +`)):typeof readline=="function"&&(e=readline(),e!==null&&(e+=` +`));if(!e)return null;t.input=CP(e,!0)}return t.input.shift()},put_char:function(t,e){e===null||e===10?($y(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&($y(Zu(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){e===null||e===10?(Di(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(Di(Zu(t.output,0)),t.output=[])}}};function mP(t){for(var e=mxe(t,65536),r=hz(e);t=e)){var i=1024*1024;e=Math.max(e,r*(r>>0),r!=0&&(e=Math.max(e,256));var n=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(n.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(e==0)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=y.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,y.isDir(t.mode)?e.size=4096:y.isFile(t.mode)?e.size=t.usedBytes:y.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){e.mode!==void 0&&(t.mode=e.mode),e.timestamp!==void 0&&(t.timestamp=e.timestamp),e.size!==void 0&&pt.resizeFileStorage(t,e.size)},lookup:function(t,e){throw y.genericErrors[44]},mknod:function(t,e,r,i){return pt.createNode(t,e,r,i)},rename:function(t,e,r){if(y.isDir(t.mode)){var i;try{i=y.lookupNode(e,r)}catch(s){}if(i)for(var n in i.contents)throw new y.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=y.lookupNode(t,e);for(var i in r.contents)throw new y.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)!t.contents.hasOwnProperty(r)||e.push(r);return e},symlink:function(t,e,r){var i=pt.createNode(t,e,511|40960,0);return i.link=r,i},readlink:function(t){if(!y.isLink(t.mode))throw new y.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,i,n){var s=t.node.contents;if(n>=t.node.usedBytes)return 0;var o=Math.min(t.node.usedBytes-n,i);if(o>8&&s.subarray)e.set(s.subarray(n,n+o),r);else for(var a=0;a0||i+r>2)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}return e.mode},realPath:function(t){for(var e=[];t.parent!==t;)e.push(t.name),t=t.parent;return e.push(t.mount.opts.root),e.reverse(),yt.join.apply(null,e)},flagsForNode:function(t){t&=~2097152,t&=~2048,t&=~32768,t&=~524288;var e=0;for(var r in tt.flagsForNodeMap)t&r&&(e|=tt.flagsForNodeMap[r],t^=r);if(t)throw new y.ErrnoError(28);return e},node_ops:{getattr:function(t){var e=tt.realPath(t),r;try{r=ft.lstatSync(e)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}return tt.isWindows&&!r.blksize&&(r.blksize=4096),tt.isWindows&&!r.blocks&&(r.blocks=(r.size+r.blksize-1)/r.blksize|0),{dev:r.dev,ino:r.ino,mode:r.mode,nlink:r.nlink,uid:r.uid,gid:r.gid,rdev:r.rdev,size:r.size,atime:r.atime,mtime:r.mtime,ctime:r.ctime,blksize:r.blksize,blocks:r.blocks}},setattr:function(t,e){var r=tt.realPath(t);try{if(e.mode!==void 0&&(ft.chmodSync(r,e.mode),t.mode=e.mode),e.timestamp!==void 0){var i=new Date(e.timestamp);ft.utimesSync(r,i,i)}e.size!==void 0&&ft.truncateSync(r,e.size)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},lookup:function(t,e){var r=yt.join2(tt.realPath(t),e),i=tt.getMode(r);return tt.createNode(t,e,i)},mknod:function(t,e,r,i){var n=tt.createNode(t,e,r,i),s=tt.realPath(n);try{y.isDir(n.mode)?ft.mkdirSync(s,n.mode):ft.writeFileSync(s,"",{mode:n.mode})}catch(o){throw o.code?new y.ErrnoError(tt.convertNodeCode(o)):o}return n},rename:function(t,e,r){var i=tt.realPath(t),n=yt.join2(tt.realPath(e),r);try{ft.renameSync(i,n)}catch(s){throw s.code?new y.ErrnoError(tt.convertNodeCode(s)):s}t.name=r},unlink:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.unlinkSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},rmdir:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.rmdirSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},readdir:function(t){var e=tt.realPath(t);try{return ft.readdirSync(e)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},symlink:function(t,e,r){var i=yt.join2(tt.realPath(t),e);try{ft.symlinkSync(r,i)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},readlink:function(t){var e=tt.realPath(t);try{return e=ft.readlinkSync(e),e=IP.relative(IP.resolve(t.mount.opts.root),e),e}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}}},stream_ops:{open:function(t){var e=tt.realPath(t.node);try{y.isFile(t.node.mode)&&(t.nfd=ft.openSync(e,tt.flagsForNode(t.flags)))}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},close:function(t){try{y.isFile(t.node.mode)&&t.nfd&&ft.closeSync(t.nfd)}catch(e){throw e.code?new y.ErrnoError(tt.convertNodeCode(e)):e}},read:function(t,e,r,i,n){if(i===0)return 0;try{return ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},write:function(t,e,r,i,n){try{return ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},llseek:function(t,e,r){var i=e;if(r===1)i+=t.position;else if(r===2&&y.isFile(t.node.mode))try{var n=ft.fstatSync(t.nfd);i+=n.size}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}if(i<0)throw new y.ErrnoError(28);return i},mmap:function(t,e,r,i,n,s){if(e!==0)throw new y.ErrnoError(28);if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);var o=mP(r);return tt.stream_ops.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);if(n&2)return 0;var s=tt.stream_ops.write(t,e,0,i,r,!1);return 0}}},wz={lookupPath:function(t){return{path:t,node:{mode:tt.getMode(t)}}},createStandardStreams:function(){y.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var t=1;t<3;t++)y.streams[t]={fd:t,nfd:t,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(t,e){y.isDir(t)?ft.mkdirSync(t,e):ft.writeFileSync(t,"",{mode:e})},mkdir:function(){ft.mkdirSync.apply(void 0,arguments)},symlink:function(){ft.symlinkSync.apply(void 0,arguments)},rename:function(){ft.renameSync.apply(void 0,arguments)},rmdir:function(){ft.rmdirSync.apply(void 0,arguments)},readdir:function(){ft.readdirSync.apply(void 0,arguments)},unlink:function(){ft.unlinkSync.apply(void 0,arguments)},readlink:function(){return ft.readlinkSync.apply(void 0,arguments)},stat:function(){return ft.statSync.apply(void 0,arguments)},lstat:function(){return ft.lstatSync.apply(void 0,arguments)},chmod:function(){ft.chmodSync.apply(void 0,arguments)},fchmod:function(){ft.fchmodSync.apply(void 0,arguments)},chown:function(){ft.chownSync.apply(void 0,arguments)},fchown:function(){ft.fchownSync.apply(void 0,arguments)},truncate:function(){ft.truncateSync.apply(void 0,arguments)},ftruncate:function(t,e){if(e<0)throw new y.ErrnoError(28);ft.ftruncateSync.apply(void 0,arguments)},utime:function(){ft.utimesSync.apply(void 0,arguments)},open:function(t,e,r,i){typeof e=="string"&&(e=Vl.modeStringToFlags(e));var n=ft.openSync(t,tt.flagsForNode(e),r),s=i!=null?i:y.nextfd(n),o={fd:s,nfd:n,position:0,path:t,flags:e,seekable:!0};return y.streams[s]=o,o},close:function(t){t.stream_ops||ft.closeSync(t.nfd),y.closeStream(t.fd)},llseek:function(t,e,r){if(t.stream_ops)return Vl.llseek(t,e,r);var i=e;if(r===1)i+=t.position;else if(r===2)i+=ft.fstatSync(t.nfd).size;else if(r!==0)throw new y.ErrnoError(eg.EINVAL);if(i<0)throw new y.ErrnoError(eg.EINVAL);return t.position=i,i},read:function(t,e,r,i,n){if(t.stream_ops)return Vl.read(t,e,r,i,n);var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},write:function(t,e,r,i,n){if(t.stream_ops)return Vl.write(t,e,r,i,n);t.flags&+"1024"&&y.llseek(t,0,+"2");var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},allocate:function(){throw new y.ErrnoError(eg.EOPNOTSUPP)},mmap:function(t,e,r,i,n,s){if(t.stream_ops)return Vl.mmap(t,e,r,i,n,s);if(e!==0)throw new y.ErrnoError(28);var o=mP(r);return y.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){return t.stream_ops?Vl.msync(t,e,r,i,n):(n&2||y.write(t,e,0,i,r),0)},munmap:function(){return 0},ioctl:function(){throw new y.ErrnoError(eg.ENOTTY)}},y={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(t,e){if(t=wa.resolve(y.cwd(),t),e=e||{},!t)return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var i in r)e[i]===void 0&&(e[i]=r[i]);if(e.recurse_count>8)throw new y.ErrnoError(32);for(var n=yt.normalizeArray(t.split("/").filter(function(f){return!!f}),!1),s=y.root,o="/",a=0;a40)throw new y.ErrnoError(32)}}return{path:o,node:s}},getPath:function(t){for(var e;;){if(y.isRoot(t)){var r=t.mount.mountpoint;return e?r[r.length-1]!=="/"?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:function(t,e){for(var r=0,i=0;i>>0)%y.nameTable.length},hashAddNode:function(t){var e=y.hashName(t.parent.id,t.name);t.name_next=y.nameTable[e],y.nameTable[e]=t},hashRemoveNode:function(t){var e=y.hashName(t.parent.id,t.name);if(y.nameTable[e]===t)y.nameTable[e]=t.name_next;else for(var r=y.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:function(t,e){var r=y.mayLookup(t);if(r)throw new y.ErrnoError(r,t);for(var i=y.hashName(t.id,e),n=y.nameTable[i];n;n=n.name_next){var s=n.name;if(n.parent.id===t.id&&s===e)return n}return y.lookup(t,e)},createNode:function(t,e,r,i){var n=new y.FSNode(t,e,r,i);return y.hashAddNode(n),n},destroyNode:function(t){y.hashRemoveNode(t)},isRoot:function(t){return t===t.parent},isMountpoint:function(t){return!!t.mounted},isFile:function(t){return(t&61440)==32768},isDir:function(t){return(t&61440)==16384},isLink:function(t){return(t&61440)==40960},isChrdev:function(t){return(t&61440)==8192},isBlkdev:function(t){return(t&61440)==24576},isFIFO:function(t){return(t&61440)==4096},isSocket:function(t){return(t&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(t){var e=y.flagModes[t];if(typeof e=="undefined")throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:function(t){var e=["r","w","rw"][t&3];return t&512&&(e+="w"),e},nodePermissions:function(t,e){return y.ignorePermissions?0:e.includes("r")&&!(t.mode&292)||e.includes("w")&&!(t.mode&146)||e.includes("x")&&!(t.mode&73)?2:0},mayLookup:function(t){var e=y.nodePermissions(t,"x");return e||(t.node_ops.lookup?0:2)},mayCreate:function(t,e){try{var r=y.lookupNode(t,e);return 20}catch(i){}return y.nodePermissions(t,"wx")},mayDelete:function(t,e,r){var i;try{i=y.lookupNode(t,e)}catch(s){return s.errno}var n=y.nodePermissions(t,"wx");if(n)return n;if(r){if(!y.isDir(i.mode))return 54;if(y.isRoot(i)||y.getPath(i)===y.cwd())return 10}else if(y.isDir(i.mode))return 31;return 0},mayOpen:function(t,e){return t?y.isLink(t.mode)?32:y.isDir(t.mode)&&(y.flagsToPermissionString(e)!=="r"||e&512)?31:y.nodePermissions(t,y.flagsToPermissionString(e)):44},MAX_OPEN_FDS:4096,nextfd:function(t,e){t=t||0,e=e||y.MAX_OPEN_FDS;for(var r=t;r<=e;r++)if(!y.streams[r])return r;throw new y.ErrnoError(33)},getStream:function(t){return y.streams[t]},createStream:function(t,e,r){y.FSStream||(y.FSStream=function(){},y.FSStream.prototype={object:{get:function(){return this.node},set:function(o){this.node=o}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var i=new y.FSStream;for(var n in t)i[n]=t[n];t=i;var s=y.nextfd(e,r);return t.fd=s,y.streams[s]=t,t},closeStream:function(t){y.streams[t]=null},chrdev_stream_ops:{open:function(t){var e=y.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:function(){throw new y.ErrnoError(70)}},major:function(t){return t>>8},minor:function(t){return t&255},makedev:function(t,e){return t<<8|e},registerDevice:function(t,e){y.devices[t]={stream_ops:e}},getDevice:function(t){return y.devices[t]},getMounts:function(t){for(var e=[],r=[t];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(t,e){typeof t=="function"&&(e=t,t=!1),y.syncFSRequests++,y.syncFSRequests>1&&Di("warning: "+y.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=y.getMounts(y.root.mount),i=0;function n(o){return y.syncFSRequests--,e(o)}function s(o){if(o)return s.errored?void 0:(s.errored=!0,n(o));++i>=r.length&&n(null)}r.forEach(function(o){if(!o.type.syncfs)return s(null);o.type.syncfs(o,t,s)})},mount:function(t,e,r){var i=r==="/",n=!r,s;if(i&&y.root)throw new y.ErrnoError(10);if(!i&&!n){var o=y.lookupPath(r,{follow_mount:!1});if(r=o.path,s=o.node,y.isMountpoint(s))throw new y.ErrnoError(10);if(!y.isDir(s.mode))throw new y.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},l=t.mount(a);return l.mount=a,a.root=l,i?y.root=l:s&&(s.mounted=a,s.mount&&s.mount.mounts.push(a)),l},unmount:function(t){var e=y.lookupPath(t,{follow_mount:!1});if(!y.isMountpoint(e.node))throw new y.ErrnoError(28);var r=e.node,i=r.mounted,n=y.getMounts(i);Object.keys(y.nameTable).forEach(function(o){for(var a=y.nameTable[o];a;){var l=a.name_next;n.includes(a.mount)&&y.destroyNode(a),a=l}}),r.mounted=null;var s=r.mount.mounts.indexOf(i);r.mount.mounts.splice(s,1)},lookup:function(t,e){return t.node_ops.lookup(t,e)},mknod:function(t,e,r){var i=y.lookupPath(t,{parent:!0}),n=i.node,s=yt.basename(t);if(!s||s==="."||s==="..")throw new y.ErrnoError(28);var o=y.mayCreate(n,s);if(o)throw new y.ErrnoError(o);if(!n.node_ops.mknod)throw new y.ErrnoError(63);return n.node_ops.mknod(n,s,e,r)},create:function(t,e){return e=e!==void 0?e:438,e&=4095,e|=32768,y.mknod(t,e,0)},mkdir:function(t,e){return e=e!==void 0?e:511,e&=511|512,e|=16384,y.mknod(t,e,0)},mkdirTree:function(t,e){for(var r=t.split("/"),i="",n=0;nthis.length-1||f<0)){var h=f%this.chunkSize,p=f/this.chunkSize|0;return this.getter(p)[h]}},s.prototype.setDataGetter=function(f){this.getter=f},s.prototype.cacheLength=function(){var f=new XMLHttpRequest;if(f.open("HEAD",r,!1),f.send(null),!(f.status>=200&&f.status<300||f.status===304))throw new Error("Couldn't load "+r+". Status: "+f.status);var h=Number(f.getResponseHeader("Content-length")),p,d=(p=f.getResponseHeader("Accept-Ranges"))&&p==="bytes",m=(p=f.getResponseHeader("Content-Encoding"))&&p==="gzip",E=1024*1024;d||(E=h);var B=function(R,H){if(R>H)throw new Error("invalid range ("+R+", "+H+") or no bytes requested!");if(H>h-1)throw new Error("only "+h+" bytes available! programmer error!");var L=new XMLHttpRequest;if(L.open("GET",r,!1),h!==E&&L.setRequestHeader("Range","bytes="+R+"-"+H),typeof Uint8Array!="undefined"&&(L.responseType="arraybuffer"),L.overrideMimeType&&L.overrideMimeType("text/plain; charset=x-user-defined"),L.send(null),!(L.status>=200&&L.status<300||L.status===304))throw new Error("Couldn't load "+r+". Status: "+L.status);return L.response!==void 0?new Uint8Array(L.response||[]):CP(L.responseText||"",!0)},b=this;b.setDataGetter(function(R){var H=R*E,L=(R+1)*E-1;if(L=Math.min(L,h-1),typeof b.chunks[R]=="undefined"&&(b.chunks[R]=B(H,L)),typeof b.chunks[R]=="undefined")throw new Error("doXHR failed!");return b.chunks[R]}),(m||!h)&&(E=h=1,h=this.getter(0).length,E=h,$y("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=h,this._chunkSize=E,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!iz)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var o=new s;Object.defineProperties(o,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:o}}else var a={isDevice:!1,url:r};var l=y.createFile(t,e,a,i,n);a.contents?l.contents=a.contents:a.url&&(l.contents=null,l.url=a.url),Object.defineProperties(l,{usedBytes:{get:function(){return this.contents.length}}});var c={},u=Object.keys(l.stream_ops);return u.forEach(function(g){var f=l.stream_ops[g];c[g]=function(){return y.forceLoadFile(l),f.apply(null,arguments)}}),c.read=function(f,h,p,d,m){y.forceLoadFile(l);var E=f.node.contents;if(m>=E.length)return 0;var B=Math.min(E.length-m,d);if(E.slice)for(var b=0;b>2]=i.dev,_e[r+4>>2]=0,_e[r+8>>2]=i.ino,_e[r+12>>2]=i.mode,_e[r+16>>2]=i.nlink,_e[r+20>>2]=i.uid,_e[r+24>>2]=i.gid,_e[r+28>>2]=i.rdev,_e[r+32>>2]=0,ya=[i.size>>>0,(ai=i.size,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+40>>2]=ya[0],_e[r+44>>2]=ya[1],_e[r+48>>2]=4096,_e[r+52>>2]=i.blocks,_e[r+56>>2]=i.atime.getTime()/1e3|0,_e[r+60>>2]=0,_e[r+64>>2]=i.mtime.getTime()/1e3|0,_e[r+68>>2]=0,_e[r+72>>2]=i.ctime.getTime()/1e3|0,_e[r+76>>2]=0,ya=[i.ino>>>0,(ai=i.ino,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+80>>2]=ya[0],_e[r+84>>2]=ya[1],0},doMsync:function(t,e,r,i,n){var s=$u.slice(t,t+r);y.msync(e,s,n,r,i)},doMkdir:function(t,e){return t=yt.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),y.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(e&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return y.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var i=y.readlink(t),n=Math.min(r,rw(i)),s=Zi[e+n];return uz(i,e,r+1),Zi[e+n]=s,n},doAccess:function(t,e){if(e&~7)return-28;var r,i=y.lookupPath(t,{follow:!0});if(r=i.node,!r)return-44;var n="";return e&4&&(n+="r"),e&2&&(n+="w"),e&1&&(n+="x"),n&&y.nodePermissions(r,n)?-2:0},doDup:function(t,e,r){var i=y.getStream(r);return i&&y.close(i),y.open(t,e,0,r,r).fd},doReadv:function(t,e,r,i){for(var n=0,s=0;s>2],a=_e[e+(s*8+4)>>2],l=y.read(t,Zi,o,a,i);if(l<0)return-1;if(n+=l,l>2],a=_e[e+(s*8+4)>>2],l=y.write(t,Zi,o,a,i);if(l<0)return-1;n+=l}return n},varargs:void 0,get:function(){Ot.varargs+=4;var t=_e[Ot.varargs-4>>2];return t},getStr:function(t){var e=cz(t);return e},getStreamFromFD:function(t){var e=y.getStream(t);if(!e)throw new y.ErrnoError(8);return e},get64:function(t,e){return t}};function qxe(t,e){try{return t=Ot.getStr(t),y.chmod(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function Wxe(t){return _e[Jxe()>>2]=t,t}function zxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 0:{var n=Ot.get();if(n<0)return-28;var s;return s=y.open(i.path,i.flags,0,n),s.fd}case 1:case 2:return 0;case 3:return i.flags;case 4:{var n=Ot.get();return i.flags|=n,0}case 12:{var n=Ot.get(),o=0;return cP[n+o>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Wxe(28),-1;default:return-28}}catch(a){return(typeof y=="undefined"||!(a instanceof y.ErrnoError))&&Gr(a),-a.errno}}function Vxe(t,e){try{var r=Ot.getStreamFromFD(t);return Ot.doStat(y.stat,r.path,e)}catch(i){return(typeof y=="undefined"||!(i instanceof y.ErrnoError))&&Gr(i),-i.errno}}function _xe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 21509:case 21505:return i.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return i.tty?0:-59;case 21519:{if(!i.tty)return-59;var n=Ot.get();return _e[n>>2]=0,0}case 21520:return i.tty?-28:-59;case 21531:{var n=Ot.get();return y.ioctl(i,e,n)}case 21523:return i.tty?0:-59;case 21524:return i.tty?0:-59;default:Gr("bad ioctl syscall "+e)}}catch(s){return(typeof y=="undefined"||!(s instanceof y.ErrnoError))&&Gr(s),-s.errno}}function Xxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStr(t),n=r?Ot.get():0,s=y.open(i,e,n);return s.fd}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),-o.errno}}function Zxe(t,e){try{return t=Ot.getStr(t),e=Ot.getStr(e),y.rename(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function $xe(t){try{return t=Ot.getStr(t),y.rmdir(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function eke(t,e){try{return t=Ot.getStr(t),Ot.doStat(y.stat,t,e)}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function tke(t){try{return t=Ot.getStr(t),y.unlink(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function rke(t,e,r){$u.copyWithin(t,e,e+r)}function ike(t){try{return ew.grow(t-gP.byteLength+65535>>>16),pz(ew.buffer),1}catch(e){}}function nke(t){var e=$u.length;t=t>>>0;var r=2147483648;if(t>r)return!1;for(var i=1;i<=4;i*=2){var n=e*(1+.2/i);n=Math.min(n,t+100663296);var s=Math.min(r,xxe(Math.max(t,n),65536)),o=ike(s);if(o)return!0}return!1}function ske(t){try{var e=Ot.getStreamFromFD(t);return y.close(e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),r.errno}}function oke(t,e){try{var r=Ot.getStreamFromFD(t),i=r.tty?2:y.isDir(r.mode)?3:y.isLink(r.mode)?7:4;return Zi[e>>0]=i,0}catch(n){return(typeof y=="undefined"||!(n instanceof y.ErrnoError))&&Gr(n),n.errno}}function ake(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doReadv(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function Ake(t,e,r,i,n){try{var s=Ot.getStreamFromFD(t),o=4294967296,a=r*o+(e>>>0),l=9007199254740992;return a<=-l||a>=l?-61:(y.llseek(s,a,i),ya=[s.position>>>0,(ai=s.position,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[n>>2]=ya[0],_e[n+4>>2]=ya[1],s.getdents&&a===0&&i===0&&(s.getdents=null),0)}catch(c){return(typeof y=="undefined"||!(c instanceof y.ErrnoError))&&Gr(c),c.errno}}function lke(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doWritev(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function cke(t){Exe(t)}function uke(t){var e=Date.now()/1e3|0;return t&&(_e[t>>2]=e),e}function EP(){if(EP.called)return;EP.called=!0;var t=new Date().getFullYear(),e=new Date(t,0,1),r=new Date(t,6,1),i=e.getTimezoneOffset(),n=r.getTimezoneOffset(),s=Math.max(i,n);_e[fke()>>2]=s*60,_e[gke()>>2]=Number(i!=n);function o(g){var f=g.toTimeString().match(/\(([A-Za-z ]+)\)$/);return f?f[1]:"GMT"}var a=o(e),l=o(r),c=uP(a),u=uP(l);n>2]=c,_e[nw()+4>>2]=u):(_e[nw()>>2]=u,_e[nw()+4>>2]=c)}function hke(t){EP();var e=Date.UTC(_e[t+20>>2]+1900,_e[t+16>>2],_e[t+12>>2],_e[t+8>>2],_e[t+4>>2],_e[t>>2],0),r=new Date(e);_e[t+24>>2]=r.getUTCDay();var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[t+28>>2]=n,r.getTime()/1e3|0}var Bz=function(t,e,r,i){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=y.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},sw=292|73,ow=146;Object.defineProperties(Bz.prototype,{read:{get:function(){return(this.mode&sw)===sw},set:function(t){t?this.mode|=sw:this.mode&=~sw}},write:{get:function(){return(this.mode&ow)===ow},set:function(t){t?this.mode|=ow:this.mode&=~ow}},isFolder:{get:function(){return y.isDir(this.mode)}},isDevice:{get:function(){return y.isChrdev(this.mode)}}});y.FSNode=Bz;y.staticInit();Wl&&(ft=ez,IP=require("path"),tt.staticInit());var ft,IP;if(Wl){Qz=function(t){return function(){try{return t.apply(this,arguments)}catch(e){throw e.code?new y.ErrnoError(eg[e.code]):e}}},Vl=Object.assign({},y);for(yP in wz)y[yP]=Qz(wz[yP])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");var Qz,Vl,yP;function CP(t,e,r){var i=r>0?r:rw(t)+1,n=new Array(i),s=tw(t,n,0,n.length);return e&&(n.length=s),n}var pke=typeof atob=="function"?atob:function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r="",i,n,s,o,a,l,c,u=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(u++)),a=e.indexOf(t.charAt(u++)),l=e.indexOf(t.charAt(u++)),c=e.indexOf(t.charAt(u++)),i=o<<2|a>>4,n=(a&15)<<4|l>>2,s=(l&3)<<6|c,r=r+String.fromCharCode(i),l!==64&&(r=r+String.fromCharCode(n)),c!==64&&(r=r+String.fromCharCode(s));while(u0||(Fxe(),zl>0))return;function e(){aw||(aw=!0,oe.calledRun=!0,!Az&&(Nxe(),oe.onRuntimeInitialized&&oe.onRuntimeInitialized(),Txe()))}oe.setStatus?(oe.setStatus("Running..."),setTimeout(function(){setTimeout(function(){oe.setStatus("")},1),e()},1)):e()}oe.run=wP;if(oe.preInit)for(typeof oe.preInit=="function"&&(oe.preInit=[oe.preInit]);oe.preInit.length>0;)oe.preInit.pop()();wP()});var xz=I((Dot,Sz)=>{"use strict";function Cke(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function _l(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,_l)}Cke(_l,Error);_l.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ee=At(">>",!1),Ue=">&",Oe=At(">&",!1),vt=">",dt=At(">",!1),ri="<<<",ii=At("<<<",!1),an="<&",yr=At("<&",!1),Ki="<",Qi=At("<",!1),Go=function(C){return{type:"argument",segments:[].concat(...C)}},wr=function(C){return C},Ui="'",ws=At("'",!1),Tf=function(C){return[{type:"text",text:C}]},Mf='"',Rm=At('"',!1),Fm=function(C){return C},Nm=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},DQ=function(C){return{type:"shell",shell:C,quoted:!0}},RQ=function(C){return _(P({type:"variable"},C),{quoted:!0})},Of=function(C){return{type:"text",text:C}},FQ=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},NQ=function(C){return{type:"shell",shell:C,quoted:!1}},Lm=function(C){return _(P({type:"variable"},C),{quoted:!1})},LQ=function(C){return{type:"glob",pattern:C}},Va="\\",jo=At("\\",!1),Tm=/^[\\']/,Mm=Qs(["\\","'"],!1,!1),te=function(C){return C},Om=/^[^']/,Km=Qs(["'"],!0,!1),il=function(C){return C.join("")},Um=/^[\\$"]/,Hm=Qs(["\\","$",'"'],!1,!1),Kf=/^[^$"]/,Gm=Qs(["$",'"'],!0,!1),jm="\\0",TQ=At("\\0",!1),MQ=function(){return"\0"},Ym="\\a",qm=At("\\a",!1),Jm=function(){return"a"},Wm="\\b",zm=At("\\b",!1),Vm=function(){return"\b"},Uf="\\e",OQ=At("\\e",!1),KQ=function(){return""},_m="\\f",UQ=At("\\f",!1),HQ=function(){return"\f"},O="\\n",ht=At("\\n",!1),Vc=function(){return` +`},xn="\\r",Hf=At("\\r",!1),Ye=function(){return"\r"},nl="\\t",Xm=At("\\t",!1),MM=function(){return" "},GQ="\\v",OM=At("\\v",!1),fr=function(){return"\v"},Bs="\\x",jQ=At("\\x",!1),Zm=function(C){return String.fromCharCode(parseInt(C,16))},Yo="\\u",$m=At("\\u",!1),_a="\\U",et=At("\\U",!1),YQ=function(C){return String.fromCodePoint(parseInt(C,16))},eI=/^[0-9a-fA-f]/,tI=Qs([["0","9"],["a","f"],["A","f"]],!1,!1),Xa=Cfe(),sl="-",ol=At("-",!1),al="+",qo=At("+",!1),Al=".",qQ=At(".",!1),rI=function(C,Q,k){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+k.join(""))}},iI=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},JQ=function(C){return P({type:"variable"},C)},ll=function(C){return{type:"variable",name:C}},WQ=function(C){return C},nI="*",Gf=At("*",!1),_c="/",jf=At("/",!1),sI=function(C,Q,k){return{type:Q==="*"?"multiplication":"division",right:k}},cl=function(C,Q){return Q.reduce((k,N)=>P({left:k},N),C)},oI=function(C,Q,k){return{type:Q==="+"?"addition":"subtraction",right:k}},Yf="$((",Xc=At("$((",!1),xr="))",KM=At("))",!1),Jo=function(C){return C},Zs="$(",aI=At("$(",!1),Zc=function(C){return C},x="${",U=At("${",!1),le=":-",xe=At(":-",!1),Qe=function(C,Q){return{name:C,defaultValue:Q}},Ge=":-}",ct=At(":-}",!1),sr=function(C){return{name:C,defaultValue:[]}},Wo=function(C){return{name:C}},Afe="$",lfe=At("$",!1),cfe=function(C){return e.isGlobPattern(C)},ufe=function(C){return C},UM=/^[a-zA-Z0-9_]/,HM=Qs([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),GM=function(){return dfe()},jM=/^[$@*?#a-zA-Z0-9_\-]/,YM=Qs(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),gfe=/^[(){}<>$|&; \t"']/,ffe=Qs(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),hfe=/^[<>&; \t"']/,pfe=Qs(["<",">","&",";"," "," ",'"',"'"],!1,!1),qM=/^[ \t]/,JM=Qs([" "," "],!1,!1),w=0,Re=0,AI=[{line:1,column:1}],$s=0,zQ=[],we=0,lI;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function dfe(){return t.substring(Re,w)}function P_e(){return qf(Re,w)}function D_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),zM([Ife(C)],t.substring(Re,w),Q)}function R_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),Efe(C,Q)}function At(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function Qs(C,Q,k){return{type:"class",parts:C,inverted:Q,ignoreCase:k}}function Cfe(){return{type:"any"}}function mfe(){return{type:"end"}}function Ife(C){return{type:"other",description:C}}function WM(C){var Q=AI[C],k;if(Q)return Q;for(k=C-1;!AI[k];)k--;for(Q=AI[k],Q={line:Q.line,column:Q.column};k$s&&($s=w,zQ=[]),zQ.push(C))}function Efe(C,Q){return new _l(C,null,null,Q)}function zM(C,Q,k){return new _l(_l.buildMessage(C,Q),C,Q,k)}function VM(){var C,Q;return C=w,Q=Jf(),Q===r&&(Q=null),Q!==r&&(Re=C,Q=s(Q)),C=Q,C}function Jf(){var C,Q,k,N,Z;if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N!==r?(Z=yfe(),Z===r&&(Z=null),Z!==r?(Re=C,Q=o(Q,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;if(C===r)if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N===r&&(N=null),N!==r?(Re=C,Q=a(Q,N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function yfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Jf(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=l(k),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function _M(){var C;return t.charCodeAt(w)===59?(C=c,w++):(C=r,we===0&&ve(u)),C===r&&(t.charCodeAt(w)===38?(C=g,w++):(C=r,we===0&&ve(f))),C}function VQ(){var C,Q,k;return C=w,Q=XM(),Q!==r?(k=wfe(),k===r&&(k=null),k!==r?(Re=C,Q=h(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function wfe(){var C,Q,k,N,Z,Ie,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=VQ(),Z!==r){for(Ie=[],ot=ke();ot!==r;)Ie.push(ot),ot=ke();Ie!==r?(Re=C,Q=p(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function Bfe(){var C;return t.substr(w,2)===d?(C=d,w+=2):(C=r,we===0&&ve(m)),C===r&&(t.substr(w,2)===E?(C=E,w+=2):(C=r,we===0&&ve(B))),C}function XM(){var C,Q,k;return C=w,Q=vfe(),Q!==r?(k=Qfe(),k===r&&(k=null),k!==r?(Re=C,Q=b(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function Qfe(){var C,Q,k,N,Z,Ie,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=XM(),Z!==r){for(Ie=[],ot=ke();ot!==r;)Ie.push(ot),ot=ke();Ie!==r?(Re=C,Q=R(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function bfe(){var C;return t.substr(w,2)===H?(C=H,w+=2):(C=r,we===0&&ve(L)),C===r&&(t.charCodeAt(w)===124?(C=K,w++):(C=r,we===0&&ve(J))),C}function cI(){var C,Q,k,N,Z,Ie;if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r)if(N=$M(),N!==r){for(Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();Z!==r?(Re=C,Q=A(Q,N),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;else w=C,C=r;if(C===r)if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=V(Q),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function vfe(){var C,Q,k,N,Z,Ie,ot,ut,Tr,ni,Yn;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===40?(k=W,w++):(k=r,we===0&&ve(X)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ie=[],ot=ke();ot!==r;)Ie.push(ot),ot=ke();if(Ie!==r)if(t.charCodeAt(w)===41?(ot=F,w++):(ot=r,we===0&&ve(D)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=he(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===123?(k=pe,w++):(k=r,we===0&&ve(Ne)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ie=[],ot=ke();ot!==r;)Ie.push(ot),ot=ke();if(Ie!==r)if(t.charCodeAt(w)===125?(ot=Pe,w++):(ot=r,we===0&&ve(qe)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=re(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){for(k=[],N=cI();N!==r;)k.push(N),N=cI();if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r){if(Z=[],Ie=ZM(),Ie!==r)for(;Ie!==r;)Z.push(Ie),Ie=ZM();else Z=r;if(Z!==r){for(Ie=[],ot=ke();ot!==r;)Ie.push(ot),ot=ke();Ie!==r?(Re=C,Q=se(k,Z),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r}else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=cI(),N!==r)for(;N!==r;)k.push(N),N=cI();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=be(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}}}return C}function Sfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=uI(),N!==r)for(;N!==r;)k.push(N),N=uI();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=ae(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r;return C}function ZM(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r?(k=Wf(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();Q!==r?(k=uI(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r)}return C}function Wf(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(De.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve($)),k===r&&(k=null),k!==r?(N=xfe(),N!==r?(Z=uI(),Z!==r?(Re=C,Q=G(k,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function xfe(){var C;return t.substr(w,2)===Ce?(C=Ce,w+=2):(C=r,we===0&&ve(ee)),C===r&&(t.substr(w,2)===Ue?(C=Ue,w+=2):(C=r,we===0&&ve(Oe)),C===r&&(t.charCodeAt(w)===62?(C=vt,w++):(C=r,we===0&&ve(dt)),C===r&&(t.substr(w,3)===ri?(C=ri,w+=3):(C=r,we===0&&ve(ii)),C===r&&(t.substr(w,2)===an?(C=an,w+=2):(C=r,we===0&&ve(yr)),C===r&&(t.charCodeAt(w)===60?(C=Ki,w++):(C=r,we===0&&ve(Qi))))))),C}function uI(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(k=$M(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C}function $M(){var C,Q,k;if(C=w,Q=[],k=eO(),k!==r)for(;k!==r;)Q.push(k),k=eO();else Q=r;return Q!==r&&(Re=C,Q=Go(Q)),C=Q,C}function eO(){var C,Q;return C=w,Q=kfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Pfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Dfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q)),C}function kfe(){var C,Q,k,N;return C=w,t.charCodeAt(w)===39?(Q=Ui,w++):(Q=r,we===0&&ve(ws)),Q!==r?(k=Rfe(),k!==r?(t.charCodeAt(w)===39?(N=Ui,w++):(N=r,we===0&&ve(ws)),N!==r?(Re=C,Q=Tf(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function Pfe(){var C,Q,k,N;if(C=w,t.charCodeAt(w)===34?(Q=Mf,w++):(Q=r,we===0&&ve(Rm)),Q!==r){for(k=[],N=tO();N!==r;)k.push(N),N=tO();k!==r?(t.charCodeAt(w)===34?(N=Mf,w++):(N=r,we===0&&ve(Rm)),N!==r?(Re=C,Q=Fm(k),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function Dfe(){var C,Q,k;if(C=w,Q=[],k=rO(),k!==r)for(;k!==r;)Q.push(k),k=rO();else Q=r;return Q!==r&&(Re=C,Q=Fm(Q)),C=Q,C}function tO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=Nm(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=DQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=RQ(Q)),C=Q,C===r&&(C=w,Q=Ffe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q))),C}function rO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=FQ(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=NQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=Lm(Q)),C=Q,C===r&&(C=w,Q=Lfe(),Q!==r&&(Re=C,Q=LQ(Q)),C=Q,C===r&&(C=w,Q=Nfe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q)))),C}function Rfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=gI(),k===r&&(k=fI(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));k!==r;)Q.push(k),k=gI(),k===r&&(k=fI(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function Ffe(){var C,Q,k,N,Z;if(C=w,Q=[],k=gI(),k===r&&(k=fI(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm))))),k!==r)for(;k!==r;)Q.push(k),k=gI(),k===r&&(k=fI(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm)))));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function gI(){var C,Q;return C=w,t.substr(w,2)===jm?(Q=jm,w+=2):(Q=r,we===0&&ve(TQ)),Q!==r&&(Re=C,Q=MQ()),C=Q,C===r&&(C=w,t.substr(w,2)===Ym?(Q=Ym,w+=2):(Q=r,we===0&&ve(qm)),Q!==r&&(Re=C,Q=Jm()),C=Q,C===r&&(C=w,t.substr(w,2)===Wm?(Q=Wm,w+=2):(Q=r,we===0&&ve(zm)),Q!==r&&(Re=C,Q=Vm()),C=Q,C===r&&(C=w,t.substr(w,2)===Uf?(Q=Uf,w+=2):(Q=r,we===0&&ve(OQ)),Q!==r&&(Re=C,Q=KQ()),C=Q,C===r&&(C=w,t.substr(w,2)===_m?(Q=_m,w+=2):(Q=r,we===0&&ve(UQ)),Q!==r&&(Re=C,Q=HQ()),C=Q,C===r&&(C=w,t.substr(w,2)===O?(Q=O,w+=2):(Q=r,we===0&&ve(ht)),Q!==r&&(Re=C,Q=Vc()),C=Q,C===r&&(C=w,t.substr(w,2)===xn?(Q=xn,w+=2):(Q=r,we===0&&ve(Hf)),Q!==r&&(Re=C,Q=Ye()),C=Q,C===r&&(C=w,t.substr(w,2)===nl?(Q=nl,w+=2):(Q=r,we===0&&ve(Xm)),Q!==r&&(Re=C,Q=MM()),C=Q,C===r&&(C=w,t.substr(w,2)===GQ?(Q=GQ,w+=2):(Q=r,we===0&&ve(OM)),Q!==r&&(Re=C,Q=fr()),C=Q)))))))),C}function fI(){var C,Q,k,N,Z,Ie,ot,ut,Tr,ni,Yn,$Q;return C=w,t.substr(w,2)===Bs?(Q=Bs,w+=2):(Q=r,we===0&&ve(jQ)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ie=An(),Ie!==r?(Z=[Z,Ie],N=Z):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===Yo?(Q=Yo,w+=2):(Q=r,we===0&&ve($m)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ie=An(),Ie!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Z=[Z,Ie,ot,ut],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===_a?(Q=_a,w+=2):(Q=r,we===0&&ve(et)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ie=An(),Ie!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Tr=An(),Tr!==r?(ni=An(),ni!==r?(Yn=An(),Yn!==r?($Q=An(),$Q!==r?(Z=[Z,Ie,ot,ut,Tr,ni,Yn,$Q],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=YQ(k),C=Q):(w=C,C=r)):(w=C,C=r))),C}function An(){var C;return eI.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(tI)),C}function Nfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r)),k!==r)for(;k!==r;)Q.push(k),k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function _Q(){var C,Q,k,N,Z,Ie;if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;if(k!==r)if(t.charCodeAt(w)===46?(N=Al,w++):(N=r,we===0&&ve(qQ)),N!==r){if(Z=[],De.test(t.charAt(w))?(Ie=t.charAt(w),w++):(Ie=r,we===0&&ve($)),Ie!==r)for(;Ie!==r;)Z.push(Ie),De.test(t.charAt(w))?(Ie=t.charAt(w),w++):(Ie=r,we===0&&ve($));else Z=r;Z!==r?(Re=C,Q=rI(Q,k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;if(C===r){if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;k!==r?(Re=C,Q=iI(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;if(C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=JQ(Q)),C=Q,C===r&&(C=w,Q=zf(),Q!==r&&(Re=C,Q=ll(Q)),C=Q,C===r)))if(C=w,t.charCodeAt(w)===40?(Q=W,w++):(Q=r,we===0&&ve(X)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();Z!==r?(t.charCodeAt(w)===41?(Ie=F,w++):(Ie=r,we===0&&ve(D)),Ie!==r?(Re=C,Q=WQ(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r}return C}function XQ(){var C,Q,k,N,Z,Ie,ot,ut;if(C=w,Q=_Q(),Q!==r){for(k=[],N=w,Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ie=nI,w++):(Ie=r,we===0&&ve(Gf)),Ie===r&&(t.charCodeAt(w)===47?(Ie=_c,w++):(Ie=r,we===0&&ve(jf))),Ie!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sI(Q,Ie,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ie=nI,w++):(Ie=r,we===0&&ve(Gf)),Ie===r&&(t.charCodeAt(w)===47?(Ie=_c,w++):(Ie=r,we===0&&ve(jf))),Ie!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sI(Q,Ie,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function iO(){var C,Q,k,N,Z,Ie,ot,ut;if(C=w,Q=XQ(),Q!==r){for(k=[],N=w,Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ie=al,w++):(Ie=r,we===0&&ve(qo)),Ie===r&&(t.charCodeAt(w)===45?(Ie=sl,w++):(Ie=r,we===0&&ve(ol))),Ie!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oI(Q,Ie,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ie=al,w++):(Ie=r,we===0&&ve(qo)),Ie===r&&(t.charCodeAt(w)===45?(Ie=sl,w++):(Ie=r,we===0&&ve(ol))),Ie!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oI(Q,Ie,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function nO(){var C,Q,k,N,Z,Ie;if(C=w,t.substr(w,3)===Yf?(Q=Yf,w+=3):(Q=r,we===0&&ve(Xc)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ie=ke();Ie!==r;)Z.push(Ie),Ie=ke();Z!==r?(t.substr(w,2)===xr?(Ie=xr,w+=2):(Ie=r,we===0&&ve(KM)),Ie!==r?(Re=C,Q=Jo(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;return C}function sO(){var C,Q,k,N;return C=w,t.substr(w,2)===Zs?(Q=Zs,w+=2):(Q=r,we===0&&ve(aI)),Q!==r?(k=Jf(),k!==r?(t.charCodeAt(w)===41?(N=F,w++):(N=r,we===0&&ve(D)),N!==r?(Re=C,Q=Zc(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function ZQ(){var C,Q,k,N,Z,Ie;return C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,2)===le?(N=le,w+=2):(N=r,we===0&&ve(xe)),N!==r?(Z=Sfe(),Z!==r?(t.charCodeAt(w)===125?(Ie=Pe,w++):(Ie=r,we===0&&ve(qe)),Ie!==r?(Re=C,Q=Qe(k,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,3)===Ge?(N=Ge,w+=3):(N=r,we===0&&ve(ct)),N!==r?(Re=C,Q=sr(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.charCodeAt(w)===125?(N=Pe,w++):(N=r,we===0&&ve(qe)),N!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.charCodeAt(w)===36?(Q=Afe,w++):(Q=r,we===0&&ve(lfe)),Q!==r?(k=zf(),k!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)))),C}function Lfe(){var C,Q,k;return C=w,Q=Tfe(),Q!==r?(Re=w,k=cfe(Q),k?k=void 0:k=r,k!==r?(Re=C,Q=ufe(Q),C=Q):(w=C,C=r)):(w=C,C=r),C}function Tfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k!==r)for(;k!==r;)Q.push(k),k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r);else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function oO(){var C,Q,k;if(C=w,Q=[],UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM)),k!==r)for(;k!==r;)Q.push(k),UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function zf(){var C,Q,k;if(C=w,Q=[],jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM)),k!==r)for(;k!==r;)Q.push(k),jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function aO(){var C;return gfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(ffe)),C}function AO(){var C;return hfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(pfe)),C}function ke(){var C,Q;if(C=[],qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM)),Q!==r)for(;Q!==r;)C.push(Q),qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM));else C=r;return C}if(lI=n(),lI!==r&&w===t.length)return lI;throw lI!==r&&w{"use strict";function Ike(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Xl(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Xl)}Ike(Xl,Error);Xl.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=B,L=[]),L.push($))}function qe($,G){return new Xl($,null,null,G)}function re($,G,Ce){return new Xl(Xl.buildMessage($,G),$,G,Ce)}function se(){var $,G,Ce,ee;return $=B,G=be(),G!==r?(t.charCodeAt(B)===47?(Ce=s,B++):(Ce=r,K===0&&Pe(o)),Ce!==r?(ee=be(),ee!==r?(b=$,G=a(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=be(),G!==r&&(b=$,G=l(G)),$=G),$}function be(){var $,G,Ce,ee;return $=B,G=ae(),G!==r?(t.charCodeAt(B)===64?(Ce=c,B++):(Ce=r,K===0&&Pe(u)),Ce!==r?(ee=De(),ee!==r?(b=$,G=g(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=ae(),G!==r&&(b=$,G=f(G)),$=G),$}function ae(){var $,G,Ce,ee,Ue;return $=B,t.charCodeAt(B)===64?(G=c,B++):(G=r,K===0&&Pe(u)),G!==r?(Ce=Ae(),Ce!==r?(t.charCodeAt(B)===47?(ee=s,B++):(ee=r,K===0&&Pe(o)),ee!==r?(Ue=Ae(),Ue!==r?(b=$,G=h(),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=Ae(),G!==r&&(b=$,G=h()),$=G),$}function Ae(){var $,G,Ce;if($=B,G=[],p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d)),Ce!==r)for(;Ce!==r;)G.push(Ce),p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d));else G=r;return G!==r&&(b=$,G=h()),$=G,$}function De(){var $,G,Ce;if($=B,G=[],m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(E)),Ce!==r)for(;Ce!==r;)G.push(Ce),m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(E));else G=r;return G!==r&&(b=$,G=h()),$=G,$}if(J=n(),J!==r&&B===t.length)return J;throw J!==r&&B{"use strict";function Fz(t){return typeof t=="undefined"||t===null}function yke(t){return typeof t=="object"&&t!==null}function wke(t){return Array.isArray(t)?t:Fz(t)?[]:[t]}function Bke(t,e){var r,i,n,s;if(e)for(s=Object.keys(e),r=0,i=s.length;r{"use strict";function Lp(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Lp.prototype=Object.create(Error.prototype);Lp.prototype.constructor=Lp;Lp.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};Nz.exports=Lp});var Mz=I((Vot,Lz)=>{"use strict";var Tz=$l();function kP(t,e,r,i,n){this.name=t,this.buffer=e,this.position=r,this.line=i,this.column=n}kP.prototype.getSnippet=function(e,r){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,r=r||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>r/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;or/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),Tz.repeat(" ",e)+i+a+s+` +`+Tz.repeat(" ",e+this.position-n+i.length)+"^"};kP.prototype.toString=function(e){var r,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(i+=`: +`+r)),i};Lz.exports=kP});var Xr=I((_ot,Oz)=>{"use strict";var Kz=ng(),vke=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Ske=["scalar","sequence","mapping"];function xke(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(i){e[String(i)]=r})}),e}function kke(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(vke.indexOf(r)===-1)throw new Kz('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=xke(e.styleAliases||null),Ske.indexOf(this.kind)===-1)throw new Kz('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}Oz.exports=kke});var ec=I((Xot,Uz)=>{"use strict";var Hz=$l(),hw=ng(),Pke=Xr();function PP(t,e,r){var i=[];return t.include.forEach(function(n){r=PP(n,e,r)}),t[e].forEach(function(n){r.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),r.push(n)}),r.filter(function(n,s){return i.indexOf(s)===-1})}function Dke(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function i(n){t[n.kind][n.tag]=t.fallback[n.tag]=n}for(e=0,r=arguments.length;e{"use strict";var Rke=Xr();Gz.exports=new Rke("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var qz=I(($ot,Yz)=>{"use strict";var Fke=Xr();Yz.exports=new Fke("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var Wz=I((eat,Jz)=>{"use strict";var Nke=Xr();Jz.exports=new Nke("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var pw=I((tat,zz)=>{"use strict";var Lke=ec();zz.exports=new Lke({explicit:[jz(),qz(),Wz()]})});var _z=I((rat,Vz)=>{"use strict";var Tke=Xr();function Mke(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function Oke(){return null}function Kke(t){return t===null}Vz.exports=new Tke("tag:yaml.org,2002:null",{kind:"scalar",resolve:Mke,construct:Oke,predicate:Kke,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var Zz=I((iat,Xz)=>{"use strict";var Uke=Xr();function Hke(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function Gke(t){return t==="true"||t==="True"||t==="TRUE"}function jke(t){return Object.prototype.toString.call(t)==="[object Boolean]"}Xz.exports=new Uke("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Hke,construct:Gke,predicate:jke,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var e4=I((nat,$z)=>{"use strict";var Yke=$l(),qke=Xr();function Jke(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Wke(t){return 48<=t&&t<=55}function zke(t){return 48<=t&&t<=57}function Vke(t){if(t===null)return!1;var e=t.length,r=0,i=!1,n;if(!e)return!1;if(n=t[r],(n==="-"||n==="+")&&(n=t[++r]),n==="0"){if(r+1===e)return!0;if(n=t[++r],n==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var i4=I((sat,t4)=>{"use strict";var r4=$l(),Zke=Xr(),$ke=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function ePe(t){return!(t===null||!$ke.test(t)||t[t.length-1]==="_")}function tPe(t){var e,r,i,n;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),r*e):r*parseFloat(e,10)}var rPe=/^[-+]?[0-9]+e/;function iPe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(r4.isNegativeZero(t))return"-0.0";return r=t.toString(10),rPe.test(r)?r.replace("e",".e"):r}function nPe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!=0||r4.isNegativeZero(t))}t4.exports=new Zke("tag:yaml.org,2002:float",{kind:"scalar",resolve:ePe,construct:tPe,predicate:nPe,represent:iPe,defaultStyle:"lowercase"})});var DP=I((oat,n4)=>{"use strict";var sPe=ec();n4.exports=new sPe({include:[pw()],implicit:[_z(),Zz(),e4(),i4()]})});var RP=I((aat,s4)=>{"use strict";var oPe=ec();s4.exports=new oPe({include:[DP()]})});var l4=I((Aat,o4)=>{"use strict";var aPe=Xr(),a4=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),A4=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function APe(t){return t===null?!1:a4.exec(t)!==null||A4.exec(t)!==null}function lPe(t){var e,r,i,n,s,o,a,l=0,c=null,u,g,f;if(e=a4.exec(t),e===null&&(e=A4.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(r,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(r,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function cPe(t){return t.toISOString()}o4.exports=new aPe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:APe,construct:lPe,instanceOf:Date,represent:cPe})});var u4=I((lat,c4)=>{"use strict";var uPe=Xr();function gPe(t){return t==="<<"||t===null}c4.exports=new uPe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:gPe})});var h4=I((cat,g4)=>{"use strict";var tc;try{f4=require,tc=f4("buffer").Buffer}catch(t){}var f4,fPe=Xr(),FP=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function hPe(t){if(t===null)return!1;var e,r,i=0,n=t.length,s=FP;for(r=0;r64)){if(e<0)return!1;i+=6}return i%8==0}function pPe(t){var e,r,i=t.replace(/[\r\n=]/g,""),n=i.length,s=FP,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return r=n%4*6,r===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):r===18?(a.push(o>>10&255),a.push(o>>2&255)):r===12&&a.push(o>>4&255),tc?tc.from?tc.from(a):new tc(a):a}function dPe(t){var e="",r=0,i,n,s=t.length,o=FP;for(i=0;i>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]),r=(r<<8)+t[i];return n=s%3,n===0?(e+=o[r>>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]):n===2?(e+=o[r>>10&63],e+=o[r>>4&63],e+=o[r<<2&63],e+=o[64]):n===1&&(e+=o[r>>2&63],e+=o[r<<4&63],e+=o[64],e+=o[64]),e}function CPe(t){return tc&&tc.isBuffer(t)}g4.exports=new fPe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:hPe,construct:pPe,predicate:CPe,represent:dPe})});var d4=I((uat,p4)=>{"use strict";var mPe=Xr(),IPe=Object.prototype.hasOwnProperty,EPe=Object.prototype.toString;function yPe(t){if(t===null)return!0;var e=[],r,i,n,s,o,a=t;for(r=0,i=a.length;r{"use strict";var BPe=Xr(),QPe=Object.prototype.toString;function bPe(t){if(t===null)return!0;var e,r,i,n,s,o=t;for(s=new Array(o.length),e=0,r=o.length;e{"use strict";var SPe=Xr(),xPe=Object.prototype.hasOwnProperty;function kPe(t){if(t===null)return!0;var e,r=t;for(e in r)if(xPe.call(r,e)&&r[e]!==null)return!1;return!0}function PPe(t){return t!==null?t:{}}I4.exports=new SPe("tag:yaml.org,2002:set",{kind:"mapping",resolve:kPe,construct:PPe})});var og=I((hat,y4)=>{"use strict";var DPe=ec();y4.exports=new DPe({include:[RP()],implicit:[l4(),u4()],explicit:[h4(),d4(),m4(),E4()]})});var B4=I((pat,w4)=>{"use strict";var RPe=Xr();function FPe(){return!0}function NPe(){}function LPe(){return""}function TPe(t){return typeof t=="undefined"}w4.exports=new RPe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:FPe,construct:NPe,predicate:TPe,represent:LPe})});var b4=I((dat,Q4)=>{"use strict";var MPe=Xr();function OPe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),i="";return!(e[0]==="/"&&(r&&(i=r[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function KPe(t){var e=t,r=/\/([gim]*)$/.exec(t),i="";return e[0]==="/"&&(r&&(i=r[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function UPe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function HPe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}Q4.exports=new MPe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:OPe,construct:KPe,predicate:HPe,represent:UPe})});var x4=I((Cat,v4)=>{"use strict";var dw;try{S4=require,dw=S4("esprima")}catch(t){typeof window!="undefined"&&(dw=window.esprima)}var S4,GPe=Xr();function jPe(t){if(t===null)return!1;try{var e="("+t+")",r=dw.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function YPe(t){var e="("+t+")",r=dw.parse(e,{range:!0}),i=[],n;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function qPe(t){return t.toString()}function JPe(t){return Object.prototype.toString.call(t)==="[object Function]"}v4.exports=new GPe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:jPe,construct:YPe,predicate:JPe,represent:qPe})});var Tp=I((mat,k4)=>{"use strict";var P4=ec();k4.exports=P4.DEFAULT=new P4({include:[og()],explicit:[B4(),b4(),x4()]})});var V4=I((Iat,Mp)=>{"use strict";var Ba=$l(),D4=ng(),WPe=Mz(),R4=og(),zPe=Tp(),QA=Object.prototype.hasOwnProperty,Cw=1,F4=2,N4=3,mw=4,NP=1,VPe=2,L4=3,_Pe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,XPe=/[\x85\u2028\u2029]/,ZPe=/[,\[\]\{\}]/,T4=/^(?:!|!!|![a-z\-]+!)$/i,M4=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function O4(t){return Object.prototype.toString.call(t)}function wo(t){return t===10||t===13}function rc(t){return t===9||t===32}function yn(t){return t===9||t===32||t===10||t===13}function ag(t){return t===44||t===91||t===93||t===123||t===125}function $Pe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function eDe(t){return t===120?2:t===117?4:t===85?8:0}function tDe(t){return 48<=t&&t<=57?t-48:-1}function K4(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` +`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function rDe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var U4=new Array(256),H4=new Array(256);for(var Ag=0;Ag<256;Ag++)U4[Ag]=K4(Ag)?1:0,H4[Ag]=K4(Ag);function iDe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||zPe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function G4(t,e){return new D4(e,new WPe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function st(t,e){throw G4(t,e)}function Iw(t,e){t.onWarning&&t.onWarning.call(null,G4(t,e))}var j4={YAML:function(e,r,i){var n,s,o;e.version!==null&&st(e,"duplication of %YAML directive"),i.length!==1&&st(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&st(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&st(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&Iw(e,"unsupported YAML version of the document")},TAG:function(e,r,i){var n,s;i.length!==2&&st(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],T4.test(n)||st(e,"ill-formed tag handle (first argument) of the TAG directive"),QA.call(e.tagMap,n)&&st(e,'there is a previously declared suffix for "'+n+'" tag handle'),M4.test(s)||st(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function bA(t,e,r,i){var n,s,o,a;if(e1&&(t.result+=Ba.repeat(` +`,e-1))}function nDe(t,e,r){var i,n,s,o,a,l,c,u,g=t.kind,f=t.result,h;if(h=t.input.charCodeAt(t.position),yn(h)||ag(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n)))return!1;for(t.kind="scalar",t.result="",s=o=t.position,a=!1;h!==0;){if(h===58){if(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n))break}else if(h===35){if(i=t.input.charCodeAt(t.position-1),yn(i))break}else{if(t.position===t.lineStart&&Ew(t)||r&&ag(h))break;if(wo(h))if(l=t.line,c=t.lineStart,u=t.lineIndent,jr(t,!1,-1),t.lineIndent>=e){a=!0,h=t.input.charCodeAt(t.position);continue}else{t.position=o,t.line=l,t.lineStart=c,t.lineIndent=u;break}}a&&(bA(t,s,o,!1),TP(t,t.line-l),s=o=t.position,a=!1),rc(h)||(o=t.position+1),h=t.input.charCodeAt(++t.position)}return bA(t,s,o,!1),t.result?!0:(t.kind=g,t.result=f,!1)}function sDe(t,e){var r,i,n;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,i=n=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(bA(t,i,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)i=t.position,t.position++,n=t.position;else return!0;else wo(r)?(bA(t,i,n,!0),TP(t,jr(t,!1,e)),i=n=t.position):t.position===t.lineStart&&Ew(t)?st(t,"unexpected end of the document within a single quoted scalar"):(t.position++,n=t.position);st(t,"unexpected end of the stream within a single quoted scalar")}function oDe(t,e){var r,i,n,s,o,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=i=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return bA(t,r,t.position,!0),t.position++,!0;if(a===92){if(bA(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),wo(a))jr(t,!1,e);else if(a<256&&U4[a])t.result+=H4[a],t.position++;else if((o=eDe(a))>0){for(n=o,s=0;n>0;n--)a=t.input.charCodeAt(++t.position),(o=$Pe(a))>=0?s=(s<<4)+o:st(t,"expected hexadecimal character");t.result+=rDe(s),t.position++}else st(t,"unknown escape sequence");r=i=t.position}else wo(a)?(bA(t,r,i,!0),TP(t,jr(t,!1,e)),r=i=t.position):t.position===t.lineStart&&Ew(t)?st(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}st(t,"unexpected end of the stream within a double quoted scalar")}function aDe(t,e){var r=!0,i,n=t.tag,s,o=t.anchor,a,l,c,u,g,f={},h,p,d,m;if(m=t.input.charCodeAt(t.position),m===91)l=93,g=!1,s=[];else if(m===123)l=125,g=!0,s={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=s),m=t.input.charCodeAt(++t.position);m!==0;){if(jr(t,!0,e),m=t.input.charCodeAt(t.position),m===l)return t.position++,t.tag=n,t.anchor=o,t.kind=g?"mapping":"sequence",t.result=s,!0;r||st(t,"missed comma between flow collection entries"),p=h=d=null,c=u=!1,m===63&&(a=t.input.charCodeAt(t.position+1),yn(a)&&(c=u=!0,t.position++,jr(t,!0,e))),i=t.line,cg(t,e,Cw,!1,!0),p=t.tag,h=t.result,jr(t,!0,e),m=t.input.charCodeAt(t.position),(u||t.line===i)&&m===58&&(c=!0,m=t.input.charCodeAt(++t.position),jr(t,!0,e),cg(t,e,Cw,!1,!0),d=t.result),g?lg(t,s,f,p,h,d):c?s.push(lg(t,null,f,p,h,d)):s.push(h),jr(t,!0,e),m=t.input.charCodeAt(t.position),m===44?(r=!0,m=t.input.charCodeAt(++t.position)):r=!1}st(t,"unexpected end of the stream within a flow collection")}function ADe(t,e){var r,i,n=NP,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=t.input.charCodeAt(t.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(t.kind="scalar",t.result="";g!==0;)if(g=t.input.charCodeAt(++t.position),g===43||g===45)NP===n?n=g===43?L4:VPe:st(t,"repeat of a chomping mode identifier");else if((u=tDe(g))>=0)u===0?st(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?st(t,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(rc(g)){do g=t.input.charCodeAt(++t.position);while(rc(g));if(g===35)do g=t.input.charCodeAt(++t.position);while(!wo(g)&&g!==0)}for(;g!==0;){for(LP(t),t.lineIndent=0,g=t.input.charCodeAt(t.position);(!o||t.lineIndenta&&(a=t.lineIndent),wo(g)){l++;continue}if(t.lineIndente)&&l!==0)st(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(cg(t,e,mw,!0,n)&&(p?f=t.result:h=t.result),p||(lg(t,c,u,g,f,h,s,o),g=f=h=null),jr(t,!0,-1),m=t.input.charCodeAt(t.position)),t.lineIndent>e&&m!==0)st(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),g=0,f=t.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+t.kind+'"'),h.resolve(t.result)?(t.result=h.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):st(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):st(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||u}function fDe(t){var e=t.position,r,i,n,s=!1,o;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(o=t.input.charCodeAt(t.position))!==0&&(jr(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||o!==37));){for(s=!0,o=t.input.charCodeAt(++t.position),r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);for(i=t.input.slice(r,t.position),n=[],i.length<1&&st(t,"directive name must not be less than one character in length");o!==0;){for(;rc(o);)o=t.input.charCodeAt(++t.position);if(o===35){do o=t.input.charCodeAt(++t.position);while(o!==0&&!wo(o));break}if(wo(o))break;for(r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(r,t.position))}o!==0&&LP(t),QA.call(j4,i)?j4[i](t,i,n):Iw(t,'unknown document directive "'+i+'"')}if(jr(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,jr(t,!0,-1)):s&&st(t,"directives end mark is expected"),cg(t,t.lineIndent-1,mw,!1,!0),jr(t,!0,-1),t.checkLineBreaks&&XPe.test(t.input.slice(e,t.position))&&Iw(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Ew(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,jr(t,!0,-1));return}if(t.position{"use strict";var Op=$l(),Kp=ng(),dDe=Tp(),CDe=og(),_4=Object.prototype.toString,X4=Object.prototype.hasOwnProperty,mDe=9,Up=10,IDe=13,EDe=32,yDe=33,wDe=34,Z4=35,BDe=37,QDe=38,bDe=39,vDe=42,$4=44,SDe=45,e5=58,xDe=61,kDe=62,PDe=63,DDe=64,t5=91,r5=93,RDe=96,i5=123,FDe=124,n5=125,Ri={};Ri[0]="\\0";Ri[7]="\\a";Ri[8]="\\b";Ri[9]="\\t";Ri[10]="\\n";Ri[11]="\\v";Ri[12]="\\f";Ri[13]="\\r";Ri[27]="\\e";Ri[34]='\\"';Ri[92]="\\\\";Ri[133]="\\N";Ri[160]="\\_";Ri[8232]="\\L";Ri[8233]="\\P";var NDe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function LDe(t,e){var r,i,n,s,o,a,l;if(e===null)return{};for(r={},i=Object.keys(e),n=0,s=i.length;n0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}else{for(s=0;si&&t[g+1]!==" ",g=s);else if(!ug(o))return yw;a=s>0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}c=c||u&&s-g-1>i&&t[g+1]!==" "}return!l&&!c?f&&!n(t)?l5:c5:r>9&&A5(t)?yw:c?g5:u5}function jDe(t,e,r,i){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&NDe.indexOf(e)!==-1)return"'"+e+"'";var n=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-n),o=i||t.flowLevel>-1&&r>=t.flowLevel;function a(l){return MDe(t,l)}switch(UDe(e,o,t.indent,s,a)){case l5:return e;case c5:return"'"+e.replace(/'/g,"''")+"'";case u5:return"|"+f5(e,t.indent)+h5(o5(e,n));case g5:return">"+f5(e,t.indent)+h5(o5(HDe(e,s),n));case yw:return'"'+GDe(e,s)+'"';default:throw new Kp("impossible error: invalid scalar style")}}()}function f5(t,e){var r=A5(t)?String(e):"",i=t[t.length-1]===` +`,n=i&&(t[t.length-2]===` +`||t===` +`),s=n?"+":i?"":"-";return r+s+` +`}function h5(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function HDe(t,e){for(var r=/(\n+)([^\n]*)/g,i=function(){var c=t.indexOf(` +`);return c=c!==-1?c:t.length,r.lastIndex=c,p5(t.slice(0,c),e)}(),n=t[0]===` +`||t[0]===" ",s,o;o=r.exec(t);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+p5(l,e),n=s}return i}function p5(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=r.exec(t);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+t.slice(n,s),n=s+1),o=a;return l+=` +`,t.length-n>e&&o>n?l+=t.slice(n,o)+` +`+t.slice(o+1):l+=t.slice(n),l.slice(1)}function GDe(t){for(var e="",r,i,n,s=0;s=55296&&r<=56319&&(i=t.charCodeAt(s+1),i>=56320&&i<=57343)){e+=s5((r-55296)*1024+i-56320+65536),s++;continue}n=Ri[r],e+=!n&&ug(r)?t[s]:n||s5(r)}return e}function YDe(t,e,r){var i="",n=t.tag,s,o;for(s=0,o=r.length;s1024&&(u+="? "),u+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),!!ic(t,e,c,!1,!1)&&(u+=t.dump,i+=u));t.tag=n,t.dump="{"+i+"}"}function WDe(t,e,r,i){var n="",s=t.tag,o=Object.keys(r),a,l,c,u,g,f;if(t.sortKeys===!0)o.sort();else if(typeof t.sortKeys=="function")o.sort(t.sortKeys);else if(t.sortKeys)throw new Kp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(t.dump&&Up===t.dump.charCodeAt(0)?f+="?":f+="? "),f+=t.dump,g&&(f+=OP(t,e)),!!ic(t,e+1,u,!0,g)&&(t.dump&&Up===t.dump.charCodeAt(0)?f+=":":f+=": ",f+=t.dump,n+=f));t.tag=s,t.dump=n||"{}"}function d5(t,e,r){var i,n,s,o,a,l;for(n=r?t.explicitTypes:t.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');t.dump=i}return!0}return!1}function ic(t,e,r,i,n,s){t.tag=null,t.dump=r,d5(t,r,!1)||d5(t,r,!0);var o=_4.call(t.dump);i&&(i=t.flowLevel<0||t.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=t.duplicates.indexOf(r),c=l!==-1),(t.tag!==null&&t.tag!=="?"||c||t.indent!==2&&e>0)&&(n=!1),c&&t.usedDuplicates[l])t.dump="*ref_"+l;else{if(a&&c&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(t.dump).length!==0?(WDe(t,e,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(JDe(t,e,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump));else if(o==="[object Array]"){var u=t.noArrayIndent&&e>0?e-1:e;i&&t.dump.length!==0?(qDe(t,u,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(YDe(t,u,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump))}else if(o==="[object String]")t.tag!=="?"&&jDe(t,t.dump,e,s);else{if(t.skipInvalid)return!1;throw new Kp("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function zDe(t,e){var r=[],i=[],n,s;for(UP(t,r,i),n=0,s=i.length;n{"use strict";var ww=V4(),I5=m5();function Bw(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Qr.exports.Type=Xr();Qr.exports.Schema=ec();Qr.exports.FAILSAFE_SCHEMA=pw();Qr.exports.JSON_SCHEMA=DP();Qr.exports.CORE_SCHEMA=RP();Qr.exports.DEFAULT_SAFE_SCHEMA=og();Qr.exports.DEFAULT_FULL_SCHEMA=Tp();Qr.exports.load=ww.load;Qr.exports.loadAll=ww.loadAll;Qr.exports.safeLoad=ww.safeLoad;Qr.exports.safeLoadAll=ww.safeLoadAll;Qr.exports.dump=I5.dump;Qr.exports.safeDump=I5.safeDump;Qr.exports.YAMLException=ng();Qr.exports.MINIMAL_SCHEMA=pw();Qr.exports.SAFE_SCHEMA=og();Qr.exports.DEFAULT_SCHEMA=Tp();Qr.exports.scan=Bw("scan");Qr.exports.parse=Bw("parse");Qr.exports.compose=Bw("compose");Qr.exports.addConstructor=Bw("addConstructor")});var w5=I((wat,y5)=>{"use strict";var _De=E5();y5.exports=_De});var Q5=I((Bat,B5)=>{"use strict";function XDe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function nc(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,nc)}XDe(nc,Error);nc.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[xe]:le})))},H=function(x){return x},L=function(x){return x},K=Yo("correct indentation"),J=" ",ne=fr(" ",!1),q=function(x){return x.length===Zc*aI},A=function(x){return x.length===(Zc+1)*aI},V=function(){return Zc++,!0},W=function(){return Zc--,!0},X=function(){return Xm()},F=Yo("pseudostring"),D=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,he=Bs(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),pe=/^[^\r\n\t ,\][{}:#"']/,Ne=Bs(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Pe=function(){return Xm().replace(/^ *| *$/g,"")},qe="--",re=fr("--",!1),se=/^[a-zA-Z\/0-9]/,be=Bs([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),ae=/^[^\r\n\t :,]/,Ae=Bs(["\r",` +`," "," ",":",","],!0,!1),De="null",$=fr("null",!1),G=function(){return null},Ce="true",ee=fr("true",!1),Ue=function(){return!0},Oe="false",vt=fr("false",!1),dt=function(){return!1},ri=Yo("string"),ii='"',an=fr('"',!1),yr=function(){return""},Ki=function(x){return x},Qi=function(x){return x.join("")},Go=/^[^"\\\0-\x1F\x7F]/,wr=Bs(['"',"\\",["\0",""],"\x7F"],!0,!1),Ui='\\"',ws=fr('\\"',!1),Tf=function(){return'"'},Mf="\\\\",Rm=fr("\\\\",!1),Fm=function(){return"\\"},Nm="\\/",DQ=fr("\\/",!1),RQ=function(){return"/"},Of="\\b",FQ=fr("\\b",!1),NQ=function(){return"\b"},Lm="\\f",LQ=fr("\\f",!1),Va=function(){return"\f"},jo="\\n",Tm=fr("\\n",!1),Mm=function(){return` +`},te="\\r",Om=fr("\\r",!1),Km=function(){return"\r"},il="\\t",Um=fr("\\t",!1),Hm=function(){return" "},Kf="\\u",Gm=fr("\\u",!1),jm=function(x,U,le,xe){return String.fromCharCode(parseInt(`0x${x}${U}${le}${xe}`))},TQ=/^[0-9a-fA-F]/,MQ=Bs([["0","9"],["a","f"],["A","F"]],!1,!1),Ym=Yo("blank space"),qm=/^[ \t]/,Jm=Bs([" "," "],!1,!1),Wm=Yo("white space"),zm=/^[ \t\n\r]/,Vm=Bs([" "," ",` +`,"\r"],!1,!1),Uf=`\r +`,OQ=fr(`\r +`,!1),KQ=` +`,_m=fr(` +`,!1),UQ="\r",HQ=fr("\r",!1),O=0,ht=0,Vc=[{line:1,column:1}],xn=0,Hf=[],Ye=0,nl;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Xm(){return t.substring(ht,O)}function MM(){return _a(ht,O)}function GQ(x,U){throw U=U!==void 0?U:_a(ht,O),eI([Yo(x)],t.substring(ht,O),U)}function OM(x,U){throw U=U!==void 0?U:_a(ht,O),YQ(x,U)}function fr(x,U){return{type:"literal",text:x,ignoreCase:U}}function Bs(x,U,le){return{type:"class",parts:x,inverted:U,ignoreCase:le}}function jQ(){return{type:"any"}}function Zm(){return{type:"end"}}function Yo(x){return{type:"other",description:x}}function $m(x){var U=Vc[x],le;if(U)return U;for(le=x-1;!Vc[le];)le--;for(U=Vc[le],U={line:U.line,column:U.column};lexn&&(xn=O,Hf=[]),Hf.push(x))}function YQ(x,U){return new nc(x,null,null,U)}function eI(x,U,le){return new nc(nc.buildMessage(x,U),x,U,le)}function tI(){var x;return x=ol(),x}function Xa(){var x,U,le;for(x=O,U=[],le=sl();le!==r;)U.push(le),le=sl();return U!==r&&(ht=x,U=s(U)),x=U,x}function sl(){var x,U,le,xe,Qe;return x=O,U=Al(),U!==r?(t.charCodeAt(O)===45?(le=o,O++):(le=r,Ye===0&&et(a)),le!==r?(xe=xr(),xe!==r?(Qe=qo(),Qe!==r?(ht=x,U=l(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x}function ol(){var x,U,le;for(x=O,U=[],le=al();le!==r;)U.push(le),le=al();return U!==r&&(ht=x,U=c(U)),x=U,x}function al(){var x,U,le,xe,Qe,Ge,ct,sr,Wo;if(x=O,U=xr(),U===r&&(U=null),U!==r){if(le=O,t.charCodeAt(O)===35?(xe=u,O++):(xe=r,Ye===0&&et(g)),xe!==r){if(Qe=[],Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r),Ge!==r)for(;Ge!==r;)Qe.push(Ge),Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r);else Qe=r;Qe!==r?(xe=[xe,Qe],le=xe):(O=le,le=r)}else O=le,le=r;if(le===r&&(le=null),le!==r){if(xe=[],Qe=Jo(),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=Jo();else xe=r;xe!==r?(ht=x,U=h(),x=U):(O=x,x=r)}else O=x,x=r}else O=x,x=r;if(x===r&&(x=O,U=Al(),U!==r?(le=JQ(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Al(),U!==r?(le=ll(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))){if(x=O,U=Al(),U!==r)if(le=ll(),le!==r)if(xe=xr(),xe!==r)if(Qe=nI(),Qe!==r){if(Ge=[],ct=Jo(),ct!==r)for(;ct!==r;)Ge.push(ct),ct=Jo();else Ge=r;Ge!==r?(ht=x,U=m(le,Qe),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;else O=x,x=r;else O=x,x=r;if(x===r)if(x=O,U=Al(),U!==r)if(le=ll(),le!==r){if(xe=[],Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=E,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=E,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r);else xe=r;xe!==r?(Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(t.charCodeAt(O)===58?(Ge=p,O++):(Ge=r,Ye===0&&et(d)),Ge!==r?(ct=xr(),ct===r&&(ct=null),ct!==r?(sr=qo(),sr!==r?(ht=x,U=R(le,xe,sr),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)}else O=x,x=r;else O=x,x=r}return x}function qo(){var x,U,le,xe,Qe,Ge,ct;if(x=O,U=O,Ye++,le=O,xe=Zs(),xe!==r?(Qe=qQ(),Qe!==r?(t.charCodeAt(O)===45?(Ge=o,O++):(Ge=r,Ye===0&&et(a)),Ge!==r?(ct=xr(),ct!==r?(xe=[xe,Qe,Ge,ct],le=xe):(O=le,le=r)):(O=le,le=r)):(O=le,le=r)):(O=le,le=r),Ye--,le!==r?(O=U,U=void 0):U=r,U!==r?(le=Jo(),le!==r?(xe=rI(),xe!==r?(Qe=Xa(),Qe!==r?(Ge=iI(),Ge!==r?(ht=x,U=H(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Zs(),U!==r?(le=rI(),le!==r?(xe=ol(),xe!==r?(Qe=iI(),Qe!==r?(ht=x,U=H(xe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))if(x=O,U=WQ(),U!==r){if(le=[],xe=Jo(),xe!==r)for(;xe!==r;)le.push(xe),xe=Jo();else le=r;le!==r?(ht=x,U=L(U),x=U):(O=x,x=r)}else O=x,x=r;return x}function Al(){var x,U,le;for(Ye++,x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=q(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),Ye--,x===r&&(U=r,Ye===0&&et(K)),x}function qQ(){var x,U,le;for(x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=A(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),x}function rI(){var x;return ht=O,x=V(),x?x=void 0:x=r,x}function iI(){var x;return ht=O,x=W(),x?x=void 0:x=r,x}function JQ(){var x;return x=cl(),x===r&&(x=Gf()),x}function ll(){var x,U,le;if(x=cl(),x===r){if(x=O,U=[],le=_c(),le!==r)for(;le!==r;)U.push(le),le=_c();else U=r;U!==r&&(ht=x,U=X()),x=U}return x}function WQ(){var x;return x=jf(),x===r&&(x=sI(),x===r&&(x=cl(),x===r&&(x=Gf()))),x}function nI(){var x;return x=jf(),x===r&&(x=cl(),x===r&&(x=_c())),x}function Gf(){var x,U,le,xe,Qe,Ge;if(Ye++,x=O,D.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(he)),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;return Ye--,x===r&&(U=r,Ye===0&&et(F)),x}function _c(){var x,U,le,xe,Qe;if(x=O,t.substr(O,2)===qe?(U=qe,O+=2):(U=r,Ye===0&&et(re)),U===r&&(U=null),U!==r)if(se.test(t.charAt(O))?(le=t.charAt(O),O++):(le=r,Ye===0&&et(be)),le!==r){for(xe=[],ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));Qe!==r;)xe.push(Qe),ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));xe!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;return x}function jf(){var x,U;return x=O,t.substr(O,4)===De?(U=De,O+=4):(U=r,Ye===0&&et($)),U!==r&&(ht=x,U=G()),x=U,x}function sI(){var x,U;return x=O,t.substr(O,4)===Ce?(U=Ce,O+=4):(U=r,Ye===0&&et(ee)),U!==r&&(ht=x,U=Ue()),x=U,x===r&&(x=O,t.substr(O,5)===Oe?(U=Oe,O+=5):(U=r,Ye===0&&et(vt)),U!==r&&(ht=x,U=dt()),x=U),x}function cl(){var x,U,le,xe;return Ye++,x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(t.charCodeAt(O)===34?(le=ii,O++):(le=r,Ye===0&&et(an)),le!==r?(ht=x,U=yr(),x=U):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(le=oI(),le!==r?(t.charCodeAt(O)===34?(xe=ii,O++):(xe=r,Ye===0&&et(an)),xe!==r?(ht=x,U=Ki(le),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)),Ye--,x===r&&(U=r,Ye===0&&et(ri)),x}function oI(){var x,U,le;if(x=O,U=[],le=Yf(),le!==r)for(;le!==r;)U.push(le),le=Yf();else U=r;return U!==r&&(ht=x,U=Qi(U)),x=U,x}function Yf(){var x,U,le,xe,Qe,Ge;return Go.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(wr)),x===r&&(x=O,t.substr(O,2)===Ui?(U=Ui,O+=2):(U=r,Ye===0&&et(ws)),U!==r&&(ht=x,U=Tf()),x=U,x===r&&(x=O,t.substr(O,2)===Mf?(U=Mf,O+=2):(U=r,Ye===0&&et(Rm)),U!==r&&(ht=x,U=Fm()),x=U,x===r&&(x=O,t.substr(O,2)===Nm?(U=Nm,O+=2):(U=r,Ye===0&&et(DQ)),U!==r&&(ht=x,U=RQ()),x=U,x===r&&(x=O,t.substr(O,2)===Of?(U=Of,O+=2):(U=r,Ye===0&&et(FQ)),U!==r&&(ht=x,U=NQ()),x=U,x===r&&(x=O,t.substr(O,2)===Lm?(U=Lm,O+=2):(U=r,Ye===0&&et(LQ)),U!==r&&(ht=x,U=Va()),x=U,x===r&&(x=O,t.substr(O,2)===jo?(U=jo,O+=2):(U=r,Ye===0&&et(Tm)),U!==r&&(ht=x,U=Mm()),x=U,x===r&&(x=O,t.substr(O,2)===te?(U=te,O+=2):(U=r,Ye===0&&et(Om)),U!==r&&(ht=x,U=Km()),x=U,x===r&&(x=O,t.substr(O,2)===il?(U=il,O+=2):(U=r,Ye===0&&et(Um)),U!==r&&(ht=x,U=Hm()),x=U,x===r&&(x=O,t.substr(O,2)===Kf?(U=Kf,O+=2):(U=r,Ye===0&&et(Gm)),U!==r?(le=Xc(),le!==r?(xe=Xc(),xe!==r?(Qe=Xc(),Qe!==r?(Ge=Xc(),Ge!==r?(ht=x,U=jm(le,xe,Qe,Ge),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)))))))))),x}function Xc(){var x;return TQ.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(MQ)),x}function xr(){var x,U;if(Ye++,x=[],qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm)),U!==r)for(;U!==r;)x.push(U),qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Ym)),x}function KM(){var x,U;if(Ye++,x=[],zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm)),U!==r)for(;U!==r;)x.push(U),zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Wm)),x}function Jo(){var x,U,le,xe,Qe,Ge;if(x=O,U=Zs(),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(U=[U,le],x=U):(O=x,x=r)}else O=x,x=r;return x}function Zs(){var x;return t.substr(O,2)===Uf?(x=Uf,O+=2):(x=r,Ye===0&&et(OQ)),x===r&&(t.charCodeAt(O)===10?(x=KQ,O++):(x=r,Ye===0&&et(_m)),x===r&&(t.charCodeAt(O)===13?(x=UQ,O++):(x=r,Ye===0&&et(HQ)))),x}let aI=2,Zc=0;if(nl=n(),nl!==r&&O===t.length)return nl;throw nl!==r&&O{var fRe=typeof global=="object"&&global&&global.Object===Object&&global;V5.exports=fRe});var Ks=I((Zat,_5)=>{var hRe=WP(),pRe=typeof self=="object"&&self&&self.Object===Object&&self,dRe=hRe||pRe||Function("return this")();_5.exports=dRe});var ac=I(($at,X5)=>{var CRe=Ks(),mRe=CRe.Symbol;X5.exports=mRe});var $5=I((eAt,Z5)=>{function IRe(t,e){for(var r=-1,i=t==null?0:t.length,n=Array(i);++r{var ERe=Array.isArray;e6.exports=ERe});var n6=I((rAt,t6)=>{var r6=ac(),i6=Object.prototype,yRe=i6.hasOwnProperty,wRe=i6.toString,Jp=r6?r6.toStringTag:void 0;function BRe(t){var e=yRe.call(t,Jp),r=t[Jp];try{t[Jp]=void 0;var i=!0}catch(s){}var n=wRe.call(t);return i&&(e?t[Jp]=r:delete t[Jp]),n}t6.exports=BRe});var o6=I((iAt,s6)=>{var QRe=Object.prototype,bRe=QRe.toString;function vRe(t){return bRe.call(t)}s6.exports=vRe});var Ac=I((nAt,a6)=>{var A6=ac(),SRe=n6(),xRe=o6(),kRe="[object Null]",PRe="[object Undefined]",l6=A6?A6.toStringTag:void 0;function DRe(t){return t==null?t===void 0?PRe:kRe:l6&&l6 in Object(t)?SRe(t):xRe(t)}a6.exports=DRe});var Qo=I((sAt,c6)=>{function RRe(t){return t!=null&&typeof t=="object"}c6.exports=RRe});var Nw=I((oAt,u6)=>{var FRe=Ac(),NRe=Qo(),LRe="[object Symbol]";function TRe(t){return typeof t=="symbol"||NRe(t)&&FRe(t)==LRe}u6.exports=TRe});var C6=I((aAt,g6)=>{var f6=ac(),MRe=$5(),ORe=As(),KRe=Nw(),URe=1/0,h6=f6?f6.prototype:void 0,p6=h6?h6.toString:void 0;function d6(t){if(typeof t=="string")return t;if(ORe(t))return MRe(t,d6)+"";if(KRe(t))return p6?p6.call(t):"";var e=t+"";return e=="0"&&1/t==-URe?"-0":e}g6.exports=d6});var gg=I((AAt,m6)=>{var HRe=C6();function GRe(t){return t==null?"":HRe(t)}m6.exports=GRe});var zP=I((lAt,I6)=>{function jRe(t,e,r){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var s=Array(n);++i{var YRe=zP();function qRe(t,e,r){var i=t.length;return r=r===void 0?i:r,!e&&r>=i?t:YRe(t,e,r)}E6.exports=qRe});var VP=I((uAt,w6)=>{var JRe="\\ud800-\\udfff",WRe="\\u0300-\\u036f",zRe="\\ufe20-\\ufe2f",VRe="\\u20d0-\\u20ff",_Re=WRe+zRe+VRe,XRe="\\ufe0e\\ufe0f",ZRe="\\u200d",$Re=RegExp("["+ZRe+JRe+_Re+XRe+"]");function eFe(t){return $Re.test(t)}w6.exports=eFe});var Q6=I((gAt,B6)=>{function tFe(t){return t.split("")}B6.exports=tFe});var R6=I((fAt,b6)=>{var v6="\\ud800-\\udfff",rFe="\\u0300-\\u036f",iFe="\\ufe20-\\ufe2f",nFe="\\u20d0-\\u20ff",sFe=rFe+iFe+nFe,oFe="\\ufe0e\\ufe0f",aFe="["+v6+"]",_P="["+sFe+"]",XP="\\ud83c[\\udffb-\\udfff]",AFe="(?:"+_P+"|"+XP+")",S6="[^"+v6+"]",x6="(?:\\ud83c[\\udde6-\\uddff]){2}",k6="[\\ud800-\\udbff][\\udc00-\\udfff]",lFe="\\u200d",P6=AFe+"?",D6="["+oFe+"]?",cFe="(?:"+lFe+"(?:"+[S6,x6,k6].join("|")+")"+D6+P6+")*",uFe=D6+P6+cFe,gFe="(?:"+[S6+_P+"?",_P,x6,k6,aFe].join("|")+")",fFe=RegExp(XP+"(?="+XP+")|"+gFe+uFe,"g");function hFe(t){return t.match(fFe)||[]}b6.exports=hFe});var N6=I((hAt,F6)=>{var pFe=Q6(),dFe=VP(),CFe=R6();function mFe(t){return dFe(t)?CFe(t):pFe(t)}F6.exports=mFe});var T6=I((pAt,L6)=>{var IFe=y6(),EFe=VP(),yFe=N6(),wFe=gg();function BFe(t){return function(e){e=wFe(e);var r=EFe(e)?yFe(e):void 0,i=r?r[0]:e.charAt(0),n=r?IFe(r,1).join(""):e.slice(1);return i[t]()+n}}L6.exports=BFe});var O6=I((dAt,M6)=>{var QFe=T6(),bFe=QFe("toUpperCase");M6.exports=bFe});var ZP=I((CAt,K6)=>{var vFe=gg(),SFe=O6();function xFe(t){return SFe(vFe(t).toLowerCase())}K6.exports=xFe});var H6=I((mAt,U6)=>{"use strict";U6.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Wp=I((IAt,$P)=>{"use strict";var kFe=H6(),G6=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,i=()=>{r--,e.length>0&&e.shift()()},n=(a,l,...c)=>{r++;let u=kFe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{rnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),o};$P.exports=G6;$P.exports.default=G6});var X6=I((FAt,Mw)=>{function PFe(){var t=0,e=1,r=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,d=15,m=16,E=17,B=0,b=1,R=2,H=3,L=4;function K(A,V){return 55296<=A.charCodeAt(V)&&A.charCodeAt(V)<=56319&&56320<=A.charCodeAt(V+1)&&A.charCodeAt(V+1)<=57343}function J(A,V){V===void 0&&(V=0);var W=A.charCodeAt(V);if(55296<=W&&W<=56319&&V=1){var X=A.charCodeAt(V-1),F=W;return 55296<=X&&X<=56319?(X-55296)*1024+(F-56320)+65536:F}return W}function ne(A,V,W){var X=[A].concat(V).concat([W]),F=X[X.length-2],D=W,he=X.lastIndexOf(p);if(he>1&&X.slice(1,he).every(function(Pe){return Pe==i})&&[i,h,E].indexOf(A)==-1)return R;var pe=X.lastIndexOf(n);if(pe>0&&X.slice(1,pe).every(function(Pe){return Pe==n})&&[f,n].indexOf(F)==-1)return X.filter(function(Pe){return Pe==n}).length%2==1?H:L;if(F==t&&D==e)return B;if(F==r||F==t||F==e)return D==p&&V.every(function(Pe){return Pe==i})?R:b;if(D==r||D==t||D==e)return b;if(F==o&&(D==o||D==a||D==c||D==u))return B;if((F==c||F==a)&&(D==a||D==l))return B;if((F==u||F==l)&&D==l)return B;if(D==i||D==d)return B;if(D==s)return B;if(F==f)return B;var Ne=X.indexOf(i)!=-1?X.lastIndexOf(i)-1:X.length-2;return[h,E].indexOf(X[Ne])!=-1&&X.slice(Ne+1,-1).every(function(Pe){return Pe==i})&&D==p||F==d&&[m,E].indexOf(D)!=-1?B:V.indexOf(n)!=-1?R:F==n&&D==n?B:b}this.nextBreak=function(A,V){if(V===void 0&&(V=0),V<0)return 0;if(V>=A.length-1)return A.length;for(var W=q(J(A,V)),X=[],F=V+1;F{var DFe=X6(),RFe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,FFe=new DFe;Z6.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=r-e,n="",s=0,o=0;for(;t.length>0;){let a=t.match(RFe)||[t,t,void 0],l=FFe.splitGraphemes(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),t=t.slice(a[0].length)}return n}});var fg=I((alt,f9)=>{"use strict";var h9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),olt=f9.exports=t=>t?Object.keys(t).map(e=>[h9.has(e)?h9.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var hg=I((Alt,p9)=>{"use strict";var JFe=require("events"),d9=require("stream"),_p=Rh(),C9=require("string_decoder").StringDecoder,va=Symbol("EOF"),Xp=Symbol("maybeEmitEnd"),xA=Symbol("emittedEnd"),Gw=Symbol("emittingEnd"),jw=Symbol("closed"),m9=Symbol("read"),iD=Symbol("flush"),I9=Symbol("flushChunk"),Bn=Symbol("encoding"),Sa=Symbol("decoder"),Yw=Symbol("flowing"),Zp=Symbol("paused"),$p=Symbol("resume"),rn=Symbol("bufferLength"),E9=Symbol("bufferPush"),nD=Symbol("bufferShift"),Ni=Symbol("objectMode"),Li=Symbol("destroyed"),y9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",WFe=y9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),zFe=y9&&Symbol.iterator||Symbol("iterator not implemented"),w9=t=>t==="end"||t==="finish"||t==="prefinish",VFe=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,_Fe=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t);p9.exports=class B9 extends d9{constructor(e){super();this[Yw]=!1,this[Zp]=!1,this.pipes=new _p,this.buffer=new _p,this[Ni]=e&&e.objectMode||!1,this[Ni]?this[Bn]=null:this[Bn]=e&&e.encoding||null,this[Bn]==="buffer"&&(this[Bn]=null),this[Sa]=this[Bn]?new C9(this[Bn]):null,this[va]=!1,this[xA]=!1,this[Gw]=!1,this[jw]=!1,this.writable=!0,this.readable=!0,this[rn]=0,this[Li]=!1}get bufferLength(){return this[rn]}get encoding(){return this[Bn]}set encoding(e){if(this[Ni])throw new Error("cannot set encoding in objectMode");if(this[Bn]&&e!==this[Bn]&&(this[Sa]&&this[Sa].lastNeed||this[rn]))throw new Error("cannot change encoding");this[Bn]!==e&&(this[Sa]=e?new C9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Sa].write(r)))),this[Bn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Ni]}set objectMode(e){this[Ni]=this[Ni]||!!e}write(e,r,i){if(this[va])throw new Error("write after end");return this[Li]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof r=="function"&&(i=r,r="utf8"),r||(r="utf8"),!this[Ni]&&!Buffer.isBuffer(e)&&(_Fe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):VFe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[Ni]&&!(r===this[Bn]&&!this[Sa].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Bn]&&(e=this[Sa].write(e)),this.flowing?(this[rn]!==0&&this[iD](!0),this.emit("data",e)):this[E9](e),this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Li])return null;try{return this[rn]===0||e===0||e>this[rn]?null:(this[Ni]&&(e=null),this.buffer.length>1&&!this[Ni]&&(this.encoding?this.buffer=new _p([Array.from(this.buffer).join("")]):this.buffer=new _p([Buffer.concat(Array.from(this.buffer),this[rn])])),this[m9](e||null,this.buffer.head.value))}finally{this[Xp]()}}[m9](e,r){return e===r.length||e===null?this[nD]():(this.buffer.head.value=r.slice(e),r=r.slice(0,e),this[rn]-=e),this.emit("data",r),!this.buffer.length&&!this[va]&&this.emit("drain"),r}end(e,r,i){return typeof e=="function"&&(i=e,e=null),typeof r=="function"&&(i=r,r="utf8"),e&&this.write(e,r),i&&this.once("end",i),this[va]=!0,this.writable=!1,(this.flowing||!this[Zp])&&this[Xp](),this}[$p](){this[Li]||(this[Zp]=!1,this[Yw]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[va]?this[Xp]():this.emit("drain"))}resume(){return this[$p]()}pause(){this[Yw]=!1,this[Zp]=!0}get destroyed(){return this[Li]}get flowing(){return this[Yw]}get paused(){return this[Zp]}[E9](e){return this[Ni]?this[rn]+=1:this[rn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[Ni]?this[rn]-=1:this[rn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[I9](this[nD]()));!e&&!this.buffer.length&&!this[va]&&this.emit("drain")}[I9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Li])return;let i=this[xA];r=r||{},e===process.stdout||e===process.stderr?r.end=!1:r.end=r.end!==!1;let n={dest:e,opts:r,ondrain:s=>this[$p]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[$p](),i&&n.opts.end&&n.dest.end(),e}addListener(e,r){return this.on(e,r)}on(e,r){try{return super.on(e,r)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[$p]():w9(e)&&this[xA]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[xA]}[Xp](){!this[Gw]&&!this[xA]&&!this[Li]&&this.buffer.length===0&&this[va]&&(this[Gw]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[jw]&&this.emit("close"),this[Gw]=!1)}emit(e,r){if(e!=="error"&&e!=="close"&&e!==Li&&this[Li])return;if(e==="data"){if(!r)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(r)===!1&&this.pause())}else if(e==="end"){if(this[xA]===!0)return;this[xA]=!0,this.readable=!1,this[Sa]&&(r=this[Sa].end(),r&&(this.pipes.forEach(n=>n.dest.write(r)),super.emit("data",r))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[jw]=!0,!this[xA]&&!this[Li]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=r,arguments.length>2)for(let n=2;n{e.push(i),this[Ni]||(e.dataLength+=i.length)}),r.then(()=>e)}concat(){return this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this[Bn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Li,()=>r(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>r(i))})}[WFe](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[va])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[va]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Li,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[zFe](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Li]?(e?this.emit("error",e):this.emit(Li),this):(this[Li]=!0,this.buffer=new _p,this[rn]=0,typeof this.close=="function"&&!this[jw]&&this.close(),e?this.emit("error",e):this.emit(Li),this)}static isStream(e){return!!e&&(e instanceof B9||e instanceof d9||e instanceof JFe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var b9=I((llt,Q9)=>{var XFe=require("zlib").constants||{ZLIB_VERNUM:4736};Q9.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},XFe))});var fD=I(Un=>{"use strict";var sD=require("assert"),kA=require("buffer").Buffer,v9=require("zlib"),uc=Un.constants=b9(),ZFe=hg(),S9=kA.concat,gc=Symbol("_superWrite"),ed=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},$Fe=Symbol("opts"),td=Symbol("flushFlag"),x9=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),tr=Symbol("handle"),qw=Symbol("onError"),pg=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),clt=Symbol("_defaultFullFlush"),cD=class extends ZFe{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[pg]=!1,this[lD]=!1,this[$Fe]=e,this[td]=e.flush,this[x9]=e.finishFlush;try{this[tr]=new v9[r](e)}catch(i){throw new ed(i)}this[qw]=i=>{this[pg]||(this[pg]=!0,this.close(),this.emit("error",i))},this[tr].on("error",i=>this[qw](new ed(i))),this.once("end",()=>this.close)}close(){this[tr]&&(this[tr].close(),this[tr]=null,this.emit("close"))}reset(){if(!this[pg])return sD(this[tr],"zlib binding closed"),this[tr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(kA.alloc(0),{[td]:e})))}end(e,r,i){return e&&this.write(e,r),this.flush(this[x9]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,r,i){if(typeof r=="function"&&(i=r,r="utf8"),typeof e=="string"&&(e=kA.from(e,r)),this[pg])return;sD(this[tr],"zlib binding closed");let n=this[tr]._handle,s=n.close;n.close=()=>{};let o=this[tr].close;this[tr].close=()=>{},kA.concat=c=>c;let a;try{let c=typeof e[td]=="number"?e[td]:this[td];a=this[tr]._processChunk(e,c),kA.concat=S9}catch(c){kA.concat=S9,this[qw](new ed(c))}finally{this[tr]&&(this[tr]._handle=n,n.close=s,this[tr].close=o,this[tr].removeAllListeners("error"))}this[tr]&&this[tr].on("error",c=>this[qw](new ed(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[gc](kA.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[tr].params(e,r)}finally{this[tr].flush=i}this[tr]&&(this[aD]=e,this[AD]=r)}}}},k9=class extends PA{constructor(e){super(e,"Deflate")}},P9=class extends PA{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),D9=class extends PA{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[gc](e){return this[uD]?(this[uD]=!1,e[9]=255,super[gc](e)):super[gc](e)}},R9=class extends PA{constructor(e){super(e,"Gunzip")}},F9=class extends PA{constructor(e){super(e,"DeflateRaw")}},N9=class extends PA{constructor(e){super(e,"InflateRaw")}},L9=class extends PA{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,r){e=e||{},e.flush=e.flush||uc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||uc.BROTLI_OPERATION_FINISH,super(e,r),this[oD]=uc.BROTLI_OPERATION_FLUSH}},T9=class extends gD{constructor(e){super(e,"BrotliCompress")}},M9=class extends gD{constructor(e){super(e,"BrotliDecompress")}};Un.Deflate=k9;Un.Inflate=P9;Un.Gzip=D9;Un.Gunzip=R9;Un.DeflateRaw=F9;Un.InflateRaw=N9;Un.Unzip=L9;typeof v9.BrotliCompress=="function"?(Un.BrotliCompress=T9,Un.BrotliDecompress=M9):Un.BrotliCompress=Un.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var rd=I(Jw=>{"use strict";Jw.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);Jw.code=new Map(Array.from(Jw.name).map(t=>[t[1],t[0]]))});var id=I((plt,O9)=>{"use strict";var flt=rd(),eNe=hg(),hD=Symbol("slurp");O9.exports=class extends eNe{constructor(e,r,i){super();switch(this.pause(),this.extended=r,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,r&&this[hD](r),i&&this[hD](i,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-r),this.blockRemain=Math.max(0,n-r),this.ignore?!0:i>=r?super.write(e):super.write(e.slice(0,i))}[hD](e,r){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(r&&i==="path")&&(this[i]=e[i])}}});var H9=I(pD=>{"use strict";var dlt=pD.encode=(t,e)=>{if(Number.isSafeInteger(t))t<0?rNe(t,e):tNe(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},tNe=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},rNe=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var i=e.length;i>1;i--){var n=t&255;t=Math.floor(t/256),r?e[i-1]=K9(n):n===0?e[i-1]=0:(r=!0,e[i-1]=U9(n))}},Clt=pD.parse=t=>{var e=t[t.length-1],r=t[0],i;if(r===128)i=nNe(t.slice(1,t.length));else if(r===255)i=iNe(t);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},iNe=t=>{for(var e=t.length,r=0,i=!1,n=e-1;n>-1;n--){var s=t[n],o;i?o=K9(s):s===0?o=s:(i=!0,o=U9(s)),o!==0&&(r-=o*Math.pow(256,e-n-1))}return r},nNe=t=>{for(var e=t.length,r=0,i=e-1;i>-1;i--){var n=t[i];n!==0&&(r+=n*Math.pow(256,e-i-1))}return r},K9=t=>(255^t)&255,U9=t=>(255^t)+1&255});var Cg=I((Ilt,G9)=>{"use strict";var dD=rd(),dg=require("path").posix,j9=H9(),CD=Symbol("slurp"),Hn=Symbol("type"),Y9=class{constructor(e,r,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Hn]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,i,n):e&&this.set(e)}decode(e,r,i,n){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=fc(e,r,100),this.mode=DA(e,r+100,8),this.uid=DA(e,r+108,8),this.gid=DA(e,r+116,8),this.size=DA(e,r+124,12),this.mtime=mD(e,r+136,12),this.cksum=DA(e,r+148,12),this[CD](i),this[CD](n,!0),this[Hn]=fc(e,r+156,1),this[Hn]===""&&(this[Hn]="0"),this[Hn]==="0"&&this.path.substr(-1)==="/"&&(this[Hn]="5"),this[Hn]==="5"&&(this.size=0),this.linkpath=fc(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=fc(e,r+265,32),this.gname=fc(e,r+297,32),this.devmaj=DA(e,r+329,8),this.devmin=DA(e,r+337,8),e[r+475]!==0){let o=fc(e,r+345,155);this.path=o+"/"+this.path}else{let o=fc(e,r+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,r+476,12),this.ctime=mD(e,r+488,12)}let s=8*32;for(let o=r;o=r+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=sNe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=hc(e,r,100,s)||this.needPax,this.needPax=RA(e,r+100,8,this.mode)||this.needPax,this.needPax=RA(e,r+108,8,this.uid)||this.needPax,this.needPax=RA(e,r+116,8,this.gid)||this.needPax,this.needPax=RA(e,r+124,12,this.size)||this.needPax,this.needPax=ID(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Hn].charCodeAt(0),this.needPax=hc(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=hc(e,r+265,32,this.uname)||this.needPax,this.needPax=hc(e,r+297,32,this.gname)||this.needPax,this.needPax=RA(e,r+329,8,this.devmaj)||this.needPax,this.needPax=RA(e,r+337,8,this.devmin)||this.needPax,this.needPax=hc(e,r+345,i,o)||this.needPax,e[r+475]!==0?this.needPax=hc(e,r+345,155,o)||this.needPax:(this.needPax=hc(e,r+345,130,o)||this.needPax,this.needPax=ID(e,r+476,12,this.atime)||this.needPax,this.needPax=ID(e,r+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=r;l{let r=100,i=t,n="",s,o=dg.parse(t).root||".";if(Buffer.byteLength(i)r&&Buffer.byteLength(n)<=e?s=[i.substr(0,r-1),n,!0]:(i=dg.join(dg.basename(n),i),n=dg.dirname(n));while(n!==o&&!s);s||(s=[t.substr(0,r-1),"",!0])}return s},fc=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),mD=(t,e,r)=>oNe(DA(t,e,r)),oNe=t=>t===null?null:new Date(t*1e3),DA=(t,e,r)=>t[e]&128?j9.parse(t.slice(e,e+r)):aNe(t,e,r),ANe=t=>isNaN(t)?null:t,aNe=(t,e,r)=>ANe(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),lNe={12:8589934591,8:2097151},RA=(t,e,r,i)=>i===null?!1:i>lNe[r]||i<0?(j9.encode(i,t.slice(e,e+r)),!0):(cNe(t,e,r,i),!1),cNe=(t,e,r,i)=>t.write(uNe(i,r),e,r,"ascii"),uNe=(t,e)=>gNe(Math.floor(t).toString(8),e),gNe=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",ID=(t,e,r,i)=>i===null?!1:RA(t,e,r,i.getTime()/1e3),fNe=new Array(156).join("\0"),hc=(t,e,r,i)=>i===null?!1:(t.write(i+fNe,e,r,"utf8"),i.length!==Buffer.byteLength(i)||i.length>r);G9.exports=Y9});var zw=I((Elt,q9)=>{"use strict";var hNe=Cg(),pNe=require("path"),Ww=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),i=512*Math.ceil(1+r/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new hNe({path:("PaxHeader/"+pNe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,r,"utf8");for(let s=r+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};Ww.parse=(t,e,r)=>new Ww(dNe(CNe(t),e),r);var dNe=(t,e)=>e?Object.keys(t).reduce((r,i)=>(r[i]=t[i],r),e):t,CNe=t=>t.replace(/\n$/,"").split(` +`).reduce(mNe,Object.create(null)),mNe=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return t;let s=i.join("=");return t[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,t};q9.exports=Ww});var Vw=I((ylt,J9)=>{"use strict";J9.exports=t=>class extends t{warn(e,r,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=r instanceof Error&&r.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(r instanceof Error&&(i=Object.assign(r,i),r=r.message),this.emit("warn",i.tarCode,r,i)):r instanceof Error?this.emit("error",Object.assign(r,i)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),i))}}});var yD=I((wlt,W9)=>{"use strict";var _w=["|","<",">","?",":"],ED=_w.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),INe=new Map(_w.map((t,e)=>[t,ED[e]])),ENe=new Map(ED.map((t,e)=>[t,_w[e]]));W9.exports={encode:t=>_w.reduce((e,r)=>e.split(r).join(INe.get(r)),t),decode:t=>ED.reduce((e,r)=>e.split(r).join(ENe.get(r)),t)}});var V9=I((Blt,z9)=>{"use strict";z9.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&~18),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var xD=I((xlt,_9)=>{"use strict";var X9=hg(),Z9=zw(),$9=Cg(),Qlt=id(),bo=require("fs"),mg=require("path"),blt=rd(),yNe=16*1024*1024,e7=Symbol("process"),t7=Symbol("file"),r7=Symbol("directory"),wD=Symbol("symlink"),i7=Symbol("hardlink"),nd=Symbol("header"),Xw=Symbol("read"),BD=Symbol("lstat"),Zw=Symbol("onlstat"),QD=Symbol("onread"),bD=Symbol("onreadlink"),vD=Symbol("openfile"),SD=Symbol("onopenfile"),pc=Symbol("close"),$w=Symbol("mode"),n7=Vw(),wNe=yD(),s7=V9(),eB=n7(class extends X9{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||yNe,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=r.cwd||process.cwd(),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(!this.preservePaths&&mg.win32.isAbsolute(e)){let n=mg.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=wNe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=r.absolute||mg.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[Zw](this.statCache.get(this.absolute)):this[BD]()}[BD](){bo.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[Zw](r)})}[Zw](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=BNe(e),this.emit("stat",e),this[e7]()}[e7](){switch(this.type){case"File":return this[t7]();case"Directory":return this[r7]();case"SymbolicLink":return this[wD]();default:return this.end()}}[$w](e){return s7(e,this.type==="Directory",this.portable)}[nd](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new $9({path:this.path,linkpath:this.linkpath,mode:this[$w](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new Z9({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[r7](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[nd](),this.end()}[wD](){bo.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[bD](r)})}[bD](e){this.linkpath=e.replace(/\\/g,"/"),this[nd](),this.end()}[i7](e){this.type="Link",this.linkpath=mg.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[nd](),this.end()}[t7](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[i7](r)}this.linkCache.set(e,this.absolute)}if(this[nd](),this.stat.size===0)return this.end();this[vD]()}[vD](){bo.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[SD](r)})}[SD](e){let r=512*Math.ceil(this.stat.size/512),i=Math.min(r,this.maxReadSize),n=Buffer.allocUnsafe(i);this[Xw](e,n,0,n.length,0,this.stat.size,r)}[Xw](e,r,i,n,s,o,a){bo.read(e,r,i,n,s,(l,c)=>{if(l)return this[pc](e,()=>this.emit("error",l));this[QD](e,r,i,n,s,o,a,c)})}[pc](e,r){bo.close(e,r)}[QD](e,r,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(r=Buffer.allocUnsafe(n),i=0),n=r.length-i,this[Xw](e,r,i,n,s,o,a)}}),o7=class extends eB{constructor(e,r){super(e,r)}[BD](){this[Zw](bo.lstatSync(this.absolute))}[wD](){this[bD](bo.readlinkSync(this.absolute))}[vD](){this[SD](bo.openSync(this.absolute,"r"))}[Xw](e,r,i,n,s,o,a){let l=!0;try{let c=bo.readSync(e,r,i,n,s);this[QD](e,r,i,n,s,o,a,c),l=!1}finally{if(l)try{this[pc](e,()=>{})}catch(c){}}}[pc](e,r){bo.closeSync(e),r()}},QNe=n7(class extends X9{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[$w](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(mg.isAbsolute(this.path)&&!this.preservePaths){let n=mg.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new $9({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new Z9({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[$w](e){return s7(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});eB.Sync=o7;eB.Tar=QNe;var BNe=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";_9.exports=eB});var AB=I((Plt,a7)=>{"use strict";var kD=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},bNe=hg(),vNe=fD(),SNe=id(),PD=xD(),xNe=PD.Sync,kNe=PD.Tar,PNe=Rh(),A7=Buffer.alloc(1024),tB=Symbol("onStat"),rB=Symbol("ended"),vo=Symbol("queue"),Ig=Symbol("current"),dc=Symbol("process"),iB=Symbol("processing"),l7=Symbol("processJob"),So=Symbol("jobs"),DD=Symbol("jobDone"),nB=Symbol("addFSEntry"),c7=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),sB=Symbol("onreaddir"),oB=Symbol("pipe"),u7=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),g7=Symbol("write"),TD=Symbol("ondrain"),aB=require("fs"),f7=require("path"),DNe=Vw(),MD=DNe(class extends bNe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new vNe.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[TD]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[vo]=new PNe,this[So]=0,this.jobs=+e.jobs||4,this[iB]=!1,this[rB]=!1}[g7](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[rB]=!0,this[dc](),this}write(e){if(this[rB])throw new Error("write after end");return e instanceof SNe?this[c7](e):this[nB](e),this.flowing}[c7](e){let r=f7.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,r,!1);i.entry=new kNe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[So]+=1,this[vo].push(i)}this[dc]()}[nB](e){let r=f7.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[vo].push(new kD(e,r)),this[dc]()}[RD](e){e.pending=!0,this[So]+=1;let r=this.follow?"stat":"lstat";aB[r](e.absolute,(i,n)=>{e.pending=!1,this[So]-=1,i?this.emit("error",i):this[tB](e,n)})}[tB](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[dc]()}[FD](e){e.pending=!0,this[So]+=1,aB.readdir(e.absolute,(r,i)=>{if(e.pending=!1,this[So]-=1,r)return this.emit("error",r);this[sB](e,i)})}[sB](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[dc]()}[dc](){if(!this[iB]){this[iB]=!0;for(let e=this[vo].head;e!==null&&this[So]this.warn(r,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[u7](e){this[So]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[TD](){this[Ig]&&this[Ig].entry&&this[Ig].entry.resume()}[oB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)});let r=e.entry,i=this.zip;i?r.on("data",n=>{i.write(n)||r.pause()}):r.on("data",n=>{super.write(n)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),h7=class extends MD{constructor(e){super(e);this[LD]=xNe}pause(){}resume(){}[RD](e){let r=this.follow?"statSync":"lstatSync";this[tB](e,aB[r](e.absolute))}[FD](e,r){this[sB](e,aB.readdirSync(e.absolute))}[oB](e){let r=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)}),i?r.on("data",n=>{i.write(n)}):r.on("data",n=>{super[g7](n)})}};MD.Sync=h7;a7.exports=MD});var bg=I(sd=>{"use strict";var RNe=hg(),FNe=require("events").EventEmitter,ls=require("fs"),lB=process.binding("fs"),Dlt=lB.writeBuffers,NNe=lB.FSReqWrap||lB.FSReqCallback,Eg=Symbol("_autoClose"),xo=Symbol("_close"),od=Symbol("_ended"),Jt=Symbol("_fd"),p7=Symbol("_finished"),Cc=Symbol("_flags"),OD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),cB=Symbol("_needDrain"),yg=Symbol("_onerror"),wg=Symbol("_onopen"),GD=Symbol("_onread"),mc=Symbol("_onwrite"),FA=Symbol("_open"),NA=Symbol("_path"),Ic=Symbol("_pos"),ko=Symbol("_queue"),Bg=Symbol("_read"),d7=Symbol("_readSize"),LA=Symbol("_reading"),uB=Symbol("_remain"),C7=Symbol("_size"),gB=Symbol("_write"),Qg=Symbol("_writing"),fB=Symbol("_defaultFlag"),jD=class extends RNe{constructor(e,r){if(r=r||{},super(r),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Jt]=typeof r.fd=="number"?r.fd:null,this[NA]=e,this[d7]=r.readSize||16*1024*1024,this[LA]=!1,this[C7]=typeof r.size=="number"?r.size:Infinity,this[uB]=this[C7],this[Eg]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Jt]=="number"?this[Bg]():this[FA]()}get fd(){return this[Jt]}get path(){return this[NA]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[FA](){ls.open(this[NA],"r",(e,r)=>this[wg](e,r))}[wg](e,r){e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[Bg]())}[UD](){return Buffer.allocUnsafe(Math.min(this[d7],this[uB]))}[Bg](){if(!this[LA]){this[LA]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[GD](null,0,e));ls.read(this[Jt],e,0,e.length,null,(r,i,n)=>this[GD](r,i,n))}}[GD](e,r,i){this[LA]=!1,e?this[yg](e):this[KD](r,i)&&this[Bg]()}[xo](){this[Eg]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}[yg](e){this[LA]=!0,this[xo](),this.emit("error",e)}[KD](e,r){let i=!1;return this[uB]-=e,e>0&&(i=super.write(ethis[wg](e,r))}[wg](e,r){this[fB]&&this[Cc]==="r+"&&e&&e.code==="ENOENT"?(this[Cc]="w",this[FA]()):e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[OD]())}end(e,r){e&&this.write(e,r),this[od]=!0,!this[Qg]&&!this[ko].length&&typeof this[Jt]=="number"&&this[mc](null,0)}write(e,r){return typeof e=="string"&&(e=new Buffer(e,r)),this[od]?(this.emit("error",new Error("write() after end()")),!1):this[Jt]===null||this[Qg]||this[ko].length?(this[ko].push(e),this[cB]=!0,!1):(this[Qg]=!0,this[gB](e),!0)}[gB](e){ls.write(this[Jt],e,0,e.length,this[Ic],(r,i)=>this[mc](r,i))}[mc](e,r){e?this[yg](e):(this[Ic]!==null&&(this[Ic]+=r),this[ko].length?this[OD]():(this[Qg]=!1,this[od]&&!this[p7]?(this[p7]=!0,this[xo](),this.emit("finish")):this[cB]&&(this[cB]=!1,this.emit("drain"))))}[OD](){if(this[ko].length===0)this[od]&&this[mc](null,0);else if(this[ko].length===1)this[gB](this[ko].pop());else{let e=this[ko];this[ko]=[],LNe(this[Jt],e,this[Ic],(r,i)=>this[mc](r,i))}}[xo](){this[Eg]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}},I7=class extends YD{[FA](){let e;try{e=ls.openSync(this[NA],this[Cc],this[HD])}catch(r){if(this[fB]&&this[Cc]==="r+"&&r&&r.code==="ENOENT")return this[Cc]="w",this[FA]();throw r}this[wg](null,e)}[xo](){if(this[Eg]&&typeof this[Jt]=="number"){try{ls.closeSync(this[Jt])}catch(e){}this[Jt]=null,this.emit("close")}}[gB](e){try{this[mc](null,ls.writeSync(this[Jt],e,0,e.length,this[Ic]))}catch(r){this[mc](r,0)}}},LNe=(t,e,r,i)=>{let n=(o,a)=>i(o,a,e),s=new NNe;s.oncomplete=n,lB.writeBuffers(t,e,r,s)};sd.ReadStream=jD;sd.ReadStreamSync=m7;sd.WriteStream=YD;sd.WriteStreamSync=I7});var ld=I((Llt,E7)=>{"use strict";var TNe=Vw(),Flt=require("path"),MNe=Cg(),ONe=require("events"),KNe=Rh(),UNe=1024*1024,HNe=id(),y7=zw(),GNe=fD(),qD=Buffer.from([31,139]),cs=Symbol("state"),Ec=Symbol("writeEntry"),xa=Symbol("readEntry"),JD=Symbol("nextEntry"),w7=Symbol("processEntry"),us=Symbol("extendedHeader"),ad=Symbol("globalExtendedHeader"),TA=Symbol("meta"),B7=Symbol("emitMeta"),Ar=Symbol("buffer"),ka=Symbol("queue"),yc=Symbol("ended"),Q7=Symbol("emittedEnd"),wc=Symbol("emit"),Qn=Symbol("unzip"),hB=Symbol("consumeChunk"),pB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),b7=Symbol("consumeMeta"),v7=Symbol("consumeHeader"),dB=Symbol("consuming"),zD=Symbol("bufferConcat"),VD=Symbol("maybeEnd"),Ad=Symbol("writing"),MA=Symbol("aborted"),CB=Symbol("onDone"),Bc=Symbol("sawValidEntry"),mB=Symbol("sawNullBlock"),IB=Symbol("sawEOF"),jNe=t=>!0;E7.exports=TNe(class extends ONe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[Bc]=null,this.on(CB,r=>{(this[cs]==="begin"||this[Bc]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(CB,e.ondone):this.on(CB,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||UNe,this.filter=typeof e.filter=="function"?e.filter:jNe,this.writable=!0,this.readable=!1,this[ka]=new KNe,this[Ar]=null,this[xa]=null,this[Ec]=null,this[cs]="begin",this[TA]="",this[us]=null,this[ad]=null,this[yc]=!1,this[Qn]=null,this[MA]=!1,this[mB]=!1,this[IB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[v7](e,r){this[Bc]===null&&(this[Bc]=!1);let i;try{i=new MNe(e,r,this[us],this[ad])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[mB]?(this[IB]=!0,this[cs]==="begin"&&(this[cs]="header"),this[wc]("eof")):(this[mB]=!0,this[wc]("nullBlock"));else if(this[mB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[Ec]=new HNe(i,this[us],this[ad]);if(!this[Bc])if(s.remain){let o=()=>{s.invalid||(this[Bc]=!0)};s.on("end",o)}else this[Bc]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[wc]("ignoredEntry",s),this[cs]="ignore",s.resume()):s.size>0&&(this[TA]="",s.on("data",o=>this[TA]+=o),this[cs]="meta"):(this[us]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[wc]("ignoredEntry",s),this[cs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[cs]="body":(this[cs]="header",s.end()),this[xa]?this[ka].push(s):(this[ka].push(s),this[JD]())))}}}[w7](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[xa]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),r=!1)):(this[xa]=null,r=!1),r}[JD](){do;while(this[w7](this[ka].shift()));if(!this[ka].length){let e=this[xa];!e||e.flowing||e.size===e.remain?this[Ad]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,r){let i=this[Ec],n=i.blockRemain,s=n>=e.length&&r===0?e:e.slice(r,r+n);return i.write(s),i.blockRemain||(this[cs]="header",this[Ec]=null,i.end()),s.length}[b7](e,r){let i=this[Ec],n=this[WD](e,r);return this[Ec]||this[B7](i),n}[wc](e,r,i){!this[ka].length&&!this[xa]?this.emit(e,r,i):this[ka].push([e,r,i])}[B7](e){switch(this[wc]("meta",this[TA]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[us]=y7.parse(this[TA],this[us],!1);break;case"GlobalExtendedHeader":this[ad]=y7.parse(this[TA],this[ad],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[us]=this[us]||Object.create(null),this[us].path=this[TA].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[us]=this[us]||Object.create(null),this[us].linkpath=this[TA].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[MA]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[MA])return;if(this[Qn]===null&&e){if(this[Ar]&&(e=Buffer.concat([this[Ar],e]),this[Ar]=null),e.lengththis[hB](s)),this[Qn].on("error",s=>this.abort(s)),this[Qn].on("end",s=>{this[yc]=!0,this[hB]()}),this[Ad]=!0;let n=this[Qn][i?"end":"write"](e);return this[Ad]=!1,n}}this[Ad]=!0,this[Qn]?this[Qn].write(e):this[hB](e),this[Ad]=!1;let r=this[ka].length?!1:this[xa]?this[xa].flowing:!0;return!r&&!this[ka].length&&this[xa].once("drain",i=>this.emit("drain")),r}[zD](e){e&&!this[MA]&&(this[Ar]=this[Ar]?Buffer.concat([this[Ar],e]):e)}[VD](){if(this[yc]&&!this[Q7]&&!this[MA]&&!this[dB]){this[Q7]=!0;let e=this[Ec];if(e&&e.blockRemain){let r=this[Ar]?this[Ar].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Ar]&&e.write(this[Ar]),e.end()}this[wc](CB)}}[hB](e){if(this[dB])this[zD](e);else if(!e&&!this[Ar])this[VD]();else{if(this[dB]=!0,this[Ar]){this[zD](e);let r=this[Ar];this[Ar]=null,this[pB](r)}else this[pB](e);for(;this[Ar]&&this[Ar].length>=512&&!this[MA]&&!this[IB];){let r=this[Ar];this[Ar]=null,this[pB](r)}this[dB]=!1}(!this[Ar]||this[yc])&&this[VD]()}[pB](e){let r=0,i=e.length;for(;r+512<=i&&!this[MA]&&!this[IB];)switch(this[cs]){case"begin":case"header":this[v7](e,r),r+=512;break;case"ignore":case"body":r+=this[WD](e,r);break;case"meta":r+=this[b7](e,r);break;default:throw new Error("invalid state: "+this[cs])}r{"use strict";var YNe=fg(),x7=ld(),vg=require("fs"),qNe=bg(),k7=require("path"),Tlt=S7.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=YNe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&WNe(i,e),i.noResume||JNe(i),i.file&&i.sync?zNe(i):i.file?VNe(i,r):P7(i)},JNe=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},WNe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||k7.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(k7.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},zNe=t=>{let e=P7(t),r=t.file,i=!0,n;try{let s=vg.statSync(r),o=t.maxReadSize||16*1024*1024;if(s.size{let r=new x7(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("end",o),vg.stat(n,(l,c)=>{if(l)a(l);else{let u=new qNe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},P7=t=>new x7(t)});var T7=I((Ult,D7)=>{"use strict";var _Ne=fg(),yB=AB(),Olt=require("fs"),R7=bg(),F7=EB(),N7=require("path"),Klt=D7.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=_Ne(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?XNe(i,e):i.file?ZNe(i,e,r):i.sync?$Ne(i,e):eLe(i,e)},XNe=(t,e)=>{let r=new yB.Sync(t),i=new R7.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(i),L7(r,e)},ZNe=(t,e,r)=>{let i=new yB(t),n=new R7.WriteStream(t.file,{mode:t.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return _D(i,e),r?s.then(r,r):s},L7=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?F7({file:N7.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},_D=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return F7({file:N7.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>_D(t,e));t.add(r)}t.end()},$Ne=(t,e)=>{let r=new yB.Sync(t);return L7(r,e),r},eLe=(t,e)=>{let r=new yB(t);return _D(r,e),r}});var XD=I((jlt,M7)=>{"use strict";var tLe=fg(),O7=AB(),Hlt=ld(),gs=require("fs"),K7=bg(),U7=EB(),H7=require("path"),G7=Cg(),Glt=M7.exports=(t,e,r)=>{let i=tLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?rLe(i,e):iLe(i,e,r)},rLe=(t,e)=>{let r=new O7.Sync(t),i=!0,n,s;try{try{n=gs.openSync(t.file,"r+")}catch(l){if(l.code==="ENOENT")n=gs.openSync(t.file,"w+");else throw l}let o=gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,t.mtimeCache&&t.mtimeCache.set(l.path,l.mtime)}i=!1,nLe(t,r,s,n,e)}finally{if(i)try{gs.closeSync(n)}catch(o){}}},nLe=(t,e,r,i,n)=>{let s=new K7.WriteStreamSync(t.file,{fd:i,start:r});e.pipe(s),sLe(e,n)},iLe=(t,e,r)=>{e=Array.from(e);let i=new O7(t),n=(o,a,l)=>{let c=(p,d)=>{p?gs.close(o,m=>l(p)):l(null,d)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,d)=>{if(p)return c(p);if(g+=d,g<512&&d)return gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let m=new G7(f);if(!m.cksumValid)return c(null,u);let E=512*Math.ceil(m.size/512);if(u+E+512>a||(u+=E+512,u>=a))return c(null,u);t.mtimeCache&&t.mtimeCache.set(m.path,m.mtime),g=0,gs.read(o,f,0,512,u,h)};gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",gs.open(t.file,l,c);if(u)return a(u);gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,d)=>{if(p)return a(p);let m=new K7.WriteStream(t.file,{fd:g,start:d});i.pipe(m),m.on("error",a),m.on("close",o),j7(i,e)})})};gs.open(t.file,l,c)});return r?s.then(r,r):s},sLe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?U7({file:H7.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},j7=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return U7({file:H7.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>j7(t,e));t.add(r)}t.end()}});var q7=I((qlt,Y7)=>{"use strict";var oLe=fg(),aLe=XD(),Ylt=Y7.exports=(t,e,r)=>{let i=oLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),ALe(i),aLe(i,e,r)},ALe=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,i)=>e(r,i)&&!(t.mtimeCache.get(r)>i.mtime):(r,i)=>!(t.mtimeCache.get(r)>i.mtime)}});var z7=I((Jlt,J7)=>{var{promisify:W7}=require("util"),OA=require("fs"),lLe=t=>{if(!t)t={mode:511,fs:OA};else if(typeof t=="object")t=P({mode:511,fs:OA},t);else if(typeof t=="number")t={mode:t,fs:OA};else if(typeof t=="string")t={mode:parseInt(t,8),fs:OA};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||OA.mkdir,t.mkdirAsync=W7(t.mkdir),t.stat=t.stat||t.fs.stat||OA.stat,t.statAsync=W7(t.stat),t.statSync=t.statSync||t.fs.statSync||OA.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||OA.mkdirSync,t};J7.exports=lLe});var _7=I((Wlt,V7)=>{var cLe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:uLe,parse:gLe}=require("path"),fLe=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=uLe(t),cLe==="win32"){let e=/[*|"<>?:]/,{root:r}=gLe(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};V7.exports=fLe});var tV=I((zlt,X7)=>{var{dirname:Z7}=require("path"),$7=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(i=>i.isDirectory()?r:void 0,i=>i.code==="ENOENT"?$7(t,Z7(e),e):void 0),eV=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(i){return i.code==="ENOENT"?eV(t,Z7(e),e):void 0}};X7.exports={findMade:$7,findMadeSync:eV}});var eR=I((Vlt,rV)=>{var{dirname:iV}=require("path"),ZD=(t,e,r)=>{e.recursive=!1;let i=iV(t);return i===t?e.mkdirAsync(t,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(t,e).then(()=>r||t,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(t,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(t).then(s=>{if(s.isDirectory())return r;throw n},()=>{throw n})})},$D=(t,e,r)=>{let i=iV(t);if(e.recursive=!1,i===t)try{return e.mkdirSync(t,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(t,e),r||t}catch(n){if(n.code==="ENOENT")return $D(t,e,$D(i,e,r));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(t).isDirectory())throw n}catch(s){throw n}}};rV.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var oV=I((_lt,nV)=>{var{dirname:sV}=require("path"),{findMade:hLe,findMadeSync:pLe}=tV(),{mkdirpManual:dLe,mkdirpManualSync:CLe}=eR(),mLe=(t,e)=>(e.recursive=!0,sV(t)===t?e.mkdirAsync(t,e):hLe(e,t).then(i=>e.mkdirAsync(t,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return dLe(t,e);throw n}))),ILe=(t,e)=>{if(e.recursive=!0,sV(t)===t)return e.mkdirSync(t,e);let i=pLe(e,t);try{return e.mkdirSync(t,e),i}catch(n){if(n.code==="ENOENT")return CLe(t,e);throw n}};nV.exports={mkdirpNative:mLe,mkdirpNativeSync:ILe}});var cV=I((Xlt,aV)=>{var AV=require("fs"),ELe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=ELe.replace(/^v/,"").split("."),lV=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,yLe=lV?t=>t.mkdir===AV.mkdir:()=>!1,wLe=lV?t=>t.mkdirSync===AV.mkdirSync:()=>!1;aV.exports={useNative:yLe,useNativeSync:wLe}});var dV=I((Zlt,uV)=>{var Sg=z7(),xg=_7(),{mkdirpNative:gV,mkdirpNativeSync:fV}=oV(),{mkdirpManual:hV,mkdirpManualSync:pV}=eR(),{useNative:BLe,useNativeSync:QLe}=cV(),kg=(t,e)=>(t=xg(t),e=Sg(e),BLe(e)?gV(t,e):hV(t,e)),bLe=(t,e)=>(t=xg(t),e=Sg(e),QLe(e)?fV(t,e):pV(t,e));kg.sync=bLe;kg.native=(t,e)=>gV(xg(t),Sg(e));kg.manual=(t,e)=>hV(xg(t),Sg(e));kg.nativeSync=(t,e)=>fV(xg(t),Sg(e));kg.manualSync=(t,e)=>pV(xg(t),Sg(e));uV.exports=kg});var BV=I(($lt,CV)=>{"use strict";var fs=require("fs"),Qc=require("path"),vLe=fs.lchown?"lchown":"chown",SLe=fs.lchownSync?"lchownSync":"chownSync",mV=fs.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),IV=(t,e,r)=>{try{return fs[SLe](t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},xLe=(t,e,r)=>{try{return fs.chownSync(t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},kLe=mV?(t,e,r,i)=>n=>{!n||n.code!=="EISDIR"?i(n):fs.chown(t,e,r,i)}:(t,e,r,i)=>i,rR=mV?(t,e,r)=>{try{return IV(t,e,r)}catch(i){if(i.code!=="EISDIR")throw i;xLe(t,e,r)}}:(t,e,r)=>IV(t,e,r),PLe=process.version,EV=(t,e,r)=>fs.readdir(t,e,r),DLe=(t,e)=>fs.readdirSync(t,e);/^v4\./.test(PLe)&&(EV=(t,e,r)=>fs.readdir(t,r));var wB=(t,e,r,i)=>{fs[vLe](t,e,r,kLe(t,e,r,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},yV=(t,e,r,i,n)=>{if(typeof e=="string")return fs.lstat(Qc.resolve(t,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,yV(t,o,r,i,n)});if(e.isDirectory())iR(Qc.resolve(t,e.name),r,i,s=>{if(s)return n(s);let o=Qc.resolve(t,e.name);wB(o,r,i,n)});else{let s=Qc.resolve(t,e.name);wB(s,r,i,n)}},iR=(t,e,r,i)=>{EV(t,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return wB(t,e,r,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return wB(t,e,r,i)}};s.forEach(c=>yV(t,c,e,r,l))})},RLe=(t,e,r,i)=>{if(typeof e=="string")try{let n=fs.lstatSync(Qc.resolve(t,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&wV(Qc.resolve(t,e.name),r,i),rR(Qc.resolve(t,e.name),r,i)},wV=(t,e,r)=>{let i;try{i=DLe(t,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(t,e,r);throw n}return i&&i.length&&i.forEach(n=>RLe(t,n,e,r)),rR(t,e,r)};CV.exports=iR;iR.sync=wV});var SV=I((rct,nR)=>{"use strict";var QV=dV(),hs=require("fs"),BB=require("path"),bV=BV(),sR=class extends Error{constructor(e,r){super("Cannot extract through symbolic link");this.path=r,this.symlink=e}get name(){return"SylinkError"}},cd=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'");this.path=e,this.code=r}get name(){return"CwdError"}},ect=nR.exports=(t,e,r)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(m,E)=>{m?r(m):(g.set(t,!0),E&&l?bV(E,o,a,B=>h(B)):s?hs.chmod(t,n,r):r())};if(g&&g.get(t)===!0)return h();if(t===f)return hs.stat(t,(m,E)=>{(m||!E.isDirectory())&&(m=new cd(t,m&&m.code||"ENOTDIR")),h(m)});if(c)return QV(t,{mode:n}).then(m=>h(null,m),h);let d=BB.relative(f,t).split(/\/|\\/);QB(f,d,n,g,u,f,null,h)},QB=(t,e,r,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=t+"/"+l;if(i.get(c))return QB(c,e,r,i,n,s,o,a);hs.mkdir(c,r,vV(c,e,r,i,n,s,o,a))},vV=(t,e,r,i,n,s,o,a)=>l=>{if(l){if(l.path&&BB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new cd(s,l.code));hs.lstat(t,(c,u)=>{if(c)a(c);else if(u.isDirectory())QB(t,e,r,i,n,s,o,a);else if(n)hs.unlink(t,g=>{if(g)return a(g);hs.mkdir(t,r,vV(t,e,r,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(t,t+"/"+e.join("/")));a(l)}})}else o=o||t,QB(t,e,r,i,n,s,o,a)},tct=nR.exports.sync=(t,e)=>{let r=e.umask,i=e.mode|448,n=(i&r)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=m=>{u.set(t,!0),m&&a&&bV.sync(m,s,o),n&&hs.chmodSync(t,i)};if(u&&u.get(t)===!0)return f();if(t===g){let m=!1,E="ENOTDIR";try{m=hs.statSync(t).isDirectory()}catch(B){E=B.code}finally{if(!m)throw new cd(t,E)}f();return}if(l)return f(QV.sync(t,i));let p=BB.relative(g,t).split(/\/|\\/),d=null;for(let m=p.shift(),E=g;m&&(E+="/"+m);m=p.shift())if(!u.get(E))try{hs.mkdirSync(E,i),d=d||E,u.set(E,!0)}catch(B){if(B.path&&BB.dirname(B.path)===g&&(B.code==="ENOTDIR"||B.code==="ENOENT"))return new cd(g,B.code);let b=hs.lstatSync(E);if(b.isDirectory()){u.set(E,!0);continue}else if(c){hs.unlinkSync(E),hs.mkdirSync(E,i),d=d||E,u.set(E,!0);continue}else if(b.isSymbolicLink())return new sR(E,E+"/"+p.join("/"))}return f(d)}});var PV=I((ict,xV)=>{var kV=require("assert");xV.exports=()=>{let t=new Map,e=new Map,{join:r}=require("path"),i=u=>r(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(r(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>t.get(f)),dirs:[...g.dirs].map(f=>t.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let d=t.get(p);kV.equal(d[0],u),d.length===1?t.delete(p):(d.shift(),typeof d[0]=="function"?h.add(d[0]):d[0].forEach(m=>h.add(m)))}),f.forEach(p=>{let d=t.get(p);kV(d[0]instanceof Set),d[0].size===1&&d.length===1?t.delete(p):d[0].size===1?(d.shift(),h.add(d[0])):d[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=t.get(h);p?p.push(g):t.set(h,[g])}),f.forEach(h=>{let p=t.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):t.set(h,[new Set([g])])}),a(g)}}}});var FV=I((nct,DV)=>{var FLe=process.env.__FAKE_PLATFORM__||process.platform,NLe=FLe==="win32",LLe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:TLe,O_TRUNC:MLe,O_WRONLY:OLe,UV_FS_O_FILEMAP:RV=0}=LLe.constants,KLe=NLe&&!!RV,ULe=512*1024,HLe=RV|MLe|TLe|OLe;DV.exports=KLe?t=>t"w"});var hR=I((Act,NV)=>{"use strict";var GLe=require("assert"),sct=require("events").EventEmitter,jLe=ld(),Ut=require("fs"),YLe=bg(),Pa=require("path"),oR=SV(),oct=oR.sync,LV=yD(),qLe=PV(),TV=Symbol("onEntry"),aR=Symbol("checkFs"),MV=Symbol("checkFs2"),AR=Symbol("isReusable"),Da=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),bB=Symbol("link"),OV=Symbol("symlink"),KV=Symbol("hardlink"),UV=Symbol("unsupported"),act=Symbol("unknown"),HV=Symbol("checkPath"),Pg=Symbol("mkdir"),nn=Symbol("onError"),vB=Symbol("pending"),GV=Symbol("pend"),Dg=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),ud=Symbol("doChown"),gd=Symbol("uid"),fd=Symbol("gid"),jV=require("crypto"),YV=FV(),SB=()=>{throw new Error("sync function called cb somehow?!?")},JLe=(t,e)=>{if(process.platform!=="win32")return Ut.unlink(t,e);let r=t+".DELETE."+jV.randomBytes(16).toString("hex");Ut.rename(t,r,i=>{if(i)return e(i);Ut.unlink(r,e)})},WLe=t=>{if(process.platform!=="win32")return Ut.unlinkSync(t);let e=t+".DELETE."+jV.randomBytes(16).toString("hex");Ut.renameSync(t,e),Ut.unlinkSync(e)},qV=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,xB=class extends jLe{constructor(e){if(e||(e={}),e.ondone=r=>{this[uR]=!0,this[gR]()},super(e),this.reservations=qLe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[vB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Pa.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[TV](r))}warn(e,r,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,r,i)}[gR](){this[uR]&&this[vB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[HV](e){if(this.strip){let r=e.path.split(/\/|\\/);if(r.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let r=e.path;if(r.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;if(Pa.win32.isAbsolute(r)){let i=Pa.win32.parse(r);e.path=r.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:r})}}if(this.win32){let r=Pa.win32.parse(e.path);e.path=r.root===""?LV.encode(e.path):r.root+LV.encode(e.path.substr(r.root.length))}return Pa.isAbsolute(e.path)?e.absolute=e.path:e.absolute=Pa.resolve(this.cwd,e.path),!0}[TV](e){if(!this[HV](e))return e.resume();switch(GLe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[UV](e)}}[nn](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[Dg](),r.resume())}[Pg](e,r,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r},i)}[ud](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[gd](e){return qV(this.uid,e.uid,this.processUid)}[fd](e){return qV(this.gid,e.gid,this.processGid)}[lR](e,r){let i=e.mode&4095||this.fmode,n=new YLe.WriteStream(e.absolute,{flags:YV(e.size),mode:i,autoClose:!1});n.on("error",l=>this[nn](l,e));let s=1,o=l=>{if(l)return this[nn](l,e);--s==0&&Ut.close(n.fd,c=>{r(),c?this[nn](c,e):this[Dg]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;Ut.futimes(u,g,f,h=>h?Ut.utimes(c,g,f,p=>o(p&&h)):o())}if(this[ud](e)){s++;let g=this[gd](e),f=this[fd](e);Ut.fchown(u,g,f,h=>h?Ut.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,r){let i=e.mode&4095||this.dmode;this[Pg](e.absolute,i,n=>{if(n)return r(),this[nn](n,e);let s=1,o=a=>{--s==0&&(r(),this[Dg](),e.resume())};e.mtime&&!this.noMtime&&(s++,Ut.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[ud](e)&&(s++,Ut.chown(e.absolute,this[gd](e),this[fd](e),o)),o()})}[UV](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[OV](e,r){this[bB](e,e.linkpath,"symlink",r)}[KV](e,r){this[bB](e,Pa.resolve(this.cwd,e.linkpath),"link",r)}[GV](){this[vB]++}[Dg](){this[vB]--,this[gR]()}[fR](e){this[Dg](),e.resume()}[AR](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&process.platform!=="win32"}[aR](e){this[GV]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,i=>this[MV](e,i))}[MV](e,r){this[Pg](Pa.dirname(e.absolute),this.dmode,i=>{if(i)return r(),this[nn](i,e);Ut.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),r()):n||this[AR](e,s)?this[Da](null,e,r):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[Da](null,e,r):Ut.chmod(e.absolute,e.mode,o=>this[Da](o,e,r)):Ut.rmdir(e.absolute,o=>this[Da](o,e,r)):JLe(e.absolute,o=>this[Da](o,e,r))})})}[Da](e,r,i){if(e)return this[nn](e,r);switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](r,i);case"Link":return this[KV](r,i);case"SymbolicLink":return this[OV](r,i);case"Directory":case"GNUDumpDir":return this[cR](r,i)}}[bB](e,r,i,n){Ut[i](r,e.absolute,s=>{if(s)return this[nn](s,e);n(),this[Dg](),e.resume()})}},JV=class extends xB{constructor(e){super(e)}[aR](e){let r=this[Pg](Pa.dirname(e.absolute),this.dmode,SB);if(r)return this[nn](r,e);try{let i=Ut.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[Da](null,e,SB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&Ut.chmodSync(e.absolute,e.mode):Ut.rmdirSync(e.absolute):WLe(e.absolute),this[Da](null,e,SB)}catch(n){return this[nn](n,e)}}catch(i){return this[Da](null,e,SB)}}[lR](e,r){let i=e.mode&4095||this.fmode,n=l=>{let c;try{Ut.closeSync(o)}catch(u){c=u}(l||c)&&this[nn](l||c,e)},s,o;try{o=Ut.openSync(e.absolute,YV(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.on("data",l=>{try{Ut.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{Ut.futimesSync(o,u,g)}catch(f){try{Ut.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[ud](e)){let u=this[gd](e),g=this[fd](e);try{Ut.fchownSync(o,u,g)}catch(f){try{Ut.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,r){let i=e.mode&4095||this.dmode,n=this[Pg](e.absolute,i);if(n)return this[nn](n,e);if(e.mtime&&!this.noMtime)try{Ut.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[ud](e))try{Ut.chownSync(e.absolute,this[gd](e),this[fd](e))}catch(s){}e.resume()}[Pg](e,r){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(i){return i}}[bB](e,r,i,n){try{Ut[i+"Sync"](r,e.absolute),e.resume()}catch(s){return this[nn](s,e)}}};xB.Sync=JV;NV.exports=xB});var XV=I((cct,WV)=>{"use strict";var zLe=fg(),kB=hR(),zV=require("fs"),VV=bg(),_V=require("path"),lct=WV.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=zLe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&VLe(i,e),i.file&&i.sync?_Le(i):i.file?XLe(i,r):i.sync?ZLe(i):$Le(i)},VLe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||_V.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(_V.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},_Le=t=>{let e=new kB.Sync(t),r=t.file,i=!0,n,s=zV.statSync(r),o=t.maxReadSize||16*1024*1024;new VV.ReadStreamSync(r,{readSize:o,size:s.size}).pipe(e)},XLe=(t,e)=>{let r=new kB(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("close",o),zV.stat(n,(l,c)=>{if(l)a(l);else{let u=new VV.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},ZLe=t=>new kB.Sync(t),$Le=t=>new kB(t)});var ZV=I($r=>{"use strict";$r.c=$r.create=T7();$r.r=$r.replace=XD();$r.t=$r.list=EB();$r.u=$r.update=q7();$r.x=$r.extract=XV();$r.Pack=AB();$r.Unpack=hR();$r.Parse=ld();$r.ReadEntry=id();$r.WriteEntry=xD();$r.Header=Cg();$r.Pax=zw();$r.types=rd()});var e_=I((gct,pR)=>{"use strict";var eTe=Object.prototype.hasOwnProperty,sn="~";function hd(){}Object.create&&(hd.prototype=Object.create(null),new hd().__proto__||(sn=!1));function tTe(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function $V(t,e,r,i,n){if(typeof r!="function")throw new TypeError("The listener must be a function");var s=new tTe(r,i||t,n),o=sn?sn+e:e;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],s]:t._events[o].push(s):(t._events[o]=s,t._eventsCount++),t}function PB(t,e){--t._eventsCount==0?t._events=new hd:delete t._events[e]}function Ti(){this._events=new hd,this._eventsCount=0}Ti.prototype.eventNames=function(){var e=[],r,i;if(this._eventsCount===0)return e;for(i in r=this._events)eTe.call(r,i)&&e.push(sn?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(r)):e};Ti.prototype.listeners=function(e){var r=sn?sn+e:e,i=this._events[r];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,s=i.length,o=new Array(s);n{"use strict";t_.exports=(t,e)=>(e=e||(()=>{}),t.then(r=>new Promise(i=>{i(e())}).then(()=>r),r=>new Promise(i=>{i(e())}).then(()=>{throw r})))});var n_=I((hct,DB)=>{"use strict";var rTe=r_(),dR=class extends Error{constructor(e){super(e);this.name="TimeoutError"}},i_=(t,e,r)=>new Promise((i,n)=>{if(typeof e!="number"||e<0)throw new TypeError("Expected `milliseconds` to be a positive number");if(e===Infinity){i(t);return}let s=setTimeout(()=>{if(typeof r=="function"){try{i(r())}catch(l){n(l)}return}let o=typeof r=="string"?r:`Promise timed out after ${e} milliseconds`,a=r instanceof Error?r:new dR(o);typeof t.cancel=="function"&&t.cancel(),n(a)},e);rTe(t.then(i,n),()=>{clearTimeout(s)})});DB.exports=i_;DB.exports.default=i_;DB.exports.TimeoutError=dR});var s_=I(CR=>{"use strict";Object.defineProperty(CR,"__esModule",{value:!0});function iTe(t,e,r){let i=0,n=t.length;for(;n>0;){let s=n/2|0,o=i+s;r(t[o],e)<=0?(i=++o,n-=s+1):n=s}return i}CR.default=iTe});var a_=I(mR=>{"use strict";Object.defineProperty(mR,"__esModule",{value:!0});var nTe=s_(),o_=class{constructor(){this._queue=[]}enqueue(e,r){r=Object.assign({priority:0},r);let i={priority:r.priority,run:e};if(this.size&&this._queue[this.size-1].priority>=r.priority){this._queue.push(i);return}let n=nTe.default(this._queue,i,(s,o)=>o.priority-s.priority);this._queue.splice(n,0,i)}dequeue(){let e=this._queue.shift();return e==null?void 0:e.run}filter(e){return this._queue.filter(r=>r.priority===e.priority).map(r=>r.run)}get size(){return this._queue.length}};mR.default=o_});var c_=I(IR=>{"use strict";Object.defineProperty(IR,"__esModule",{value:!0});var sTe=e_(),A_=n_(),oTe=a_(),RB=()=>{},aTe=new A_.TimeoutError,l_=class extends sTe{constructor(e){var r,i,n,s;super();if(this._intervalCount=0,this._intervalEnd=0,this._pendingCount=0,this._resolveEmpty=RB,this._resolveIdle=RB,e=Object.assign({carryoverConcurrencyCount:!1,intervalCap:Infinity,interval:0,concurrency:Infinity,autoStart:!0,queueClass:oTe.default},e),!(typeof e.intervalCap=="number"&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(i=(r=e.intervalCap)===null||r===void 0?void 0:r.toString())!==null&&i!==void 0?i:""}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(s=(n=e.interval)===null||n===void 0?void 0:n.toString())!==null&&s!==void 0?s:""}\` (${typeof e.interval})`);this._carryoverConcurrencyCount=e.carryoverConcurrencyCount,this._isIntervalIgnored=e.intervalCap===Infinity||e.interval===0,this._intervalCap=e.intervalCap,this._interval=e.interval,this._queue=new e.queueClass,this._queueClass=e.queueClass,this.concurrency=e.concurrency,this._timeout=e.timeout,this._throwOnTimeout=e.throwOnTimeout===!0,this._isPaused=e.autoStart===!1}get _doesIntervalAllowAnother(){return this._isIntervalIgnored||this._intervalCount{this._onResumeInterval()},r)),!0}return!1}_tryToStartAnother(){if(this._queue.size===0)return this._intervalId&&clearInterval(this._intervalId),this._intervalId=void 0,this._resolvePromises(),!1;if(!this._isPaused){let e=!this._isIntervalPaused();if(this._doesIntervalAllowAnother&&this._doesConcurrentAllowAnother){let r=this._queue.dequeue();return r?(this.emit("active"),r(),e&&this._initializeIntervalIfNeeded(),!0):!1}}return!1}_initializeIntervalIfNeeded(){this._isIntervalIgnored||this._intervalId!==void 0||(this._intervalId=setInterval(()=>{this._onInterval()},this._interval),this._intervalEnd=Date.now()+this._interval)}_onInterval(){this._intervalCount===0&&this._pendingCount===0&&this._intervalId&&(clearInterval(this._intervalId),this._intervalId=void 0),this._intervalCount=this._carryoverConcurrencyCount?this._pendingCount:0,this._processQueue()}_processQueue(){for(;this._tryToStartAnother(););}get concurrency(){return this._concurrency}set concurrency(e){if(!(typeof e=="number"&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this._concurrency=e,this._processQueue()}async add(e,r={}){return new Promise((i,n)=>{let s=async()=>{this._pendingCount++,this._intervalCount++;try{let o=this._timeout===void 0&&r.timeout===void 0?e():A_.default(Promise.resolve(e()),r.timeout===void 0?this._timeout:r.timeout,()=>{(r.throwOnTimeout===void 0?this._throwOnTimeout:r.throwOnTimeout)&&n(aTe)});i(await o)}catch(o){n(o)}this._next()};this._queue.enqueue(s,r),this._tryToStartAnother(),this.emit("add")})}async addAll(e,r){return Promise.all(e.map(async i=>this.add(i,r)))}start(){return this._isPaused?(this._isPaused=!1,this._processQueue(),this):this}pause(){this._isPaused=!0}clear(){this._queue=new this._queueClass}async onEmpty(){if(this._queue.size!==0)return new Promise(e=>{let r=this._resolveEmpty;this._resolveEmpty=()=>{r(),e()}})}async onIdle(){if(!(this._pendingCount===0&&this._queue.size===0))return new Promise(e=>{let r=this._resolveIdle;this._resolveIdle=()=>{r(),e()}})}get size(){return this._queue.size}sizeBy(e){return this._queue.filter(e).length}get pending(){return this._pendingCount}get isPaused(){return this._isPaused}get timeout(){return this._timeout}set timeout(e){this._timeout=e}};IR.default=l_});var p_=I((Ict,h_)=>{var yR;h_.exports.getContent=()=>(typeof yR=="undefined"&&(yR=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),yR)});var y_=I((wR,E_)=>{(function(t,e){typeof wR=="object"?E_.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(wR,function(){function t(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function r(n,s,o,a,l,c,u){var g="",f=0,h,p,d=a.slice(0);if(d.push([s,o])&&a.length>0&&(a.forEach(function(E,B){B>0&&(g+=(E[1]?" ":"\u2502")+" "),!p&&E[0]===s&&(p=!0)}),g+=t(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var m=e(s,c);m.forEach(function(E){h=++f===m.length,r(E,s[E],h,d,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;r(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return r(".",n,!1,[],s,o,function(l){a+=l+` +`}),a},i})});var x_=I((Uct,bR)=>{"use strict";var pTe=t=>{let e=!1,r=!1,i=!1;for(let n=0;n{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(t)?t=t.map(n=>n.trim()).filter(n=>n.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=pTe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),r(t))};bR.exports=S_;bR.exports.default=S_});var Na=I(TR=>{"use strict";Object.defineProperty(TR,"__esModule",{value:!0});TR.default=L_;function L_(){}L_.prototype={diff:function(e,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(d){return n?(setTimeout(function(){n(void 0,d)},0),!0):d}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var a=r.length,l=e.length,c=1,u=a+l,g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],r,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(r),count:r.length}]);function h(){for(var d=-1*c;d<=c;d+=2){var m=void 0,E=g[d-1],B=g[d+1],b=(B?B.newPos:0)-d;E&&(g[d-1]=void 0);var R=E&&E.newPos+1=a&&b+1>=l)return o(yTe(s,m.components,r,e,s.useLongestToken));g[d]=m}c++}if(n)(function d(){setTimeout(function(){if(c>u)return n();h()||d()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,r,i){var n=e[e.length-1];n&&n.added===r&&n.removed===i?e[e.length-1]={count:n.count+1,added:r,removed:i}:e.push({count:1,added:r,removed:i})},extractCommon:function(e,r,i,n){for(var s=r.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?d:h}),c.value=t.join(u)}else c.value=t.join(r.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&t.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function wTe(t){return{newPos:t.newPos,components:t.components.slice(0)}}});var M_=I(Cd=>{"use strict";Object.defineProperty(Cd,"__esModule",{value:!0});Cd.diffChars=BTe;Cd.characterDiff=void 0;var bTe=QTe(Na());function QTe(t){return t&&t.__esModule?t:{default:t}}var T_=new bTe.default;Cd.characterDiff=T_;function BTe(t,e,r){return T_.diff(t,e,r)}});var OR=I(MR=>{"use strict";Object.defineProperty(MR,"__esModule",{value:!0});MR.generateOptions=vTe;function vTe(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}});var U_=I(Ng=>{"use strict";Object.defineProperty(Ng,"__esModule",{value:!0});Ng.diffWords=STe;Ng.diffWordsWithSpace=xTe;Ng.wordDiff=void 0;var PTe=kTe(Na()),DTe=OR();function kTe(t){return t&&t.__esModule?t:{default:t}}var O_=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,K_=/\S/,md=new PTe.default;Ng.wordDiff=md;md.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!K_.test(t)&&!K_.test(e)};md.tokenize=function(t){for(var e=t.split(/(\s+|[()[\]{}'"]|\b)/),r=0;r{"use strict";Object.defineProperty(Lg,"__esModule",{value:!0});Lg.diffLines=RTe;Lg.diffTrimmedLines=FTe;Lg.lineDiff=void 0;var LTe=NTe(Na()),TTe=OR();function NTe(t){return t&&t.__esModule?t:{default:t}}var OB=new LTe.default;Lg.lineDiff=OB;OB.tokenize=function(t){var e=[],r=t.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(var i=0;i{"use strict";Object.defineProperty(Id,"__esModule",{value:!0});Id.diffSentences=MTe;Id.sentenceDiff=void 0;var KTe=OTe(Na());function OTe(t){return t&&t.__esModule?t:{default:t}}var KR=new KTe.default;Id.sentenceDiff=KR;KR.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function MTe(t,e,r){return KR.diff(t,e,r)}});var G_=I(Ed=>{"use strict";Object.defineProperty(Ed,"__esModule",{value:!0});Ed.diffCss=UTe;Ed.cssDiff=void 0;var GTe=HTe(Na());function HTe(t){return t&&t.__esModule?t:{default:t}}var UR=new GTe.default;Ed.cssDiff=UR;UR.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function UTe(t,e,r){return UR.diff(t,e,r)}});var Y_=I(Tg=>{"use strict";Object.defineProperty(Tg,"__esModule",{value:!0});Tg.diffJson=jTe;Tg.canonicalize=UB;Tg.jsonDiff=void 0;var j_=YTe(Na()),qTe=KB();function YTe(t){return t&&t.__esModule?t:{default:t}}function HB(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?HB=function(r){return typeof r}:HB=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},HB(t)}var JTe=Object.prototype.toString,bc=new j_.default;Tg.jsonDiff=bc;bc.useLongestToken=!0;bc.tokenize=qTe.lineDiff.tokenize;bc.castInput=function(t){var e=this.options,r=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o=="undefined"?r:o}:i;return typeof t=="string"?t:JSON.stringify(UB(t,null,null,n),n," ")};bc.equals=function(t,e){return j_.default.prototype.equals.call(bc,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function jTe(t,e,r){return bc.diff(t,e,r)}function UB(t,e,r,i,n){e=e||[],r=r||[],i&&(t=i(n,t));var s;for(s=0;s{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});yd.diffArrays=WTe;yd.arrayDiff=void 0;var VTe=zTe(Na());function zTe(t){return t&&t.__esModule?t:{default:t}}var wd=new VTe.default;yd.arrayDiff=wd;wd.tokenize=function(t){return t.slice()};wd.join=wd.removeEmpty=function(t){return t};function WTe(t,e,r){return wd.diff(t,e,r)}});var GB=I(HR=>{"use strict";Object.defineProperty(HR,"__esModule",{value:!0});HR.parsePatch=_Te;function _Te(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=t.split(/\r\n|[\n\v\f\r\x85]/),i=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],n=[],s=0;function o(){var c={};for(n.push(c);s{"use strict";Object.defineProperty(GR,"__esModule",{value:!0});GR.default=XTe;function XTe(t,e,r){var i=!0,n=!1,s=!1,o=1;return function a(){if(i&&!s){if(n?o++:i=!1,t+o<=r)return o;s=!0}if(!n)return s||(i=!0),e<=t-o?-o++:(n=!0,a())}}});var V_=I(jB=>{"use strict";Object.defineProperty(jB,"__esModule",{value:!0});jB.applyPatch=W_;jB.applyPatches=ZTe;var z_=GB(),eMe=$Te(J_());function $Te(t){return t&&t.__esModule?t:{default:t}}function W_(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof e=="string"&&(e=(0,z_.parsePatch)(e)),Array.isArray(e)){if(e.length>1)throw new Error("applyPatch only works with a single input.");e=e[0]}var i=t.split(/\r\n|[\n\v\f\r\x85]/),n=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],s=e.hunks,o=r.compareLine||function(F,D,he,pe){return D===pe},a=0,l=r.fuzzFactor||0,c=0,u=0,g,f;function h(F,D){for(var he=0;he0?pe[0]:" ",Pe=pe.length>0?pe.substr(1):pe;if(Ne===" "||Ne==="-"){if(!o(D+1,i[D],Ne,Pe)&&(a++,a>l))return!1;D++}}return!0}for(var p=0;p0?ne[0]:" ",A=ne.length>0?ne.substr(1):ne,V=L.linedelimiters[J];if(q===" ")K++;else if(q==="-")i.splice(K,1),n.splice(K,1);else if(q==="+")i.splice(K,0,A),n.splice(K,0,V),K++;else if(q==="\\"){var W=L.lines[J-1]?L.lines[J-1][0]:null;W==="+"?g=!0:W==="-"&&(f=!0)}}}if(g)for(;!i[i.length-1];)i.pop(),n.pop();else f&&(i.push(""),n.push(` +`));for(var X=0;X{"use strict";Object.defineProperty(Bd,"__esModule",{value:!0});Bd.structuredPatch=__;Bd.createTwoFilesPatch=X_;Bd.createPatch=tMe;var rMe=KB();function jR(t){return sMe(t)||nMe(t)||iMe()}function iMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function nMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function sMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0?l(L.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(H=f).push.apply(H,jR(R.map(function(X){return(b.added?"+":"-")+X}))),b.added?p+=R.length:h+=R.length}else{if(u)if(R.length<=o.context*2&&B=a.length-2&&R.length<=o.context){var A=/\n$/.test(r),V=/\n$/.test(i),W=R.length==0&&f.length>q.oldLines;!A&&W&&f.splice(q.oldLines,0,"\\ No newline at end of file"),(!A&&!W||!V)&&f.push("\\ No newline at end of file")}c.push(q),u=0,g=0,f=[]}h+=R.length,p+=R.length}},m=0;m{"use strict";Object.defineProperty(YB,"__esModule",{value:!0});YB.arrayEqual=oMe;YB.arrayStartsWith=Z_;function oMe(t,e){return t.length!==e.length?!1:Z_(t,e)}function Z_(t,e){if(e.length>t.length)return!1;for(var r=0;r{"use strict";Object.defineProperty(qB,"__esModule",{value:!0});qB.calcLineCount=eX;qB.merge=aMe;var AMe=YR(),lMe=GB(),qR=$_();function Mg(t){return gMe(t)||uMe(t)||cMe()}function cMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function uMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function gMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e{"use strict";Object.defineProperty(zR,"__esModule",{value:!0});zR.convertChangesToDMP=dMe;function dMe(t){for(var e=[],r,i,n=0;n{"use strict";Object.defineProperty(VR,"__esModule",{value:!0});VR.convertChangesToXML=CMe;function CMe(t){for(var e=[],r=0;r"):i.removed&&e.push(""),e.push(mMe(i.value)),i.added?e.push(""):i.removed&&e.push("")}return e.join("")}function mMe(t){var e=t;return e=e.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/"/g,"""),e}});var CX=I(br=>{"use strict";Object.defineProperty(br,"__esModule",{value:!0});Object.defineProperty(br,"Diff",{enumerable:!0,get:function(){return IMe.default}});Object.defineProperty(br,"diffChars",{enumerable:!0,get:function(){return EMe.diffChars}});Object.defineProperty(br,"diffWords",{enumerable:!0,get:function(){return fX.diffWords}});Object.defineProperty(br,"diffWordsWithSpace",{enumerable:!0,get:function(){return fX.diffWordsWithSpace}});Object.defineProperty(br,"diffLines",{enumerable:!0,get:function(){return hX.diffLines}});Object.defineProperty(br,"diffTrimmedLines",{enumerable:!0,get:function(){return hX.diffTrimmedLines}});Object.defineProperty(br,"diffSentences",{enumerable:!0,get:function(){return yMe.diffSentences}});Object.defineProperty(br,"diffCss",{enumerable:!0,get:function(){return wMe.diffCss}});Object.defineProperty(br,"diffJson",{enumerable:!0,get:function(){return pX.diffJson}});Object.defineProperty(br,"canonicalize",{enumerable:!0,get:function(){return pX.canonicalize}});Object.defineProperty(br,"diffArrays",{enumerable:!0,get:function(){return BMe.diffArrays}});Object.defineProperty(br,"applyPatch",{enumerable:!0,get:function(){return dX.applyPatch}});Object.defineProperty(br,"applyPatches",{enumerable:!0,get:function(){return dX.applyPatches}});Object.defineProperty(br,"parsePatch",{enumerable:!0,get:function(){return QMe.parsePatch}});Object.defineProperty(br,"merge",{enumerable:!0,get:function(){return bMe.merge}});Object.defineProperty(br,"structuredPatch",{enumerable:!0,get:function(){return _R.structuredPatch}});Object.defineProperty(br,"createTwoFilesPatch",{enumerable:!0,get:function(){return _R.createTwoFilesPatch}});Object.defineProperty(br,"createPatch",{enumerable:!0,get:function(){return _R.createPatch}});Object.defineProperty(br,"convertChangesToDMP",{enumerable:!0,get:function(){return vMe.convertChangesToDMP}});Object.defineProperty(br,"convertChangesToXML",{enumerable:!0,get:function(){return SMe.convertChangesToXML}});var IMe=xMe(Na()),EMe=M_(),fX=U_(),hX=KB(),yMe=H_(),wMe=G_(),pX=Y_(),BMe=q_(),dX=V_(),QMe=GB(),bMe=cX(),_R=YR(),vMe=uX(),SMe=gX();function xMe(t){return t&&t.__esModule?t:{default:t}}});var WB=I((agt,mX)=>{var kMe=As(),PMe=Nw(),DMe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,RMe=/^\w*$/;function FMe(t,e){if(kMe(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||PMe(t)?!0:RMe.test(t)||!DMe.test(t)||e!=null&&t in Object(e)}mX.exports=FMe});var Gs=I((Agt,IX)=>{function NMe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}IX.exports=NMe});var zB=I((lgt,EX)=>{var LMe=Ac(),TMe=Gs(),MMe="[object AsyncFunction]",OMe="[object Function]",KMe="[object GeneratorFunction]",UMe="[object Proxy]";function HMe(t){if(!TMe(t))return!1;var e=LMe(t);return e==OMe||e==KMe||e==MMe||e==UMe}EX.exports=HMe});var wX=I((cgt,yX)=>{var GMe=Ks(),jMe=GMe["__core-js_shared__"];yX.exports=jMe});var bX=I((ugt,BX)=>{var XR=wX(),QX=function(){var t=/[^.]+$/.exec(XR&&XR.keys&&XR.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function YMe(t){return!!QX&&QX in t}BX.exports=YMe});var ZR=I((ggt,vX)=>{var qMe=Function.prototype,JMe=qMe.toString;function WMe(t){if(t!=null){try{return JMe.call(t)}catch(e){}try{return t+""}catch(e){}}return""}vX.exports=WMe});var xX=I((fgt,SX)=>{var zMe=zB(),VMe=bX(),_Me=Gs(),XMe=ZR(),ZMe=/[\\^$.*+?()[\]{}|]/g,$Me=/^\[object .+?Constructor\]$/,eOe=Function.prototype,tOe=Object.prototype,rOe=eOe.toString,iOe=tOe.hasOwnProperty,nOe=RegExp("^"+rOe.call(iOe).replace(ZMe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function sOe(t){if(!_Me(t)||VMe(t))return!1;var e=zMe(t)?nOe:$Me;return e.test(XMe(t))}SX.exports=sOe});var PX=I((hgt,kX)=>{function oOe(t,e){return t==null?void 0:t[e]}kX.exports=oOe});var UA=I((pgt,DX)=>{var aOe=xX(),AOe=PX();function lOe(t,e){var r=AOe(t,e);return aOe(r)?r:void 0}DX.exports=lOe});var Qd=I((dgt,RX)=>{var cOe=UA(),uOe=cOe(Object,"create");RX.exports=uOe});var LX=I((Cgt,FX)=>{var NX=Qd();function gOe(){this.__data__=NX?NX(null):{},this.size=0}FX.exports=gOe});var MX=I((mgt,TX)=>{function fOe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}TX.exports=fOe});var KX=I((Igt,OX)=>{var hOe=Qd(),pOe="__lodash_hash_undefined__",dOe=Object.prototype,COe=dOe.hasOwnProperty;function mOe(t){var e=this.__data__;if(hOe){var r=e[t];return r===pOe?void 0:r}return COe.call(e,t)?e[t]:void 0}OX.exports=mOe});var HX=I((Egt,UX)=>{var IOe=Qd(),EOe=Object.prototype,yOe=EOe.hasOwnProperty;function wOe(t){var e=this.__data__;return IOe?e[t]!==void 0:yOe.call(e,t)}UX.exports=wOe});var jX=I((ygt,GX)=>{var BOe=Qd(),QOe="__lodash_hash_undefined__";function bOe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=BOe&&e===void 0?QOe:e,this}GX.exports=bOe});var qX=I((wgt,YX)=>{var vOe=LX(),SOe=MX(),xOe=KX(),kOe=HX(),POe=jX();function Og(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{function DOe(){this.__data__=[],this.size=0}JX.exports=DOe});var Kg=I((Qgt,zX)=>{function ROe(t,e){return t===e||t!==t&&e!==e}zX.exports=ROe});var bd=I((bgt,VX)=>{var FOe=Kg();function NOe(t,e){for(var r=t.length;r--;)if(FOe(t[r][0],e))return r;return-1}VX.exports=NOe});var XX=I((vgt,_X)=>{var LOe=bd(),TOe=Array.prototype,MOe=TOe.splice;function OOe(t){var e=this.__data__,r=LOe(e,t);if(r<0)return!1;var i=e.length-1;return r==i?e.pop():MOe.call(e,r,1),--this.size,!0}_X.exports=OOe});var $X=I((Sgt,ZX)=>{var KOe=bd();function UOe(t){var e=this.__data__,r=KOe(e,t);return r<0?void 0:e[r][1]}ZX.exports=UOe});var tZ=I((xgt,eZ)=>{var HOe=bd();function GOe(t){return HOe(this.__data__,t)>-1}eZ.exports=GOe});var iZ=I((kgt,rZ)=>{var jOe=bd();function YOe(t,e){var r=this.__data__,i=jOe(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}rZ.exports=YOe});var vd=I((Pgt,nZ)=>{var qOe=WX(),JOe=XX(),WOe=$X(),zOe=tZ(),VOe=iZ();function Ug(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var _Oe=UA(),XOe=Ks(),ZOe=_Oe(XOe,"Map");sZ.exports=ZOe});var AZ=I((Rgt,oZ)=>{var aZ=qX(),$Oe=vd(),eKe=VB();function tKe(){this.size=0,this.__data__={hash:new aZ,map:new(eKe||$Oe),string:new aZ}}oZ.exports=tKe});var cZ=I((Fgt,lZ)=>{function rKe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}lZ.exports=rKe});var Sd=I((Ngt,uZ)=>{var iKe=cZ();function nKe(t,e){var r=t.__data__;return iKe(e)?r[typeof e=="string"?"string":"hash"]:r.map}uZ.exports=nKe});var fZ=I((Lgt,gZ)=>{var sKe=Sd();function oKe(t){var e=sKe(this,t).delete(t);return this.size-=e?1:0,e}gZ.exports=oKe});var pZ=I((Tgt,hZ)=>{var aKe=Sd();function AKe(t){return aKe(this,t).get(t)}hZ.exports=AKe});var CZ=I((Mgt,dZ)=>{var lKe=Sd();function cKe(t){return lKe(this,t).has(t)}dZ.exports=cKe});var IZ=I((Ogt,mZ)=>{var uKe=Sd();function gKe(t,e){var r=uKe(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}mZ.exports=gKe});var _B=I((Kgt,EZ)=>{var fKe=AZ(),hKe=fZ(),pKe=pZ(),dKe=CZ(),CKe=IZ();function Hg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var wZ=_B(),mKe="Expected a function";function $R(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(mKe);var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=r.cache;if(s.has(n))return s.get(n);var o=t.apply(this,i);return r.cache=s.set(n,o)||s,o};return r.cache=new($R.Cache||wZ),r}$R.Cache=wZ;yZ.exports=$R});var bZ=I((Hgt,QZ)=>{var IKe=BZ(),EKe=500;function yKe(t){var e=IKe(t,function(i){return r.size===EKe&&r.clear(),i}),r=e.cache;return e}QZ.exports=yKe});var SZ=I((Ggt,vZ)=>{var wKe=bZ(),BKe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,QKe=/\\(\\)?/g,bKe=wKe(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(BKe,function(r,i,n,s){e.push(n?s.replace(QKe,"$1"):i||r)}),e});vZ.exports=bKe});var Gg=I((jgt,xZ)=>{var vKe=As(),SKe=WB(),xKe=SZ(),kKe=gg();function PKe(t,e){return vKe(t)?t:SKe(t,e)?[t]:xKe(kKe(t))}xZ.exports=PKe});var Sc=I((Ygt,kZ)=>{var DKe=Nw(),RKe=1/0;function FKe(t){if(typeof t=="string"||DKe(t))return t;var e=t+"";return e=="0"&&1/t==-RKe?"-0":e}kZ.exports=FKe});var xd=I((qgt,PZ)=>{var NKe=Gg(),LKe=Sc();function TKe(t,e){e=NKe(e,t);for(var r=0,i=e.length;t!=null&&r{var MKe=UA(),OKe=function(){try{var t=MKe(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();DZ.exports=OKe});var jg=I((Wgt,RZ)=>{var FZ=eF();function KKe(t,e,r){e=="__proto__"&&FZ?FZ(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}RZ.exports=KKe});var XB=I((zgt,NZ)=>{var UKe=jg(),HKe=Kg(),GKe=Object.prototype,jKe=GKe.hasOwnProperty;function YKe(t,e,r){var i=t[e];(!(jKe.call(t,e)&&HKe(i,r))||r===void 0&&!(e in t))&&UKe(t,e,r)}NZ.exports=YKe});var kd=I((Vgt,LZ)=>{var qKe=9007199254740991,JKe=/^(?:0|[1-9]\d*)$/;function WKe(t,e){var r=typeof t;return e=e==null?qKe:e,!!e&&(r=="number"||r!="symbol"&&JKe.test(t))&&t>-1&&t%1==0&&t{var zKe=XB(),VKe=Gg(),_Ke=kd(),MZ=Gs(),XKe=Sc();function ZKe(t,e,r,i){if(!MZ(t))return t;e=VKe(e,t);for(var n=-1,s=e.length,o=s-1,a=t;a!=null&&++n{var $Ke=xd(),e1e=tF(),t1e=Gg();function r1e(t,e,r){for(var i=-1,n=e.length,s={};++i{function i1e(t,e){return t!=null&&e in Object(t)}UZ.exports=i1e});var jZ=I(($gt,GZ)=>{var n1e=Ac(),s1e=Qo(),o1e="[object Arguments]";function a1e(t){return s1e(t)&&n1e(t)==o1e}GZ.exports=a1e});var Pd=I((eft,YZ)=>{var qZ=jZ(),A1e=Qo(),JZ=Object.prototype,l1e=JZ.hasOwnProperty,c1e=JZ.propertyIsEnumerable,u1e=qZ(function(){return arguments}())?qZ:function(t){return A1e(t)&&l1e.call(t,"callee")&&!c1e.call(t,"callee")};YZ.exports=u1e});var ZB=I((tft,WZ)=>{var g1e=9007199254740991;function f1e(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=g1e}WZ.exports=f1e});var rF=I((rft,zZ)=>{var h1e=Gg(),p1e=Pd(),d1e=As(),C1e=kd(),m1e=ZB(),I1e=Sc();function E1e(t,e,r){e=h1e(e,t);for(var i=-1,n=e.length,s=!1;++i{var y1e=HZ(),w1e=rF();function B1e(t,e){return t!=null&&w1e(t,e,y1e)}VZ.exports=B1e});var XZ=I((nft,_Z)=>{var Q1e=KZ(),b1e=iF();function v1e(t,e){return Q1e(t,e,function(r,i){return b1e(t,i)})}_Z.exports=v1e});var $B=I((sft,ZZ)=>{function S1e(t,e){for(var r=-1,i=e.length,n=t.length;++r{var e$=ac(),x1e=Pd(),k1e=As(),t$=e$?e$.isConcatSpreadable:void 0;function P1e(t){return k1e(t)||x1e(t)||!!(t$&&t&&t[t$])}$Z.exports=P1e});var s$=I((aft,i$)=>{var D1e=$B(),R1e=r$();function n$(t,e,r,i,n){var s=-1,o=t.length;for(r||(r=R1e),n||(n=[]);++s0&&r(a)?e>1?n$(a,e-1,r,i,n):D1e(n,a):i||(n[n.length]=a)}return n}i$.exports=n$});var a$=I((Aft,o$)=>{var F1e=s$();function N1e(t){var e=t==null?0:t.length;return e?F1e(t,1):[]}o$.exports=N1e});var l$=I((lft,A$)=>{function L1e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}A$.exports=L1e});var nF=I((cft,c$)=>{var T1e=l$(),u$=Math.max;function M1e(t,e,r){return e=u$(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,s=u$(i.length-e,0),o=Array(s);++n{function O1e(t){return function(){return t}}g$.exports=O1e});var e0=I((gft,h$)=>{function K1e(t){return t}h$.exports=K1e});var C$=I((fft,p$)=>{var U1e=f$(),d$=eF(),H1e=e0(),G1e=d$?function(t,e){return d$(t,"toString",{configurable:!0,enumerable:!1,value:U1e(e),writable:!0})}:H1e;p$.exports=G1e});var I$=I((hft,m$)=>{var j1e=800,Y1e=16,q1e=Date.now;function J1e(t){var e=0,r=0;return function(){var i=q1e(),n=Y1e-(i-r);if(r=i,n>0){if(++e>=j1e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}m$.exports=J1e});var sF=I((pft,E$)=>{var W1e=C$(),z1e=I$(),V1e=z1e(W1e);E$.exports=V1e});var w$=I((dft,y$)=>{var _1e=a$(),X1e=nF(),Z1e=sF();function $1e(t){return Z1e(X1e(t,void 0,_1e),t+"")}y$.exports=$1e});var Q$=I((Cft,B$)=>{var eUe=XZ(),tUe=w$(),rUe=tUe(function(t,e){return t==null?{}:eUe(t,e)});B$.exports=rUe});var M$=I((lpt,N$)=>{"use strict";var pF;try{pF=Map}catch(t){}var dF;try{dF=Set}catch(t){}function L$(t,e,r){if(!t||typeof t!="object"||typeof t=="function")return t;if(t.nodeType&&"cloneNode"in t)return t.cloneNode(!0);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t);if(Array.isArray(t))return t.map(T$);if(pF&&t instanceof pF)return new Map(Array.from(t.entries()));if(dF&&t instanceof dF)return new Set(Array.from(t.values()));if(t instanceof Object){e.push(t);var i=Object.create(t);r.push(i);for(var n in t){var s=e.findIndex(function(o){return o===t[n]});i[n]=s>-1?r[s]:L$(t[n],e,r)}return i}return t}function T$(t){return L$(t,[],[])}N$.exports=T$});var Nd=I(CF=>{"use strict";Object.defineProperty(CF,"__esModule",{value:!0});CF.default=uUe;var gUe=Object.prototype.toString,fUe=Error.prototype.toString,hUe=RegExp.prototype.toString,pUe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",dUe=/^Symbol\((.*)\)(.*)$/;function CUe(t){return t!=+t?"NaN":t===0&&1/t<0?"-0":""+t}function O$(t,e=!1){if(t==null||t===!0||t===!1)return""+t;let r=typeof t;if(r==="number")return CUe(t);if(r==="string")return e?`"${t}"`:t;if(r==="function")return"[Function "+(t.name||"anonymous")+"]";if(r==="symbol")return pUe.call(t).replace(dUe,"Symbol($1)");let i=gUe.call(t).slice(8,-1);return i==="Date"?isNaN(t.getTime())?""+t:t.toISOString(t):i==="Error"||t instanceof Error?"["+fUe.call(t)+"]":i==="RegExp"?hUe.call(t):null}function uUe(t,e){let r=O$(t,e);return r!==null?r:JSON.stringify(t,function(i,n){let s=O$(this[i],e);return s!==null?s:n},2)}});var La=I(ci=>{"use strict";Object.defineProperty(ci,"__esModule",{value:!0});ci.default=ci.array=ci.object=ci.boolean=ci.date=ci.number=ci.string=ci.mixed=void 0;var K$=mUe(Nd());function mUe(t){return t&&t.__esModule?t:{default:t}}var U$={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:t,type:e,value:r,originalValue:i})=>{let n=i!=null&&i!==r,s=`${t} must be a \`${e}\` type, but the final value was: \`${(0,K$.default)(r,!0)}\``+(n?` (cast from the value \`${(0,K$.default)(i,!0)}\`).`:".");return r===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};ci.mixed=U$;var H$={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};ci.string=H$;var G$={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};ci.number=G$;var j$={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};ci.date=j$;var Y$={isValue:"${path} field must be ${value}"};ci.boolean=Y$;var q$={noUnknown:"${path} field has unspecified keys: ${unknown}"};ci.object=q$;var J$={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};ci.array=J$;var IUe=Object.assign(Object.create(null),{mixed:U$,string:H$,number:G$,date:j$,object:q$,array:J$,boolean:Y$});ci.default=IUe});var z$=I((gpt,W$)=>{var EUe=Object.prototype,yUe=EUe.hasOwnProperty;function wUe(t,e){return t!=null&&yUe.call(t,e)}W$.exports=wUe});var Ld=I((fpt,V$)=>{var BUe=z$(),QUe=rF();function bUe(t,e){return t!=null&&QUe(t,e,BUe)}V$.exports=bUe});var qg=I(n0=>{"use strict";Object.defineProperty(n0,"__esModule",{value:!0});n0.default=void 0;var vUe=t=>t&&t.__isYupSchema__;n0.default=vUe});var Z$=I(s0=>{"use strict";Object.defineProperty(s0,"__esModule",{value:!0});s0.default=void 0;var SUe=_$(Ld()),xUe=_$(qg());function _$(t){return t&&t.__esModule?t:{default:t}}var X$=class{constructor(e,r){if(this.refs=e,this.refs=e,typeof r=="function"){this.fn=r;return}if(!(0,SUe.default)(r,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!r.then&&!r.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=r,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,r){let i=this.refs.map(s=>s.getValue(r==null?void 0:r.value,r==null?void 0:r.parent,r==null?void 0:r.context)),n=this.fn.apply(e,i.concat(e,r));if(n===void 0||n===e)return e;if(!(0,xUe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(r)}},kUe=X$;s0.default=kUe});var IF=I(mF=>{"use strict";Object.defineProperty(mF,"__esModule",{value:!0});mF.default=PUe;function PUe(t){return t==null?[]:[].concat(t)}});var xc=I(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var DUe=$$(Nd()),RUe=$$(IF());function $$(t){return t&&t.__esModule?t:{default:t}}function EF(){return EF=Object.assign||function(t){for(var e=1;e(0,DUe.default)(r[s])):typeof e=="function"?e(r):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,r,i,n){super();this.name="ValidationError",this.value=r,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,RUe.default)(e).forEach(s=>{Td.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Td)}};o0.default=Td});var a0=I(yF=>{"use strict";Object.defineProperty(yF,"__esModule",{value:!0});yF.default=NUe;var wF=LUe(xc());function LUe(t){return t&&t.__esModule?t:{default:t}}var TUe=t=>{let e=!1;return(...r)=>{e||(e=!0,t(...r))}};function NUe(t,e){let{endEarly:r,tests:i,args:n,value:s,errors:o,sort:a,path:l}=t,c=TUe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new wF.default(o,s,l)):c(null,s);for(let f=0;f{function MUe(t){return function(e,r,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[t?a:++n];if(r(s[l],l,s)===!1)break}return e}}eee.exports=MUe});var BF=I((Ept,ree)=>{var OUe=tee(),KUe=OUe();ree.exports=KUe});var nee=I((ypt,iee)=>{function UUe(t,e){for(var r=-1,i=Array(t);++r{function HUe(){return!1}see.exports=HUe});var Od=I((Md,Jg)=>{var GUe=Ks(),jUe=oee(),aee=typeof Md=="object"&&Md&&!Md.nodeType&&Md,Aee=aee&&typeof Jg=="object"&&Jg&&!Jg.nodeType&&Jg,YUe=Aee&&Aee.exports===aee,lee=YUe?GUe.Buffer:void 0,qUe=lee?lee.isBuffer:void 0,JUe=qUe||jUe;Jg.exports=JUe});var uee=I((Bpt,cee)=>{var WUe=Ac(),zUe=ZB(),VUe=Qo(),_Ue="[object Arguments]",XUe="[object Array]",ZUe="[object Boolean]",$Ue="[object Date]",e2e="[object Error]",t2e="[object Function]",r2e="[object Map]",i2e="[object Number]",n2e="[object Object]",s2e="[object RegExp]",o2e="[object Set]",a2e="[object String]",A2e="[object WeakMap]",l2e="[object ArrayBuffer]",c2e="[object DataView]",u2e="[object Float32Array]",g2e="[object Float64Array]",f2e="[object Int8Array]",h2e="[object Int16Array]",p2e="[object Int32Array]",d2e="[object Uint8Array]",C2e="[object Uint8ClampedArray]",m2e="[object Uint16Array]",I2e="[object Uint32Array]",lr={};lr[u2e]=lr[g2e]=lr[f2e]=lr[h2e]=lr[p2e]=lr[d2e]=lr[C2e]=lr[m2e]=lr[I2e]=!0;lr[_Ue]=lr[XUe]=lr[l2e]=lr[ZUe]=lr[c2e]=lr[$Ue]=lr[e2e]=lr[t2e]=lr[r2e]=lr[i2e]=lr[n2e]=lr[s2e]=lr[o2e]=lr[a2e]=lr[A2e]=!1;function E2e(t){return VUe(t)&&zUe(t.length)&&!!lr[WUe(t)]}cee.exports=E2e});var A0=I((Qpt,gee)=>{function y2e(t){return function(e){return t(e)}}gee.exports=y2e});var l0=I((Kd,Wg)=>{var w2e=WP(),fee=typeof Kd=="object"&&Kd&&!Kd.nodeType&&Kd,Ud=fee&&typeof Wg=="object"&&Wg&&!Wg.nodeType&&Wg,B2e=Ud&&Ud.exports===fee,QF=B2e&&w2e.process,Q2e=function(){try{var t=Ud&&Ud.require&&Ud.require("util").types;return t||QF&&QF.binding&&QF.binding("util")}catch(e){}}();Wg.exports=Q2e});var c0=I((bpt,hee)=>{var b2e=uee(),v2e=A0(),pee=l0(),dee=pee&&pee.isTypedArray,S2e=dee?v2e(dee):b2e;hee.exports=S2e});var bF=I((vpt,Cee)=>{var x2e=nee(),k2e=Pd(),P2e=As(),D2e=Od(),R2e=kd(),F2e=c0(),N2e=Object.prototype,L2e=N2e.hasOwnProperty;function T2e(t,e){var r=P2e(t),i=!r&&k2e(t),n=!r&&!i&&D2e(t),s=!r&&!i&&!n&&F2e(t),o=r||i||n||s,a=o?x2e(t.length,String):[],l=a.length;for(var c in t)(e||L2e.call(t,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||R2e(c,l)))&&a.push(c);return a}Cee.exports=T2e});var u0=I((Spt,mee)=>{var M2e=Object.prototype;function O2e(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||M2e;return t===r}mee.exports=O2e});var vF=I((xpt,Iee)=>{function K2e(t,e){return function(r){return t(e(r))}}Iee.exports=K2e});var yee=I((kpt,Eee)=>{var U2e=vF(),H2e=U2e(Object.keys,Object);Eee.exports=H2e});var Bee=I((Ppt,wee)=>{var G2e=u0(),j2e=yee(),Y2e=Object.prototype,q2e=Y2e.hasOwnProperty;function J2e(t){if(!G2e(t))return j2e(t);var e=[];for(var r in Object(t))q2e.call(t,r)&&r!="constructor"&&e.push(r);return e}wee.exports=J2e});var Hd=I((Dpt,Qee)=>{var W2e=zB(),z2e=ZB();function V2e(t){return t!=null&&z2e(t.length)&&!W2e(t)}Qee.exports=V2e});var zg=I((Rpt,bee)=>{var _2e=bF(),X2e=Bee(),Z2e=Hd();function $2e(t){return Z2e(t)?_2e(t):X2e(t)}bee.exports=$2e});var SF=I((Fpt,vee)=>{var eHe=BF(),tHe=zg();function rHe(t,e){return t&&eHe(t,e,tHe)}vee.exports=rHe});var xee=I((Npt,See)=>{var iHe=vd();function nHe(){this.__data__=new iHe,this.size=0}See.exports=nHe});var Pee=I((Lpt,kee)=>{function sHe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}kee.exports=sHe});var Ree=I((Tpt,Dee)=>{function oHe(t){return this.__data__.get(t)}Dee.exports=oHe});var Nee=I((Mpt,Fee)=>{function aHe(t){return this.__data__.has(t)}Fee.exports=aHe});var Tee=I((Opt,Lee)=>{var AHe=vd(),lHe=VB(),cHe=_B(),uHe=200;function gHe(t,e){var r=this.__data__;if(r instanceof AHe){var i=r.__data__;if(!lHe||i.length{var fHe=vd(),hHe=xee(),pHe=Pee(),dHe=Ree(),CHe=Nee(),mHe=Tee();function Vg(t){var e=this.__data__=new fHe(t);this.size=e.size}Vg.prototype.clear=hHe;Vg.prototype.delete=pHe;Vg.prototype.get=dHe;Vg.prototype.has=CHe;Vg.prototype.set=mHe;Mee.exports=Vg});var Kee=I((Upt,Oee)=>{var IHe="__lodash_hash_undefined__";function EHe(t){return this.__data__.set(t,IHe),this}Oee.exports=EHe});var Hee=I((Hpt,Uee)=>{function yHe(t){return this.__data__.has(t)}Uee.exports=yHe});var jee=I((Gpt,Gee)=>{var wHe=_B(),BHe=Kee(),QHe=Hee();function g0(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new wHe;++e{function bHe(t,e){for(var r=-1,i=t==null?0:t.length;++r{function vHe(t,e){return t.has(e)}Jee.exports=vHe});var xF=I((qpt,zee)=>{var SHe=jee(),xHe=qee(),kHe=Wee(),PHe=1,DHe=2;function RHe(t,e,r,i,n,s){var o=r&PHe,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(t),u=s.get(e);if(c&&u)return c==e&&u==t;var g=-1,f=!0,h=r&DHe?new SHe:void 0;for(s.set(t,e),s.set(e,t);++g{var FHe=Ks(),NHe=FHe.Uint8Array;Vee.exports=NHe});var Xee=I((Wpt,_ee)=>{function LHe(t){var e=-1,r=Array(t.size);return t.forEach(function(i,n){r[++e]=[n,i]}),r}_ee.exports=LHe});var $ee=I((zpt,Zee)=>{function THe(t){var e=-1,r=Array(t.size);return t.forEach(function(i){r[++e]=i}),r}Zee.exports=THe});var nte=I((Vpt,ete)=>{var tte=ac(),rte=kF(),MHe=Kg(),OHe=xF(),KHe=Xee(),UHe=$ee(),HHe=1,GHe=2,jHe="[object Boolean]",YHe="[object Date]",qHe="[object Error]",JHe="[object Map]",WHe="[object Number]",zHe="[object RegExp]",VHe="[object Set]",_He="[object String]",XHe="[object Symbol]",ZHe="[object ArrayBuffer]",$He="[object DataView]",ite=tte?tte.prototype:void 0,PF=ite?ite.valueOf:void 0;function eGe(t,e,r,i,n,s,o){switch(r){case $He:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ZHe:return!(t.byteLength!=e.byteLength||!s(new rte(t),new rte(e)));case jHe:case YHe:case WHe:return MHe(+t,+e);case qHe:return t.name==e.name&&t.message==e.message;case zHe:case _He:return t==e+"";case JHe:var a=KHe;case VHe:var l=i&HHe;if(a||(a=UHe),t.size!=e.size&&!l)return!1;var c=o.get(t);if(c)return c==e;i|=GHe,o.set(t,e);var u=OHe(a(t),a(e),i,n,s,o);return o.delete(t),u;case XHe:if(PF)return PF.call(t)==PF.call(e)}return!1}ete.exports=eGe});var DF=I((_pt,ste)=>{var tGe=$B(),rGe=As();function iGe(t,e,r){var i=e(t);return rGe(t)?i:tGe(i,r(t))}ste.exports=iGe});var ate=I((Xpt,ote)=>{function nGe(t,e){for(var r=-1,i=t==null?0:t.length,n=0,s=[];++r{function sGe(){return[]}Ate.exports=sGe});var f0=I(($pt,lte)=>{var oGe=ate(),aGe=RF(),AGe=Object.prototype,lGe=AGe.propertyIsEnumerable,cte=Object.getOwnPropertySymbols,cGe=cte?function(t){return t==null?[]:(t=Object(t),oGe(cte(t),function(e){return lGe.call(t,e)}))}:aGe;lte.exports=cGe});var FF=I((edt,ute)=>{var uGe=DF(),gGe=f0(),fGe=zg();function hGe(t){return uGe(t,fGe,gGe)}ute.exports=hGe});var hte=I((tdt,gte)=>{var fte=FF(),pGe=1,dGe=Object.prototype,CGe=dGe.hasOwnProperty;function mGe(t,e,r,i,n,s){var o=r&pGe,a=fte(t),l=a.length,c=fte(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:CGe.call(e,f)))return!1}var h=s.get(t),p=s.get(e);if(h&&p)return h==e&&p==t;var d=!0;s.set(t,e),s.set(e,t);for(var m=o;++g{var IGe=UA(),EGe=Ks(),yGe=IGe(EGe,"DataView");pte.exports=yGe});var mte=I((idt,Cte)=>{var wGe=UA(),BGe=Ks(),QGe=wGe(BGe,"Promise");Cte.exports=QGe});var Ete=I((ndt,Ite)=>{var bGe=UA(),vGe=Ks(),SGe=bGe(vGe,"Set");Ite.exports=SGe});var wte=I((sdt,yte)=>{var xGe=UA(),kGe=Ks(),PGe=xGe(kGe,"WeakMap");yte.exports=PGe});var jd=I((odt,Bte)=>{var NF=dte(),LF=VB(),TF=mte(),MF=Ete(),OF=wte(),Qte=Ac(),_g=ZR(),bte="[object Map]",DGe="[object Object]",vte="[object Promise]",Ste="[object Set]",xte="[object WeakMap]",kte="[object DataView]",RGe=_g(NF),FGe=_g(LF),NGe=_g(TF),LGe=_g(MF),TGe=_g(OF),kc=Qte;(NF&&kc(new NF(new ArrayBuffer(1)))!=kte||LF&&kc(new LF)!=bte||TF&&kc(TF.resolve())!=vte||MF&&kc(new MF)!=Ste||OF&&kc(new OF)!=xte)&&(kc=function(t){var e=Qte(t),r=e==DGe?t.constructor:void 0,i=r?_g(r):"";if(i)switch(i){case RGe:return kte;case FGe:return bte;case NGe:return vte;case LGe:return Ste;case TGe:return xte}return e});Bte.exports=kc});var Mte=I((adt,Pte)=>{var KF=Gd(),MGe=xF(),OGe=nte(),KGe=hte(),Dte=jd(),Rte=As(),Fte=Od(),UGe=c0(),HGe=1,Nte="[object Arguments]",Lte="[object Array]",h0="[object Object]",GGe=Object.prototype,Tte=GGe.hasOwnProperty;function jGe(t,e,r,i,n,s){var o=Rte(t),a=Rte(e),l=o?Lte:Dte(t),c=a?Lte:Dte(e);l=l==Nte?h0:l,c=c==Nte?h0:c;var u=l==h0,g=c==h0,f=l==c;if(f&&Fte(t)){if(!Fte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new KF),o||UGe(t)?MGe(t,e,r,i,n,s):OGe(t,e,l,r,i,n,s);if(!(r&HGe)){var h=u&&Tte.call(t,"__wrapped__"),p=g&&Tte.call(e,"__wrapped__");if(h||p){var d=h?t.value():t,m=p?e.value():e;return s||(s=new KF),n(d,m,r,i,s)}}return f?(s||(s=new KF),KGe(t,e,r,i,n,s)):!1}Pte.exports=jGe});var UF=I((Adt,Ote)=>{var YGe=Mte(),Kte=Qo();function Ute(t,e,r,i,n){return t===e?!0:t==null||e==null||!Kte(t)&&!Kte(e)?t!==t&&e!==e:YGe(t,e,r,i,Ute,n)}Ote.exports=Ute});var Gte=I((ldt,Hte)=>{var qGe=Gd(),JGe=UF(),WGe=1,zGe=2;function VGe(t,e,r,i){var n=r.length,s=n,o=!i;if(t==null)return!s;for(t=Object(t);n--;){var a=r[n];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++n{var _Ge=Gs();function XGe(t){return t===t&&!_Ge(t)}jte.exports=XGe});var qte=I((udt,Yte)=>{var ZGe=HF(),$Ge=zg();function eje(t){for(var e=$Ge(t),r=e.length;r--;){var i=e[r],n=t[i];e[r]=[i,n,ZGe(n)]}return e}Yte.exports=eje});var GF=I((gdt,Jte)=>{function tje(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}Jte.exports=tje});var zte=I((fdt,Wte)=>{var rje=Gte(),ije=qte(),nje=GF();function sje(t){var e=ije(t);return e.length==1&&e[0][2]?nje(e[0][0],e[0][1]):function(r){return r===t||rje(r,t,e)}}Wte.exports=sje});var p0=I((hdt,Vte)=>{var oje=xd();function aje(t,e,r){var i=t==null?void 0:oje(t,e);return i===void 0?r:i}Vte.exports=aje});var Xte=I((pdt,_te)=>{var Aje=UF(),lje=p0(),cje=iF(),uje=WB(),gje=HF(),fje=GF(),hje=Sc(),pje=1,dje=2;function Cje(t,e){return uje(t)&&gje(e)?fje(hje(t),e):function(r){var i=lje(r,t);return i===void 0&&i===e?cje(r,t):Aje(e,i,pje|dje)}}_te.exports=Cje});var $te=I((ddt,Zte)=>{function mje(t){return function(e){return e==null?void 0:e[t]}}Zte.exports=mje});var tre=I((Cdt,ere)=>{var Ije=xd();function Eje(t){return function(e){return Ije(e,t)}}ere.exports=Eje});var ire=I((mdt,rre)=>{var yje=$te(),wje=tre(),Bje=WB(),Qje=Sc();function bje(t){return Bje(t)?yje(Qje(t)):wje(t)}rre.exports=bje});var jF=I((Idt,nre)=>{var vje=zte(),Sje=Xte(),xje=e0(),kje=As(),Pje=ire();function Dje(t){return typeof t=="function"?t:t==null?xje:typeof t=="object"?kje(t)?Sje(t[0],t[1]):vje(t):Pje(t)}nre.exports=Dje});var YF=I((Edt,sre)=>{var Rje=jg(),Fje=SF(),Nje=jF();function Lje(t,e){var r={};return e=Nje(e,3),Fje(t,function(i,n,s){Rje(r,n,e(i,n,s))}),r}sre.exports=Lje});var Yd=I((ydt,ore)=>{"use strict";function Pc(t){this._maxSize=t,this.clear()}Pc.prototype.clear=function(){this._size=0,this._values=Object.create(null)};Pc.prototype.get=function(t){return this._values[t]};Pc.prototype.set=function(t,e){return this._size>=this._maxSize&&this.clear(),t in this._values||this._size++,this._values[t]=e};var Tje=/[^.^\]^[]+|(?=\[\]|\.\.)/g,are=/^\d+$/,Mje=/^\d/,Oje=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,Kje=/^\s*(['"]?)(.*?)(\1)\s*$/,qF=512,Are=new Pc(qF),lre=new Pc(qF),cre=new Pc(qF);ore.exports={Cache:Pc,split:WF,normalizePath:JF,setter:function(t){var e=JF(t);return lre.get(t)||lre.set(t,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(qd,"__esModule",{value:!0});qd.create=Yje;qd.default=void 0;var qje=Yd(),d0={context:"$",value:"."};function Yje(t,e){return new C0(t,e)}var C0=class{constructor(e,r={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===d0.context,this.isValue=this.key[0]===d0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?d0.context:this.isValue?d0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,qje.getter)(this.path,!0),this.map=r.map}getValue(e,r,i){let n=this.isContext?i:this.isValue?e:r;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,r){return this.getValue(e,r==null?void 0:r.parent,r==null?void 0:r.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};qd.default=C0;C0.prototype.__isYupRef=!0});var ure=I(VF=>{"use strict";Object.defineProperty(VF,"__esModule",{value:!0});VF.default=Jje;var Wje=_F(YF()),m0=_F(xc()),zje=_F(Dc());function _F(t){return t&&t.__esModule?t:{default:t}}function I0(){return I0=Object.assign||function(t){for(var e=1;e=0)&&(r[n]=t[n]);return r}function Jje(t){function e(r,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=r,u=Vje(r,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=t,{parent:d,context:m}=a;function E(L){return zje.default.isRef(L)?L.getValue(n,d,m):L}function B(L={}){let K=(0,Wje.default)(I0({value:n,originalValue:l,label:o,path:L.path||s},h,L.params),E),J=new m0.default(m0.default.formatError(L.message||p,K),n,K.path,L.type||g);return J.params=K,J}let b=I0({path:s,parent:d,type:g,createError:B,resolve:E,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(b,n,b)).then(L=>{m0.default.isError(L)?i(L):L?i(null,L):i(B())})}catch(L){i(L)}return}let R;try{var H;if(R=f.call(b,n,b),typeof((H=R)==null?void 0:H.then)=="function")throw new Error(`Validation test of type: "${b.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(L){i(L);return}m0.default.isError(R)?i(R):R?i(null,R):i(B())}return e.OPTIONS=t,e}});var XF=I(Jd=>{"use strict";Object.defineProperty(Jd,"__esModule",{value:!0});Jd.getIn=gre;Jd.default=void 0;var _je=Yd(),Xje=t=>t.substr(0,t.length-1).substr(1);function gre(t,e,r,i=r){let n,s,o;return e?((0,_je.forEach)(e,(a,l,c)=>{let u=l?Xje(a):a;if(t=t.resolve({context:i,parent:n,value:r}),t.innerType){let g=c?parseInt(u,10):0;if(r&&g>=r.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=r,r=r&&r[g],t=t.innerType}if(!c){if(!t.fields||!t.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${t._type}")`);n=r,r=r&&r[u],t=t.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:t,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:t}}var Zje=(t,e,r,i)=>gre(t,e,r,i).schema,$je=Zje;Jd.default=$je});var hre=I(E0=>{"use strict";Object.defineProperty(E0,"__esModule",{value:!0});E0.default=void 0;var fre=eYe(Dc());function eYe(t){return t&&t.__esModule?t:{default:t}}var y0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let r of this.list)e.push(r);for(let[,r]of this.refs)e.push(r.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){fre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){fre.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,r){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(r(i.value)===e)return!0;return!1}clone(){let e=new y0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,r){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),r.list.forEach(n=>i.delete(n)),r.refs.forEach(n=>i.delete(n)),i}};E0.default=y0});var Ma=I(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var pre=Ta(M$()),Xg=La(),tYe=Ta(Z$()),dre=Ta(a0()),B0=Ta(ure()),Cre=Ta(Nd()),rYe=Ta(Dc()),iYe=XF(),nYe=Ta(IF()),mre=Ta(xc()),Ire=Ta(hre());function Ta(t){return t&&t.__esModule?t:{default:t}}function ds(){return ds=Object.assign||function(t){for(var e=1;e{this.typeError(Xg.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=ds({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let r=Object.create(Object.getPrototypeOf(this));return r.type=this.type,r._typeError=this._typeError,r._whitelistError=this._whitelistError,r._blacklistError=this._blacklistError,r._whitelist=this._whitelist.clone(),r._blacklist=this._blacklist.clone(),r.exclusiveTests=ds({},this.exclusiveTests),r.deps=[...this.deps],r.conditions=[...this.conditions],r.tests=[...this.tests],r.transforms=[...this.transforms],r.spec=(0,pre.default)(ds({},this.spec,e)),r}label(e){var r=this.clone();return r.spec.label=e,r}meta(...e){if(e.length===0)return this.spec.meta;let r=this.clone();return r.spec.meta=Object.assign(r.spec.meta||{},e[0]),r}withMutation(e){let r=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=r,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let r=this,i=e.clone(),n=ds({},r.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=r._typeError),i._whitelistError||(i._whitelistError=r._whitelistError),i._blacklistError||(i._blacklistError=r._blacklistError),i._whitelist=r._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=r._blacklist.merge(e._blacklist,e._whitelist),i.tests=r.tests,i.exclusiveTests=r.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let r=this;if(r.conditions.length){let i=r.conditions;r=r.clone(),r.conditions=[],r=i.reduce((n,s)=>s.resolve(n,e),r),r=r.resolve(e)}return r}cast(e,r={}){let i=this.resolve(ds({value:e},r)),n=i._cast(e,r);if(e!==void 0&&r.assert!==!1&&i.isType(n)!==!0){let s=(0,Cre.default)(e),o=(0,Cre.default)(n);throw new TypeError(`The value of ${r.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". + +attempted value: ${s} +`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,r){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,r={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=r,u=e;l||(u=this._cast(u,ds({assert:!1},r)));let g={value:u,path:s,options:r,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,dre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,dre.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,r,i){let n=this.resolve(ds({},r,{value:e}));return typeof i=="function"?n._validate(e,r,i):new Promise((s,o)=>n._validate(e,r,(a,l)=>{a?o(a):s(l)}))}validateSync(e,r){let i=this.resolve(ds({},r,{value:e})),n;return i._validate(e,ds({},r,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,r){return this.validate(e,r).then(()=>!0,i=>{if(mre.default.isError(i))return!1;throw i})}isValidSync(e,r){try{return this.validateSync(e,r),!0}catch(i){if(mre.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,pre.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var r=this.clone();return r.spec.strict=e,r}_isPresent(e){return e!=null}defined(e=Xg.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(r){return r!==void 0}})}required(e=Xg.mixed.required){return this.clone({presence:"required"}).withMutation(r=>r.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(r=>r.OPTIONS.name!=="required"),e}nullable(e=!0){var r=this.clone({nullable:e!==!1});return r}transform(e){var r=this.clone();return r.transforms.push(e),r}test(...e){let r;if(e.length===1?typeof e[0]=="function"?r={test:e[0]}:r=e[0]:e.length===2?r={name:e[0],test:e[1]}:r={name:e[0],message:e[1],test:e[2]},r.message===void 0&&(r.message=Xg.mixed.default),typeof r.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,B0.default)(r),s=r.exclusive||r.name&&i.exclusiveTests[r.name]===!0;if(r.exclusive&&!r.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return r.name&&(i.exclusiveTests[r.name]=!!r.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===r.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,r){!Array.isArray(e)&&typeof e!="string"&&(r=e,e=".");let i=this.clone(),n=(0,nYe.default)(e).map(s=>new rYe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new tYe.default(n,r)),i}typeError(e){var r=this.clone();return r._typeError=(0,B0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),r}oneOf(e,r=Xg.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,B0.default)({message:r,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,r=Xg.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,B0.default)({message:r,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let r=this.clone();return r.spec.strip=e,r}describe(){let e=this.clone(),{label:r,meta:i}=e.spec;return{meta:i,label:r,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};w0.default=Do;Do.prototype.__isYupSchema__=!0;for(let t of["validate","validateSync"])Do.prototype[`${t}At`]=function(e,r,i={}){let{parent:n,parentPath:s,schema:o}=(0,iYe.getIn)(this,e,r,i.context);return o[t](n&&n[s],ds({},i,{parent:n,path:e}))};for(let t of["equals","is"])Do.prototype[t]=Do.prototype.oneOf;for(let t of["not","nope"])Do.prototype[t]=Do.prototype.notOneOf;Do.prototype.optional=Do.prototype.notRequired});var yre=I(Wd=>{"use strict";Object.defineProperty(Wd,"__esModule",{value:!0});Wd.create=Ere;Wd.default=void 0;var oYe=sYe(Ma());function sYe(t){return t&&t.__esModule?t:{default:t}}var ZF=oYe.default,aYe=ZF;Wd.default=aYe;function Ere(){return new ZF}Ere.prototype=ZF.prototype});var Zg=I(Q0=>{"use strict";Object.defineProperty(Q0,"__esModule",{value:!0});Q0.default=void 0;var AYe=t=>t==null;Q0.default=AYe});var vre=I(zd=>{"use strict";Object.defineProperty(zd,"__esModule",{value:!0});zd.create=wre;zd.default=void 0;var lYe=Bre(Ma()),Qre=La(),bre=Bre(Zg());function Bre(t){return t&&t.__esModule?t:{default:t}}function wre(){return new b0}var b0=class extends lYe.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(r){return(0,bre.default)(r)||r===!0}})}isFalse(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(r){return(0,bre.default)(r)||r===!1}})}};zd.default=b0;wre.prototype=b0.prototype});var kre=I(Vd=>{"use strict";Object.defineProperty(Vd,"__esModule",{value:!0});Vd.create=Sre;Vd.default=void 0;var Ro=La(),Oa=xre(Zg()),cYe=xre(Ma());function xre(t){return t&&t.__esModule?t:{default:t}}var uYe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,gYe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,fYe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,hYe=t=>(0,Oa.default)(t)||t===t.trim(),pYe={}.toString();function Sre(){return new v0}var v0=class extends cYe.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let r=e!=null&&e.toString?e.toString():e;return r===pYe?e:r})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,r=Ro.string.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,Oa.default)(i)||i.length===this.resolve(e)}})}min(e,r=Ro.string.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Oa.default)(i)||i.length>=this.resolve(e)}})}max(e,r=Ro.string.max){return this.test({name:"max",exclusive:!0,message:r,params:{max:e},test(i){return(0,Oa.default)(i)||i.length<=this.resolve(e)}})}matches(e,r){let i=!1,n,s;return r&&(typeof r=="object"?{excludeEmptyString:i=!1,message:n,name:s}=r:n=r),this.test({name:s||"matches",message:n||Ro.string.matches,params:{regex:e},test:o=>(0,Oa.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=Ro.string.email){return this.matches(uYe,{name:"email",message:e,excludeEmptyString:!0})}url(e=Ro.string.url){return this.matches(gYe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=Ro.string.uuid){return this.matches(fYe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=Ro.string.trim){return this.transform(r=>r!=null?r.trim():r).test({message:e,name:"trim",test:hYe})}lowercase(e=Ro.string.lowercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toLowerCase()})}uppercase(e=Ro.string.uppercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toUpperCase()})}};Vd.default=v0;Sre.prototype=v0.prototype});var Rre=I(_d=>{"use strict";Object.defineProperty(_d,"__esModule",{value:!0});_d.create=Pre;_d.default=void 0;var Rc=La(),Fc=Dre(Zg()),dYe=Dre(Ma());function Dre(t){return t&&t.__esModule?t:{default:t}}var CYe=t=>t!=+t;function Pre(){return new S0}var S0=class extends dYe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let r=e;if(typeof r=="string"){if(r=r.replace(/\s/g,""),r==="")return NaN;r=+r}return this.isType(r)?r:parseFloat(r)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!CYe(e)}min(e,r=Rc.number.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Fc.default)(i)||i>=this.resolve(e)}})}max(e,r=Rc.number.max){return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,Fc.default)(i)||i<=this.resolve(e)}})}lessThan(e,r=Rc.number.lessThan){return this.test({message:r,name:"max",exclusive:!0,params:{less:e},test(i){return(0,Fc.default)(i)||ithis.resolve(e)}})}positive(e=Rc.number.positive){return this.moreThan(0,e)}negative(e=Rc.number.negative){return this.lessThan(0,e)}integer(e=Rc.number.integer){return this.test({name:"integer",message:e,test:r=>(0,Fc.default)(r)||Number.isInteger(r)})}truncate(){return this.transform(e=>(0,Fc.default)(e)?e:e|0)}round(e){var r,i=["ceil","floor","round","trunc"];if(e=((r=e)==null?void 0:r.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,Fc.default)(n)?n:Math[e](n))}};_d.default=S0;Pre.prototype=S0.prototype});var Fre=I($F=>{"use strict";Object.defineProperty($F,"__esModule",{value:!0});$F.default=mYe;var IYe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function mYe(t){var e=[1,4,5,6,7,10,11],r=0,i,n;if(n=IYe.exec(t)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(r=n[10]*60+n[11],n[9]==="+"&&(r=0-r)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+r,n[6],n[7]))}else i=Date.parse?Date.parse(t):NaN;return i}});var Tre=I(Xd=>{"use strict";Object.defineProperty(Xd,"__esModule",{value:!0});Xd.create=eN;Xd.default=void 0;var EYe=x0(Fre()),Nre=La(),Lre=x0(Zg()),yYe=x0(Dc()),wYe=x0(Ma());function x0(t){return t&&t.__esModule?t:{default:t}}var tN=new Date(""),BYe=t=>Object.prototype.toString.call(t)==="[object Date]";function eN(){return new Zd}var Zd=class extends wYe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,EYe.default)(e),isNaN(e)?tN:new Date(e))})})}_typeCheck(e){return BYe(e)&&!isNaN(e.getTime())}prepareParam(e,r){let i;if(yYe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${r}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,r=Nre.date.min){let i=this.prepareParam(e,"min");return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(n){return(0,Lre.default)(n)||n>=this.resolve(i)}})}max(e,r=Nre.date.max){var i=this.prepareParam(e,"max");return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(n){return(0,Lre.default)(n)||n<=this.resolve(i)}})}};Xd.default=Zd;Zd.INVALID_DATE=tN;eN.prototype=Zd.prototype;eN.INVALID_DATE=tN});var Ore=I((Ndt,Mre)=>{function QYe(t,e,r,i){var n=-1,s=t==null?0:t.length;for(i&&s&&(r=t[++n]);++n{function bYe(t){return function(e){return t==null?void 0:t[e]}}Kre.exports=bYe});var Gre=I((Tdt,Hre)=>{var vYe=Ure(),SYe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},xYe=vYe(SYe);Hre.exports=xYe});var Yre=I((Mdt,jre)=>{var kYe=Gre(),PYe=gg(),DYe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,RYe="\\u0300-\\u036f",FYe="\\ufe20-\\ufe2f",NYe="\\u20d0-\\u20ff",LYe=RYe+FYe+NYe,TYe="["+LYe+"]",MYe=RegExp(TYe,"g");function OYe(t){return t=PYe(t),t&&t.replace(DYe,kYe).replace(MYe,"")}jre.exports=OYe});var Jre=I((Odt,qre)=>{var KYe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function UYe(t){return t.match(KYe)||[]}qre.exports=UYe});var zre=I((Kdt,Wre)=>{var HYe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function GYe(t){return HYe.test(t)}Wre.exports=GYe});var fie=I((Udt,Vre)=>{var _re="\\ud800-\\udfff",jYe="\\u0300-\\u036f",YYe="\\ufe20-\\ufe2f",qYe="\\u20d0-\\u20ff",JYe=jYe+YYe+qYe,Xre="\\u2700-\\u27bf",Zre="a-z\\xdf-\\xf6\\xf8-\\xff",WYe="\\xac\\xb1\\xd7\\xf7",zYe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",VYe="\\u2000-\\u206f",_Ye=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",$re="A-Z\\xc0-\\xd6\\xd8-\\xde",XYe="\\ufe0e\\ufe0f",eie=WYe+zYe+VYe+_Ye,tie="['\u2019]",rie="["+eie+"]",ZYe="["+JYe+"]",iie="\\d+",$Ye="["+Xre+"]",nie="["+Zre+"]",sie="[^"+_re+eie+iie+Xre+Zre+$re+"]",eqe="\\ud83c[\\udffb-\\udfff]",tqe="(?:"+ZYe+"|"+eqe+")",rqe="[^"+_re+"]",oie="(?:\\ud83c[\\udde6-\\uddff]){2}",aie="[\\ud800-\\udbff][\\udc00-\\udfff]",$g="["+$re+"]",iqe="\\u200d",Aie="(?:"+nie+"|"+sie+")",nqe="(?:"+$g+"|"+sie+")",lie="(?:"+tie+"(?:d|ll|m|re|s|t|ve))?",cie="(?:"+tie+"(?:D|LL|M|RE|S|T|VE))?",uie=tqe+"?",gie="["+XYe+"]?",sqe="(?:"+iqe+"(?:"+[rqe,oie,aie].join("|")+")"+gie+uie+")*",oqe="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",aqe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Aqe=gie+uie+sqe,lqe="(?:"+[$Ye,oie,aie].join("|")+")"+Aqe,cqe=RegExp([$g+"?"+nie+"+"+lie+"(?="+[rie,$g,"$"].join("|")+")",nqe+"+"+cie+"(?="+[rie,$g+Aie,"$"].join("|")+")",$g+"?"+Aie+"+"+lie,$g+"+"+cie,aqe,oqe,iie,lqe].join("|"),"g");function uqe(t){return t.match(cqe)||[]}Vre.exports=uqe});var pie=I((Hdt,hie)=>{var gqe=Jre(),fqe=zre(),hqe=gg(),pqe=fie();function dqe(t,e,r){return t=hqe(t),e=r?void 0:e,e===void 0?fqe(t)?pqe(t):gqe(t):t.match(e)||[]}hie.exports=dqe});var rN=I((Gdt,die)=>{var Cqe=Ore(),mqe=Yre(),Iqe=pie(),Eqe="['\u2019]",yqe=RegExp(Eqe,"g");function wqe(t){return function(e){return Cqe(Iqe(mqe(e).replace(yqe,"")),t,"")}}die.exports=wqe});var mie=I((jdt,Cie)=>{var Bqe=rN(),Qqe=Bqe(function(t,e,r){return t+(r?"_":"")+e.toLowerCase()});Cie.exports=Qqe});var Eie=I((Ydt,Iie)=>{var bqe=ZP(),vqe=rN(),Sqe=vqe(function(t,e,r){return e=e.toLowerCase(),t+(r?bqe(e):e)});Iie.exports=Sqe});var wie=I((qdt,yie)=>{var xqe=jg(),kqe=SF(),Pqe=jF();function Dqe(t,e){var r={};return e=Pqe(e,3),kqe(t,function(i,n,s){xqe(r,e(i,n,s),i)}),r}yie.exports=Dqe});var Qie=I((Jdt,iN)=>{iN.exports=function(t){return Bie(Rqe(t),t)};iN.exports.array=Bie;function Bie(t,e){var r=t.length,i=new Array(r),n={},s=r,o=Fqe(e),a=Nqe(t);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(t[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(d){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--r]=c}}}function Rqe(t){for(var e=new Set,r=0,i=t.length;r{"use strict";Object.defineProperty(nN,"__esModule",{value:!0});nN.default=Lqe;var Tqe=k0(Ld()),Mqe=k0(Qie()),Oqe=Yd(),Kqe=k0(Dc()),Uqe=k0(qg());function k0(t){return t&&t.__esModule?t:{default:t}}function Lqe(t,e=[]){let r=[],i=[];function n(s,o){var a=(0,Oqe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||r.push([o,a])}for(let s in t)if((0,Tqe.default)(t,s)){let o=t[s];~i.indexOf(s)||i.push(s),Kqe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,Uqe.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Mqe.default.array(i,r).reverse()}});var Sie=I(sN=>{"use strict";Object.defineProperty(sN,"__esModule",{value:!0});sN.default=Hqe;function vie(t,e){let r=Infinity;return t.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return r=n,!0}),r}function Hqe(t){return(e,r)=>vie(t,e)-vie(t,r)}});var Nie=I($d=>{"use strict";Object.defineProperty($d,"__esModule",{value:!0});$d.create=xie;$d.default=void 0;var kie=Fo(Ld()),Pie=Fo(mie()),Gqe=Fo(Eie()),jqe=Fo(wie()),Yqe=Fo(YF()),qqe=Yd(),Die=La(),Jqe=Fo(bie()),Rie=Fo(Sie()),Wqe=Fo(a0()),zqe=Fo(xc()),oN=Fo(Ma());function Fo(t){return t&&t.__esModule?t:{default:t}}function ef(){return ef=Object.assign||function(t){for(var e=1;eObject.prototype.toString.call(t)==="[object Object]";function Vqe(t,e){let r=Object.keys(t.fields);return Object.keys(e).filter(i=>r.indexOf(i)===-1)}var _qe=(0,Rie.default)([]),P0=class extends oN.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=_qe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return Fie(e)||typeof e=="function"}_cast(e,r={}){var i;let n=super._cast(e,r);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=r.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=ef({},r,{parent:l,__validating:r.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,kie.default)(n,g);if(f){let p,d=n[g];c.path=(r.path?`${r.path}.`:"")+g,f=f.resolve({value:d,context:r.context,parent:l});let m="spec"in f?f.spec:void 0,E=m==null?void 0:m.strict;if(m==null?void 0:m.strip){u=u||g in n;continue}p=!r.__validating||!E?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,r={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=r;o=[{schema:this,value:a},...o],r.__validating=!0,r.originalValue=a,r.from=o,super._validate(e,r,(u,g)=>{if(u){if(!zqe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Fie(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,d)=>{let m=h.indexOf(".")===-1?(r.path?`${r.path}.`:"")+h:`${r.path||""}["${h}"]`,E=this.fields[h];if(E&&"validate"in E){E.validate(g[h],ef({},r,{path:m,from:o,strict:!0,parent:g,originalValue:a[h]}),d);return}d(null)});(0,Wqe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:r.path},i)})}clone(e){let r=super.clone(e);return r.fields=ef({},this.fields),r._nodes=this._nodes,r._excludedEdges=this._excludedEdges,r._sortErrors=this._sortErrors,r}concat(e){let r=super.concat(e),i=r.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof oN.default&&s instanceof oN.default&&(i[n]=s.concat(o))}return r.withMutation(()=>r.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(r=>{let i=this.fields[r];e[r]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,r=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,Rie.default)(Object.keys(n)),r.length){Array.isArray(r[0])||(r=[r]);let s=r.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Jqe.default)(n,i._excludedEdges),i}pick(e){let r={};for(let i of e)this.fields[i]&&(r[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(r)))}omit(e){let r=this.clone(),i=r.fields;r.fields={};for(let n of e)delete i[n];return r.withMutation(()=>r.shape(i))}from(e,r,i){let n=(0,qqe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,kie.default)(s,e)&&(o=ef({},s),i||delete o[e],o[r]=n(s)),o})}noUnknown(e=!0,r=Die.object.noUnknown){typeof e=="string"&&(r=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:r,test(n){if(n==null)return!0;let s=Vqe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,r=Die.object.noUnknown){return this.noUnknown(!e,r)}transformKeys(e){return this.transform(r=>r&&(0,jqe.default)(r,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Gqe.default)}snakeCase(){return this.transformKeys(Pie.default)}constantCase(){return this.transformKeys(e=>(0,Pie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Yqe.default)(this.fields,r=>r.describe()),e}};$d.default=P0;function xie(t){return new P0(t)}xie.prototype=P0.prototype});var Tie=I(eC=>{"use strict";Object.defineProperty(eC,"__esModule",{value:!0});eC.create=Lie;eC.default=void 0;var aN=tf(Zg()),Xqe=tf(qg()),Zqe=tf(Nd()),AN=La(),$qe=tf(a0()),eJe=tf(xc()),tJe=tf(Ma());function tf(t){return t&&t.__esModule?t:{default:t}}function D0(){return D0=Object.assign||function(t){for(var e=1;e{this.transform(function(r){if(typeof r=="string")try{r=JSON.parse(r)}catch(i){r=null}return this.isType(r)?r:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,r){let i=super._cast(e,r);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,D0({},r,{path:`${r.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,r={},i){var n,s;let o=[],a=r.sync,l=r.path,c=this.innerType,u=(n=r.abortEarly)!=null?n:this.spec.abortEarly,g=(s=r.recursive)!=null?s:this.spec.recursive,f=r.originalValue!=null?r.originalValue:e;super._validate(e,r,(h,p)=>{if(h){if(!eJe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let d=new Array(p.length);for(let m=0;mc.validate(E,b,H)}(0,$qe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:d},i)})}clone(e){let r=super.clone(e);return r.innerType=this.innerType,r}concat(e){let r=super.concat(e);return r.innerType=this.innerType,e.innerType&&(r.innerType=r.innerType?r.innerType.concat(e.innerType):e.innerType),r}of(e){let r=this.clone();if(!(0,Xqe.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Zqe.default)(e));return r.innerType=e,r}length(e,r=AN.array.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,aN.default)(i)||i.length===this.resolve(e)}})}min(e,r){return r=r||AN.array.min,this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,aN.default)(i)||i.length>=this.resolve(e)}})}max(e,r){return r=r||AN.array.max,this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,aN.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,r)=>this._typeCheck(e)?e:r==null?[]:[].concat(r))}compact(e){let r=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(r):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};eC.default=R0;Lie.prototype=R0.prototype});var Mie=I(tC=>{"use strict";Object.defineProperty(tC,"__esModule",{value:!0});tC.create=rJe;tC.default=void 0;var nJe=iJe(qg());function iJe(t){return t&&t.__esModule?t:{default:t}}function rJe(t){return new lN(t)}var lN=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(r,i={})=>{let n=this.builder(r,i);if(!(0,nJe.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,r){return this._resolve(e,r).cast(e,r)}validate(e,r,i){return this._resolve(e,r).validate(e,r,i)}validateSync(e,r){return this._resolve(e,r).validateSync(e,r)}validateAt(e,r,i){return this._resolve(r,i).validateAt(e,r,i)}validateSyncAt(e,r,i){return this._resolve(r,i).validateSyncAt(e,r,i)}describe(){return null}isValid(e,r){return this._resolve(e,r).isValid(e,r)}isValidSync(e,r){return this._resolve(e,r).isValidSync(e,r)}},sJe=lN;tC.default=sJe});var Oie=I(cN=>{"use strict";Object.defineProperty(cN,"__esModule",{value:!0});cN.default=oJe;var AJe=aJe(La());function aJe(t){return t&&t.__esModule?t:{default:t}}function oJe(t){Object.keys(t).forEach(e=>{Object.keys(t[e]).forEach(r=>{AJe.default[e][r]=t[e][r]})})}});var gN=I(cr=>{"use strict";Object.defineProperty(cr,"__esModule",{value:!0});cr.addMethod=lJe;Object.defineProperty(cr,"MixedSchema",{enumerable:!0,get:function(){return Kie.default}});Object.defineProperty(cr,"mixed",{enumerable:!0,get:function(){return Kie.create}});Object.defineProperty(cr,"BooleanSchema",{enumerable:!0,get:function(){return uN.default}});Object.defineProperty(cr,"bool",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"boolean",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"StringSchema",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(cr,"string",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(cr,"NumberSchema",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(cr,"number",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(cr,"DateSchema",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(cr,"date",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(cr,"ObjectSchema",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(cr,"object",{enumerable:!0,get:function(){return jie.create}});Object.defineProperty(cr,"ArraySchema",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(cr,"array",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(cr,"ref",{enumerable:!0,get:function(){return cJe.create}});Object.defineProperty(cr,"lazy",{enumerable:!0,get:function(){return uJe.create}});Object.defineProperty(cr,"ValidationError",{enumerable:!0,get:function(){return gJe.default}});Object.defineProperty(cr,"reach",{enumerable:!0,get:function(){return fJe.default}});Object.defineProperty(cr,"isSchema",{enumerable:!0,get:function(){return qie.default}});Object.defineProperty(cr,"setLocale",{enumerable:!0,get:function(){return hJe.default}});Object.defineProperty(cr,"BaseSchema",{enumerable:!0,get:function(){return pJe.default}});var Kie=Nc(yre()),uN=Nc(vre()),Uie=Nc(kre()),Hie=Nc(Rre()),Gie=Nc(Tre()),jie=Nc(Nie()),Yie=Nc(Tie()),cJe=Dc(),uJe=Mie(),gJe=rC(xc()),fJe=rC(XF()),qie=rC(qg()),hJe=rC(Oie()),pJe=rC(Ma());function rC(t){return t&&t.__esModule?t:{default:t}}function Jie(){if(typeof WeakMap!="function")return null;var t=new WeakMap;return Jie=function(){return t},t}function Nc(t){if(t&&t.__esModule)return t;if(t===null||typeof t!="object"&&typeof t!="function")return{default:t};var e=Jie();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var s=i?Object.getOwnPropertyDescriptor(t,n):null;s&&(s.get||s.set)?Object.defineProperty(r,n,s):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function lJe(t,e,r){if(!t||!(0,qie.default)(t.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof r!="function")throw new TypeError("Method function must be provided");t.prototype[e]=r}});var Xie=I((gCt,nC)=>{"use strict";var mJe=process.env.TERM_PROGRAM==="Hyper",IJe=process.platform==="win32",zie=process.platform==="linux",fN={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Vie=Object.assign({},fN,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),_ie=Object.assign({},fN,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:zie?"\u25B8":"\u276F",pointerSmall:zie?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});nC.exports=IJe&&!mJe?Vie:_ie;Reflect.defineProperty(nC.exports,"common",{enumerable:!1,value:fN});Reflect.defineProperty(nC.exports,"windows",{enumerable:!1,value:Vie});Reflect.defineProperty(nC.exports,"other",{enumerable:!1,value:_ie})});var js=I((fCt,hN)=>{"use strict";var EJe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),yJe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Zie=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},r=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(t.enabled===!1)return s;if(t.visible===!1)return"";let a=""+s,l=a.includes(` +`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=r(t.styles[o[c]],a,l);return a},n=(s,o,a)=>{t.styles[s]=e({name:s,codes:o}),(t.keys[a]||(t.keys[a]=[])).push(s),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(c){t.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,t),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=yJe,t.hasColor=t.hasAnsi=s=>(t.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&t.ansiRegex.test(s)),t.alias=(s,o)=>{let a=typeof o=="string"?t[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),t.styles[s]=a,a.stack=[s]),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(l){t.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,t),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},t.theme=s=>{if(!EJe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))t.alias(o,s[o]);return t},t.alias("unstyle",s=>typeof s=="string"&&s!==""?(t.ansiRegex.lastIndex=0,s.replace(t.ansiRegex,"")):""),t.alias("noop",s=>s),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Xie(),t.define=n,t};hN.exports=Zie();hN.exports.create=Zie});var Mi=I(bt=>{"use strict";var wJe=Object.prototype.toString,Cs=js(),$ie=!1,pN=[],ene={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};bt.longest=(t,e)=>t.reduce((r,i)=>Math.max(r,e?i[e].length:i.length),0);bt.hasColor=t=>!!t&&Cs.hasColor(t);var N0=bt.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);bt.nativeType=t=>wJe.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");bt.isAsyncFn=t=>bt.nativeType(t)==="asyncfunction";bt.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";bt.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;bt.scrollDown=(t=[])=>[...t.slice(1),t[0]];bt.scrollUp=(t=[])=>[t.pop(),...t];bt.reorder=(t=[])=>{let e=t.slice();return e.sort((r,i)=>r.index>i.index?1:r.index{let i=t.length,n=r===i?0:r<0?i-1:r,s=t[e];t[e]=t[n],t[n]=s};bt.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};bt.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};bt.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:i=` +`+r,width:n=80}=e;n-=((i+r).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=t.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),r+c.join(i)};bt.unmute=t=>{let e=t.stack.find(i=>Cs.keys.color.includes(i));return e?Cs[e]:t.stack.find(i=>i.slice(2)==="bg")?Cs[e.slice(2)]:i=>i};bt.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";bt.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i));if(e){let i=Cs["bg"+bt.pascal(e)];return i?i.black:t}let r=t.stack.find(i=>i.slice(0,2)==="bg");return r?Cs[r.slice(2).toLowerCase()]||t:Cs.none};bt.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i)),r=t.stack.find(i=>i.slice(0,2)==="bg");if(e&&!r)return Cs[ene[e]||e];if(r){let i=r.slice(2).toLowerCase(),n=ene[i];return n&&Cs["bg"+bt.pascal(n)]||t}return Cs.none};bt.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=r<10?"0"+r:r;return n+":"+s+" "+i};bt.set=(t={},e="",r)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:r;return!bt.isObject(a)&&s{let i=t[e]==null?e.split(".").reduce((n,s)=>n&&n[s],t):t[e];return i==null?r:i};bt.mixin=(t,e)=>{if(!N0(t))return e;if(!N0(e))return t;for(let r of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,r);if(i.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&N0(i.value)){let n=Object.getOwnPropertyDescriptor(t,r);N0(n.value)?t[r]=bt.merge({},t[r],e[r]):Reflect.defineProperty(t,r,i)}else Reflect.defineProperty(t,r,i);else Reflect.defineProperty(t,r,i)}return t};bt.merge=(...t)=>{let e={};for(let r of t)bt.mixin(e,r);return e};bt.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let i of Object.keys(r)){let n=r[i];typeof n=="function"?bt.define(t,i,n.bind(e)):bt.define(t,i,n)}};bt.onExit=t=>{let e=(r,i)=>{$ie||($ie=!0,pN.forEach(n=>n()),r===!0&&process.exit(128+i))};pN.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),pN.push(t)};bt.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};bt.defineExport=(t,e,r)=>{let i;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():r()}})}});var tne=I(nf=>{"use strict";nf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};nf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};nf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};nf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};nf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var nne=I((dCt,rne)=>{"use strict";var ine=require("readline"),BJe=tne(),QJe=/^(?:\x1b)([a-zA-Z0-9])$/,bJe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,vJe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function SJe(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function xJe(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var L0=(t="",e={})=>{let r,i=P({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t},e);if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=""+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=i.sequence||""),i.sequence=i.sequence||t||i.name,t==="\r")i.raw=void 0,i.name="return";else if(t===` +`)i.name="enter";else if(t===" ")i.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x7F"||t==="\b")i.name="backspace",i.meta=t.charAt(0)==="";else if(t===""||t==="")i.name="escape",i.meta=t.length===2;else if(t===" "||t===" ")i.name="space",i.meta=t.length===2;else if(t<="")i.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")i.name="number";else if(t.length===1&&t>="a"&&t<="z")i.name=t;else if(t.length===1&&t>="A"&&t<="Z")i.name=t.toLowerCase(),i.shift=!0;else if(r=QJe.exec(t))i.meta=!0,i.shift=/^[A-Z]$/.test(r[1]);else if(r=bJe.exec(t)){let n=[...t];n[0]===""&&n[1]===""&&(i.option=!0);let s=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=vJe[s],i.shift=SJe(s)||i.shift,i.ctrl=xJe(s)||i.ctrl}return i};L0.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let i=ine.createInterface({terminal:!0,input:r});ine.emitKeypressEvents(r,i);let n=(a,l)=>e(a,L0(a,l),i),s=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",n),i.resume(),()=>{r.isTTY&&r.setRawMode(s),r.removeListener("keypress",n),i.pause(),i.close()}};L0.action=(t,e,r)=>{let i=P(P({},BJe),r);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};rne.exports=L0});var one=I((CCt,sne)=>{"use strict";sne.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let i=e[r];typeof i=="number"&&(i={interval:i}),kJe(t,r,i)}};function kJe(t,e,r={}){let i=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=r.interval||120;i.frames=r.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,t.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),t.once("close",()=>i.stop()),i.stop}});var lne=I((mCt,ane)=>{"use strict";var{define:PJe,width:DJe}=Mi(),Ane=class{constructor(e){let r=e.options;PJe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=DJe(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=P({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};ane.exports=Ane});var une=I((ICt,cne)=>{"use strict";var dN=Mi(),yi=js(),CN={default:yi.noop,noop:yi.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||dN.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||dN.complement(this.primary)},primary:yi.cyan,success:yi.green,danger:yi.magenta,strong:yi.bold,warning:yi.yellow,muted:yi.dim,disabled:yi.gray,dark:yi.dim.gray,underline:yi.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};CN.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(yi.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(yi.visible=t.styles.visible);let e=dN.merge({},CN,t.styles);delete e.merge;for(let r of Object.keys(yi))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});for(let r of Object.keys(yi.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});return e};cne.exports=CN});var fne=I((ECt,gne)=>{"use strict";var mN=process.platform==="win32",Ka=js(),RJe=Mi(),IN=_(P({},Ka.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Ka.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Ka.symbols.question,submitted:Ka.symbols.check,cancelled:Ka.symbols.cross},separator:{pending:Ka.symbols.pointerSmall,submitted:Ka.symbols.middot,cancelled:Ka.symbols.middot},radio:{off:mN?"( )":"\u25EF",on:mN?"(*)":"\u25C9",disabled:mN?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});IN.merge=t=>{let e=RJe.merge({},Ka.symbols,IN,t.symbols);return delete e.merge,e};gne.exports=IN});var pne=I((yCt,hne)=>{"use strict";var FJe=une(),NJe=fne(),LJe=Mi();hne.exports=t=>{t.options=LJe.merge({},t.options.theme,t.options),t.symbols=NJe.merge(t.options),t.styles=FJe.merge(t.options)}});var Ene=I((dne,Cne)=>{"use strict";var mne=process.env.TERM_PROGRAM==="Apple_Terminal",TJe=js(),EN=Mi(),Ys=Cne.exports=dne,Er="[",Ine="\x07",yN=!1,HA=Ys.code={bell:Ine,beep:Ine,beginning:`${Er}G`,down:`${Er}J`,esc:Er,getPosition:`${Er}6n`,hide:`${Er}?25l`,line:`${Er}2K`,lineEnd:`${Er}K`,lineStart:`${Er}1K`,restorePosition:Er+(mne?"8":"u"),savePosition:Er+(mne?"7":"s"),screen:`${Er}2J`,show:`${Er}?25h`,up:`${Er}1J`},Lc=Ys.cursor={get hidden(){return yN},hide(){return yN=!0,HA.hide},show(){return yN=!1,HA.show},forward:(t=1)=>`${Er}${t}C`,backward:(t=1)=>`${Er}${t}D`,nextLine:(t=1)=>`${Er}E`.repeat(t),prevLine:(t=1)=>`${Er}F`.repeat(t),up:(t=1)=>t?`${Er}${t}A`:"",down:(t=1)=>t?`${Er}${t}B`:"",right:(t=1)=>t?`${Er}${t}C`:"",left:(t=1)=>t?`${Er}${t}D`:"",to(t,e){return e?`${Er}${e+1};${t+1}H`:`${Er}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Lc.left(-t):t>0?Lc.right(t):"",r+=e<0?Lc.up(-e):e>0?Lc.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:i,input:n,prompt:s,size:o,value:a}=t;if(i=EN.isPrimitive(i)?String(i):"",n=EN.isPrimitive(n)?String(n):"",a=EN.isPrimitive(a)?String(a):"",o){let l=Ys.cursor.up(o)+Ys.cursor.to(s.length),c=n.length-r;return c>0&&(l+=Ys.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+r;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Ys.cursor.move(l)}}},wN=Ys.erase={screen:HA.screen,up:HA.up,down:HA.down,line:HA.line,lineEnd:HA.lineEnd,lineStart:HA.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return wN.line+Lc.to(0);let r=s=>[...TJe.unstyle(s)].length,i=t.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(r(s)-1,0)/e);return(wN.line+Lc.prevLine()).repeat(n-1)+wN.line+Lc.to(0)}});var sf=I((wCt,yne)=>{"use strict";var MJe=require("events"),wne=js(),BN=nne(),OJe=one(),KJe=lne(),UJe=pne(),bn=Mi(),Tc=Ene(),T0=class extends MJe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,UJe(this),OJe(this),this.state=new KJe(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=GJe(this.options.margin),this.setMaxListeners(0),HJe(this)}async keypress(e,r={}){this.keypressed=!0;let i=BN.action(e,BN(e,r),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Tc.code.beep)}cursorHide(){this.stdout.write(Tc.cursor.hide()),bn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Tc.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Tc.cursor.down(e)+Tc.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:r,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=Tc.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:r,prompt:i}=this.state;i=wne.unstyle(i);let n=wne.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` +`),c=l[0],u=l[l.length-1],f=(i+(r?" "+r:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let n=r.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=r&&r[e]!=null?r[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,r,i);return!g&&r&&r[e]?this.resolve(c,s,r,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,i=this.state;return i.timer=r,bn.isObject(e)&&(e=e[i.status]||e.pending),bn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return bn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,i=this.state;i.timer=r;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return bn.isObject(s)&&(s=s[i.status]||s.pending),bn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,r){let i=await this.element("pointer",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===r,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=bn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,r){let i=await this.element("indicator",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return bn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return bn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return bn.resolve(this,e,...r)}get base(){return T0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||bn.height(this.stdout,25)}get width(){return this.options.columns||bn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,i=[r,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function HJe(t){let e=n=>t[n]===void 0||typeof t[n]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(t.options)){if(r.includes(n)||/^on[A-Z]/.test(n))continue;let s=t.options[n];typeof s=="function"&&e(n)?i.includes(n)||(t[n]=s.bind(t)):typeof t[n]!="function"&&(t[n]=s)}}function GJe(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=n=>n%2==0?` +`:" ",i=[];for(let n=0;n<4;n++){let s=r(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}yne.exports=T0});var bne=I((BCt,Bne)=>{"use strict";var jJe=Mi(),Qne={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return Qne.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};Bne.exports=(t,e={})=>{let r=jJe.merge({},Qne,e.roles);return r[t]||r.default}});var sC=I((QCt,vne)=>{"use strict";var YJe=js(),qJe=sf(),JJe=bne(),M0=Mi(),{reorder:QN,scrollUp:WJe,scrollDown:zJe,isObject:Sne,swap:VJe}=M0,xne=class extends qJe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");Sne(r)&&(r=Object.keys(r)),Array.isArray(r)?(i!=null&&(this.index=this.findIndex(i)),r.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(r=i),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,r,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=JJe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,M0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,YJe.unstyle(e.message).length));let o=P({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,i){let n=await this.toChoice(e,r,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,r,i){let n=P({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,r,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(n=>this.toggle(n,r));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return kne(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=QN(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=r(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=QN(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=QN(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>r&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===r-1?this.alert():e>r&&i===r-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=WJe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=zJe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){VJe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&r.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,r),i),{})}filter(e,r){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return r?o.map(a=>a[r]):o}find(e,r){if(Sne(e))return r?e[r]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return r?s[r]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:r,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&r!==!1&&i!==!0&&(s=M0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(i=>i.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let i=this.find(r);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return kne(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:i}=this,n=e.limit||this._limit||r.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function kne(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(M0.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let i=r.choices.filter(n=>!t.isDisabled(n));r.enabled=i.every(n=>n.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}vne.exports=xne});var GA=I((bCt,Pne)=>{"use strict";var _Je=sC(),bN=Mi(),Dne=class extends _Je{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let i=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!bN.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await this.indicator(e,r)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,r);o&&!bN.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,r),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?(bN.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let i=this.margin[0]+r.join(` +`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(r),this.write([n,i,u,g].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Pne.exports=Dne});var Nne=I((vCt,Rne)=>{"use strict";var XJe=GA(),ZJe=(t,e)=>{let r=t.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(r),o=e(i.slice(s,s+r.length));return s>=0?i.slice(0,s)+o+i.slice(s+r.length):i}},Fne=class extends XJe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:i}=this.state;return this.input=i.slice(0,r)+e+i.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let i=e.toLowerCase();return r.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=ZJe(this.input,e),i=this.choices;this.choices=i.map(n=>_(P({},n),{message:r(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};Rne.exports=Fne});var SN=I((SCt,Lne)=>{"use strict";var vN=Mi();Lne.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||t.styles.placeholder,l=vN.inverse(t.styles.primary),c=d=>l(t.styles.black(d)),u=r,g=" ",f=c(g);if(t.blink&&t.blink.off===!0&&(c=d=>d,f=""),s&&n===0&&i===""&&r==="")return c(g);if(s&&n===0&&(r===i||r===""))return c(i[0])+a(i.slice(1));i=vN.isPrimitive(i)?`${i}`:"",r=vN.isPrimitive(r)?`${r}`:"";let h=i&&i.startsWith(r)&&i!==r,p=h?c(i[r.length]):f;if(n!==r.length&&s===!0&&(u=r.slice(0,n)+c(r[n])+r.slice(n+1),p=""),s===!1&&(p=""),h){let d=t.styles.unstyle(u+p);return u+p+a(i.slice(d.length))}return u+p}});var O0=I((xCt,Tne)=>{"use strict";var $Je=js(),e3e=GA(),t3e=SN(),Mne=class extends e3e{constructor(e){super(_(P({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:i,input:n}=r;return r.value=r.input=n.slice(0,i)+e+n.slice(i),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:i}=e;return e.value=e.input=i.slice(0,r-1)+i.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:i}=e;if(i[r]===void 0)return this.alert();let n=`${i}`.slice(0,r)+`${i}`.slice(r+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:i}=e;return r&&r.startsWith(i)&&i!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let i=await this.resolve(e.separator,this.state,e,r)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,d=this.index===r,m=e.validate||(()=>!0),E=await this.choiceSeparator(e,r),B=e.message;this.align==="right"&&(B=B.padStart(this.longest+1," ")),this.align==="left"&&(B=B.padEnd(this.longest+1," "));let b=this.values[a]=c||o,R=c?"success":"dark";await m.call(e,b,this.state)!==!0&&(R="danger");let L=n[R](await this.indicator(e,r))+(e.pad||""),K=this.indent(e),J=()=>[K,L,B+E,c,p].filter(Boolean).join(" ");if(i.submitted)return B=$Je.unstyle(B),c=g(c),p="",J();if(e.format)c=await e.format.call(this,c,e,r);else{let ne=this.styles.muted;c=t3e(this,{input:c,initial:o,pos:s,showCursor:d,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,b,e,r)),d&&(B=f(B)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),J()}async submit(){return this.value=this.values,super.base.submit.call(this)}};Tne.exports=Mne});var xN=I((kCt,One)=>{"use strict";var r3e=O0(),i3e=()=>{throw new Error("expected prompt to have a custom authenticate method")},Kne=(t=i3e)=>{class e extends r3e{constructor(i){super(i)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Kne(i)}}return e};One.exports=Kne()});var Gne=I((PCt,Une)=>{"use strict";var n3e=xN();function s3e(t,e){return t.username===this.options.username&&t.password===this.options.password}var Hne=(t=s3e)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class r extends n3e.create(t){constructor(n){super(_(P({},n),{choices:e}))}static create(n){return Hne(n)}}return r};Une.exports=Hne()});var K0=I((DCt,jne)=>{"use strict";var o3e=sf(),{isPrimitive:a3e,hasColor:A3e}=Mi(),Yne=class extends o3e{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:i}=this;return i.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return a3e(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return A3e(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(r),this.write([l,a,f].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};jne.exports=Yne});var Wne=I((RCt,qne)=>{"use strict";var l3e=K0(),Jne=class extends l3e{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};qne.exports=Jne});var _ne=I((FCt,zne)=>{"use strict";var c3e=GA(),u3e=O0(),of=u3e.prototype,Vne=class extends c3e{constructor(e){super(_(P({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():of.dispatch.call(this,e,r)}append(e,r){return of.append.call(this,e,r)}delete(e,r){return of.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?of.next.call(this):super.next()}prev(){return this.focused.editable?of.prev.call(this):super.prev()}async indicator(e,r){let i=e.indicator||"",n=e.editable?i:super.indicator(e,r);return await this.resolve(n,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?of.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let i=r.parent?this.value[r.parent.name]:this.value;if(r.editable?i=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(i=r.enabled===!0),e=await r.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};zne.exports=Vne});var Mc=I((NCt,Xne)=>{"use strict";var g3e=sf(),f3e=SN(),{isPrimitive:h3e}=Mi(),Zne=class extends g3e{constructor(e){super(e);this.initial=h3e(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let i=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!i||i.name!=="return")?this.append(` +`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:i}=this.state;this.input=`${i}`.slice(0,r)+e+`${i}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),i=this.input.slice(e),n=r.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):f3e(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),i=await this.separator(),n=await this.message(),s=[r,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` +`)),this.restore()}};Xne.exports=Zne});var ese=I((LCt,$ne)=>{"use strict";var p3e=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),U0=t=>p3e(t).filter(Boolean);$ne.exports=(t,e={},r="")=>{let{past:i=[],present:n=""}=e,s,o;switch(t){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:U0([r,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:U0([...s,r]),present:o};case"save":return{past:U0([...i,r]),present:""};case"remove":return o=U0(i.filter(a=>a!==r)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${t}"`)}}});var kN=I((TCt,tse)=>{"use strict";var d3e=Mc(),rse=ese(),ise=class extends d3e{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let i=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=rse(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=rse("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};tse.exports=ise});var ose=I((MCt,nse)=>{"use strict";var C3e=Mc(),sse=class extends C3e{format(){return""}};nse.exports=sse});var lse=I((OCt,ase)=>{"use strict";var m3e=Mc(),Ase=class extends m3e{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};ase.exports=Ase});var gse=I((KCt,cse)=>{"use strict";var I3e=GA(),use=class extends I3e{constructor(e){super(_(P({},e),{multiple:!0}))}};cse.exports=use});var PN=I((UCt,fse)=>{"use strict";var E3e=Mc(),hse=class extends E3e{constructor(e={}){super(P({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,i=this.toNumber(this.input);return i>this.max+r?this.alert():(this.input=`${i+r}`,this.render())}down(e){let r=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};fse.exports=hse});var dse=I((HCt,pse)=>{pse.exports=PN()});var Ise=I((GCt,Cse)=>{"use strict";var y3e=Mc(),mse=class extends y3e{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Cse.exports=mse});var Bse=I((jCt,Ese)=>{"use strict";var w3e=js(),B3e=sC(),yse=Mi(),wse=class extends B3e{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` + `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` +`)}renderScaleHeading(e){let r=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-r.join("").length,n=Math.round(i/(r.length-1)),o=r.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,r,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,i);let n=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let i=e.scale.map(s=>this.scaleIndicator(e,s,r)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await e.hint;s&&!yse.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,r),u=await this.renderScale(e,r),g=this.margin[1]+this.margin[3];this.scaleLength=w3e.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=yse.wordWrap(c,{width:this.widths[0],newline:a}).split(` +`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),r=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...r.map(n=>n.join(" "))].join(` +`)}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(r),this.write([a,o,c,g,f].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Ese.exports=wse});var Sse=I((YCt,Qse)=>{"use strict";var bse=js(),Q3e=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",vse=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Q3e(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},b3e=async(t={},e={},r=i=>i)=>{let i=new Set,n=t.fields||[],s=t.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uR.name===E.key);E.field=n.find(R=>R.name===E.key),b||(b=new vse(E),a.push(b)),b.lines.push(E.line-1);continue}let d=o[o.length-1];d.type==="text"&&d.line===c?d.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};Qse.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),i=P(P({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await b3e(e,i),a=DN("result",t,e),l=DN("format",t,e),c=DN("validate",t,e,!0),u=t.isValue.bind(t);return async(g={},f=!1)=>{let h=0;g.required=r,g.items=s,g.keys=o,g.output="";let p=async(B,b,R,H)=>{let L=await c(B,b,R,H);return L===!1?"Invalid field "+R.name:L};for(let B of n){let b=B.value,R=B.key;if(B.type!=="template"){b&&(g.output+=b);continue}if(B.type==="template"){let H=s.find(q=>q.name===R);e.required===!0&&g.required.add(H.name);let L=[H.input,g.values[H.value],H.value,b].find(u),J=(H.field||{}).message||B.inner;if(f){let q=await p(g.values[R],g,H,h);if(q&&typeof q=="string"||q===!1){g.invalid.set(R,q);continue}g.invalid.delete(R);let A=await a(g.values[R],g,H,h);g.output+=bse.unstyle(A);continue}H.placeholder=!1;let ne=b;b=await l(b,g,H,h),L!==b?(g.values[R]=L,b=t.styles.typing(L),g.missing.delete(J)):(g.values[R]=void 0,L=`<${J}>`,b=t.styles.primary(L),H.placeholder=!0,g.required.has(R)&&g.missing.add(J)),g.missing.has(J)&&g.validating&&(b=t.styles.warning(L)),g.invalid.has(R)&&g.validating&&(b=t.styles.danger(L)),h===g.index&&(ne!==b?b=t.styles.underline(b):b=t.styles.heading(bse.unstyle(b))),h++}b&&(g.output+=b)}let d=g.output.split(` +`).map(B=>" "+B),m=s.length,E=0;for(let B of s)g.invalid.has(B.name)&&B.lines.forEach(b=>{d[b][0]===" "&&(d[b]=g.styles.danger(g.symbols.bullet)+d[b].slice(1))}),t.isValue(g.values[B.name])&&E++;return g.completed=(E/m*100).toFixed(0),g.output=d.join(` +`),g.output}};function DN(t,e,r,i){return(n,s,o,a)=>typeof o.field[t]=="function"?o.field[t].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var Pse=I((qCt,xse)=>{"use strict";var v3e=js(),S3e=Sse(),x3e=sf(),kse=class extends x3e{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await S3e(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:i,size:n}=this.state,s=[this.options.newline,` +`].find(B=>B!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=r[e]||"",d=await this.format(p),m=await this.footer();d&&(c+=" "+d),f&&!d&&this.state.completed===0&&(c+=" "+f),this.clear(n);let E=[u,c,h,m,g.trim()];this.write(E.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:r,keys:i,index:n}=this.state,s=r.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} +`;return this.state.error=a,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let o=v3e.unstyle(i).split(` +`).map(a=>a.slice(1)).join(` +`);return this.value={values:n,result:o},super.submit()}};xse.exports=kse});var Fse=I((JCt,Dse)=>{"use strict";var k3e="(Use + to sort)",P3e=GA(),Rse=class extends P3e{constructor(e){super(_(P({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,k3e].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let i=await super.renderChoice(e,r),n=this.symbols.identicalTo+" ",s=this.index===r&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${r+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Dse.exports=Rse});var Tse=I((WCt,Nse)=>{"use strict";var D3e=sC(),Lse=class extends D3e{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(i=>this.styles.muted(i)),this.state.header=r.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let i of r)i.scale=R3e(5,this.options),i.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],i=r.selected;return e.scale.forEach(n=>n.selected=!1),r.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=b=>(b?this.styles.success("\u25C9"):"\u25EF")+o,u=r+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,r),h=this.indent(e),p=h+e.scale.map((b,R)=>c(R===e.scaleIdx)).join(a),d=b=>b===e.scaleIdx?g(b):b,m=h+e.scale.map((b,R)=>d(R)).join(l),E=()=>[u,f].filter(Boolean).join(" "),B=()=>[E(),p,m," "].filter(Boolean).join(` +`);return i&&(p=this.styles.cyan(p),m=this.styles.cyan(m)),B()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` +`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([o,a,u,g].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function R3e(t,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>P({},i));let r=[];for(let i=1;i{Mse.exports=kN()});var Hse=I((VCt,Kse)=>{"use strict";var F3e=K0(),Use=class extends F3e{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([r,c,l].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Kse.exports=Use});var Yse=I((_Ct,Gse)=>{"use strict";var N3e=GA(),jse=class extends N3e{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let i=await super.toChoices(e,r);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Gse.exports=jse});var Jse=I(RN=>{"use strict";var qse=Mi(),ti=(t,e)=>{qse.defineExport(RN,t,e),qse.defineExport(RN,t.toLowerCase(),e)};ti("AutoComplete",()=>Nne());ti("BasicAuth",()=>Gne());ti("Confirm",()=>Wne());ti("Editable",()=>_ne());ti("Form",()=>O0());ti("Input",()=>kN());ti("Invisible",()=>ose());ti("List",()=>lse());ti("MultiSelect",()=>gse());ti("Numeral",()=>dse());ti("Password",()=>Ise());ti("Scale",()=>Bse());ti("Select",()=>GA());ti("Snippet",()=>Pse());ti("Sort",()=>Fse());ti("Survey",()=>Tse());ti("Text",()=>Ose());ti("Toggle",()=>Hse());ti("Quiz",()=>Yse())});var zse=I((ZCt,Wse)=>{Wse.exports={ArrayPrompt:sC(),AuthPrompt:xN(),BooleanPrompt:K0(),NumberPrompt:PN(),StringPrompt:Mc()}});var aC=I(($Ct,Vse)=>{"use strict";var _se=require("assert"),FN=require("events"),jA=Mi(),No=class extends FN{constructor(e,r){super();this.options=jA.merge({},e),this.answers=P({},r)}register(e,r){if(jA.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}_se.equal(typeof r,"function","expected a function");let i=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[i]=r:this.prompts[i]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(jA.merge({},this.options,r))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=jA.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=jA;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];_se(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](r),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),r.autofill&&l!=null?(a.value=a.input=l,r.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||sf()}static get prompts(){return Jse()}static get types(){return zse()}static get prompt(){let e=(r,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(r)};return jA.mixinEmitter(e,new FN),e}};jA.mixinEmitter(No,new FN);var NN=No.prompts;for(let t of Object.keys(NN)){let e=t.toLowerCase(),r=i=>new NN[t](i).run();No.prompt[e]=r,No[e]=r,No[t]||Reflect.defineProperty(No,t,{get:()=>NN[t]})}var oC=t=>{jA.defineExport(No,t,()=>No.types[t])};oC("ArrayPrompt");oC("AuthPrompt");oC("BooleanPrompt");oC("NumberPrompt");oC("StringPrompt");Vse.exports=No});var loe=I((Gmt,Aoe)=>{function K3e(t,e){for(var r=-1,i=t==null?0:t.length;++r{var U3e=XB(),H3e=jg();function G3e(t,e,r,i){var n=!r;r||(r={});for(var s=-1,o=e.length;++s{var j3e=Af(),Y3e=zg();function q3e(t,e){return t&&j3e(e,Y3e(e),t)}uoe.exports=q3e});var hoe=I((qmt,foe)=>{function J3e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}foe.exports=J3e});var doe=I((Jmt,poe)=>{var W3e=Gs(),z3e=u0(),V3e=hoe(),_3e=Object.prototype,X3e=_3e.hasOwnProperty;function Z3e(t){if(!W3e(t))return V3e(t);var e=z3e(t),r=[];for(var i in t)i=="constructor"&&(e||!X3e.call(t,i))||r.push(i);return r}poe.exports=Z3e});var lf=I((Wmt,Coe)=>{var $3e=bF(),eWe=doe(),tWe=Hd();function rWe(t){return tWe(t)?$3e(t,!0):eWe(t)}Coe.exports=rWe});var Ioe=I((zmt,moe)=>{var iWe=Af(),nWe=lf();function sWe(t,e){return t&&iWe(e,nWe(e),t)}moe.exports=sWe});var UN=I((hC,cf)=>{var oWe=Ks(),Eoe=typeof hC=="object"&&hC&&!hC.nodeType&&hC,yoe=Eoe&&typeof cf=="object"&&cf&&!cf.nodeType&&cf,aWe=yoe&&yoe.exports===Eoe,woe=aWe?oWe.Buffer:void 0,Boe=woe?woe.allocUnsafe:void 0;function AWe(t,e){if(e)return t.slice();var r=t.length,i=Boe?Boe(r):new t.constructor(r);return t.copy(i),i}cf.exports=AWe});var HN=I((Vmt,Qoe)=>{function lWe(t,e){var r=-1,i=t.length;for(e||(e=Array(i));++r{var cWe=Af(),uWe=f0();function gWe(t,e){return cWe(t,uWe(t),e)}boe.exports=gWe});var H0=I((Xmt,Soe)=>{var fWe=vF(),hWe=fWe(Object.getPrototypeOf,Object);Soe.exports=hWe});var GN=I((Zmt,xoe)=>{var pWe=$B(),dWe=H0(),CWe=f0(),mWe=RF(),IWe=Object.getOwnPropertySymbols,EWe=IWe?function(t){for(var e=[];t;)pWe(e,CWe(t)),t=dWe(t);return e}:mWe;xoe.exports=EWe});var Poe=I(($mt,koe)=>{var yWe=Af(),wWe=GN();function BWe(t,e){return yWe(t,wWe(t),e)}koe.exports=BWe});var Roe=I((eIt,Doe)=>{var QWe=DF(),bWe=GN(),vWe=lf();function SWe(t){return QWe(t,vWe,bWe)}Doe.exports=SWe});var Noe=I((tIt,Foe)=>{var xWe=Object.prototype,kWe=xWe.hasOwnProperty;function PWe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&kWe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Foe.exports=PWe});var G0=I((rIt,Loe)=>{var Toe=kF();function DWe(t){var e=new t.constructor(t.byteLength);return new Toe(e).set(new Toe(t)),e}Loe.exports=DWe});var Ooe=I((iIt,Moe)=>{var RWe=G0();function FWe(t,e){var r=e?RWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Moe.exports=FWe});var Uoe=I((nIt,Koe)=>{var NWe=/\w*$/;function LWe(t){var e=new t.constructor(t.source,NWe.exec(t));return e.lastIndex=t.lastIndex,e}Koe.exports=LWe});var qoe=I((sIt,Hoe)=>{var Goe=ac(),joe=Goe?Goe.prototype:void 0,Yoe=joe?joe.valueOf:void 0;function TWe(t){return Yoe?Object(Yoe.call(t)):{}}Hoe.exports=TWe});var jN=I((oIt,Joe)=>{var MWe=G0();function OWe(t,e){var r=e?MWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Joe.exports=OWe});var zoe=I((aIt,Woe)=>{var KWe=G0(),UWe=Ooe(),HWe=Uoe(),GWe=qoe(),jWe=jN(),YWe="[object Boolean]",qWe="[object Date]",JWe="[object Map]",WWe="[object Number]",zWe="[object RegExp]",VWe="[object Set]",_We="[object String]",XWe="[object Symbol]",ZWe="[object ArrayBuffer]",$We="[object DataView]",e8e="[object Float32Array]",t8e="[object Float64Array]",r8e="[object Int8Array]",i8e="[object Int16Array]",n8e="[object Int32Array]",s8e="[object Uint8Array]",o8e="[object Uint8ClampedArray]",a8e="[object Uint16Array]",A8e="[object Uint32Array]";function l8e(t,e,r){var i=t.constructor;switch(e){case ZWe:return KWe(t);case YWe:case qWe:return new i(+t);case $We:return UWe(t,r);case e8e:case t8e:case r8e:case i8e:case n8e:case s8e:case o8e:case a8e:case A8e:return jWe(t,r);case JWe:return new i;case WWe:case _We:return new i(t);case zWe:return HWe(t);case VWe:return new i;case XWe:return GWe(t)}}Woe.exports=l8e});var Xoe=I((AIt,Voe)=>{var c8e=Gs(),_oe=Object.create,u8e=function(){function t(){}return function(e){if(!c8e(e))return{};if(_oe)return _oe(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();Voe.exports=u8e});var YN=I((lIt,Zoe)=>{var g8e=Xoe(),f8e=H0(),h8e=u0();function p8e(t){return typeof t.constructor=="function"&&!h8e(t)?g8e(f8e(t)):{}}Zoe.exports=p8e});var eae=I((cIt,$oe)=>{var d8e=jd(),C8e=Qo(),m8e="[object Map]";function I8e(t){return C8e(t)&&d8e(t)==m8e}$oe.exports=I8e});var nae=I((uIt,tae)=>{var E8e=eae(),y8e=A0(),rae=l0(),iae=rae&&rae.isMap,w8e=iae?y8e(iae):E8e;tae.exports=w8e});var oae=I((gIt,sae)=>{var B8e=jd(),Q8e=Qo(),b8e="[object Set]";function v8e(t){return Q8e(t)&&B8e(t)==b8e}sae.exports=v8e});var cae=I((fIt,aae)=>{var S8e=oae(),x8e=A0(),Aae=l0(),lae=Aae&&Aae.isSet,k8e=lae?x8e(lae):S8e;aae.exports=k8e});var pae=I((hIt,uae)=>{var P8e=Gd(),D8e=loe(),R8e=XB(),F8e=goe(),N8e=Ioe(),L8e=UN(),T8e=HN(),M8e=voe(),O8e=Poe(),K8e=FF(),U8e=Roe(),H8e=jd(),G8e=Noe(),j8e=zoe(),Y8e=YN(),q8e=As(),J8e=Od(),W8e=nae(),z8e=Gs(),V8e=cae(),_8e=zg(),X8e=lf(),Z8e=1,$8e=2,eze=4,gae="[object Arguments]",tze="[object Array]",rze="[object Boolean]",ize="[object Date]",nze="[object Error]",fae="[object Function]",sze="[object GeneratorFunction]",oze="[object Map]",aze="[object Number]",hae="[object Object]",Aze="[object RegExp]",lze="[object Set]",cze="[object String]",uze="[object Symbol]",gze="[object WeakMap]",fze="[object ArrayBuffer]",hze="[object DataView]",pze="[object Float32Array]",dze="[object Float64Array]",Cze="[object Int8Array]",mze="[object Int16Array]",Ize="[object Int32Array]",Eze="[object Uint8Array]",yze="[object Uint8ClampedArray]",wze="[object Uint16Array]",Bze="[object Uint32Array]",rr={};rr[gae]=rr[tze]=rr[fze]=rr[hze]=rr[rze]=rr[ize]=rr[pze]=rr[dze]=rr[Cze]=rr[mze]=rr[Ize]=rr[oze]=rr[aze]=rr[hae]=rr[Aze]=rr[lze]=rr[cze]=rr[uze]=rr[Eze]=rr[yze]=rr[wze]=rr[Bze]=!0;rr[nze]=rr[fae]=rr[gze]=!1;function j0(t,e,r,i,n,s){var o,a=e&Z8e,l=e&$8e,c=e&eze;if(r&&(o=n?r(t,i,n,s):r(t)),o!==void 0)return o;if(!z8e(t))return t;var u=q8e(t);if(u){if(o=G8e(t),!a)return T8e(t,o)}else{var g=H8e(t),f=g==fae||g==sze;if(J8e(t))return L8e(t,a);if(g==hae||g==gae||f&&!n){if(o=l||f?{}:Y8e(t),!a)return l?O8e(t,N8e(o,t)):M8e(t,F8e(o,t))}else{if(!rr[g])return n?t:{};o=j8e(t,g,a)}}s||(s=new P8e);var h=s.get(t);if(h)return h;s.set(t,o),V8e(t)?t.forEach(function(m){o.add(j0(m,e,r,m,t,s))}):W8e(t)&&t.forEach(function(m,E){o.set(E,j0(m,e,r,E,t,s))});var p=c?l?U8e:K8e:l?X8e:_8e,d=u?void 0:p(t);return D8e(d||t,function(m,E){d&&(E=m,m=t[E]),R8e(o,E,j0(m,e,r,E,t,s))}),o}uae.exports=j0});var qN=I((pIt,dae)=>{var Qze=pae(),bze=1,vze=4;function Sze(t){return Qze(t,bze|vze)}dae.exports=Sze});var mae=I((dIt,Cae)=>{var xze=tF();function kze(t,e,r){return t==null?t:xze(t,e,r)}Cae.exports=kze});var Qae=I((wIt,Bae)=>{function Pze(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}Bae.exports=Pze});var vae=I((BIt,bae)=>{var Dze=xd(),Rze=zP();function Fze(t,e){return e.length<2?t:Dze(t,Rze(e,0,-1))}bae.exports=Fze});var xae=I((QIt,Sae)=>{var Nze=Gg(),Lze=Qae(),Tze=vae(),Mze=Sc();function Oze(t,e){return e=Nze(e,t),t=Tze(t,e),t==null||delete t[Mze(Lze(e))]}Sae.exports=Oze});var Pae=I((bIt,kae)=>{var Kze=xae();function Uze(t,e){return t==null?!0:Kze(t,e)}kae.exports=Uze});var Kae=I((tEt,Oae)=>{Oae.exports={name:"@yarnpkg/cli",version:"3.1.0",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.0.1",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2",typescript:"^4.4.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var iL=I((SBt,QAe)=>{"use strict";QAe.exports=function(e,r){r===!0&&(r=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof r=="number"?n[r]:n}});var nL=I((xBt,bAe)=>{"use strict";var s4e=iL();function vAe(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=s4e(t);return t=t.substring(t.indexOf("://")+3),vAe(e)?!0:t.indexOf("@"){"use strict";var o4e=iL(),a4e=nL(),A4e=require("querystring");function l4e(t){t=(t||"").trim();var e={protocols:o4e(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},r=t.indexOf("://"),i=-1,n=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var o=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(a4e(t)?e.protocol="ssh":((o==="/"||o==="~")&&(t=t.substring(2)),e.protocol="file"))),r!==-1&&(t=t.substring(r+3)),s=t.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=A4e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}SAe.exports=l4e});var DAe=I((PBt,kAe)=>{"use strict";var c4e=typeof URL=="undefined"?require("url").URL:URL,PAe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t);kAe.exports=(t,e)=>{e=Object.assign({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripHash:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps")&&(e.forceHttp=e.normalizeHttps),Reflect.has(e,"normalizeHttp")&&(e.forceHttps=e.normalizeHttp),Reflect.has(e,"stripFragment")&&(e.stripHash=e.stripFragment),t=t.trim();let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new c4e(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?![https?:]).)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];PAe(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])PAe(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}});var FAe=I((DBt,RAe)=>{"use strict";var u4e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},g4e=xAe(),f4e=DAe();function h4e(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof t!="string"||!t.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":u4e(e))!=="object"&&(e={stripFragment:!1}),t=f4e(t,e));var r=g4e(t);return r}RAe.exports=h4e});var TAe=I((RBt,NAe)=>{"use strict";var p4e=FAe(),LAe=nL();function d4e(t){var e=p4e(t);e.token="";var r=e.user.split(":");return r.length===2&&(r[1]==="x-oauth-basic"?e.token=r[0]:r[0]==="x-token-auth"&&(e.token=r[1])),LAe(e.protocols)||LAe(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}NAe.exports=d4e});var OAe=I((FBt,MAe)=>{"use strict";var C4e=TAe();function sL(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=C4e(t),r=e.resource.split("."),i=null;switch(e.toString=function(l){return sL.stringify(this,l)},e.source=r.length>2?r.slice(1-r.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=r[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}sL.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",i=t.user||"git",n=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+i+"@"+t.resource+r+"/"+t.full_name+n:i+"@"+t.resource+":"+t.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+t.resource+r+"/"+t.full_name+n;case"http":case"https":var s=t.token?m4e(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+s+t.resource+r+"/"+t.full_name+n;default:return t.href}};function m4e(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}MAe.exports=sL});var NL=I((Obt,ole)=>{var M4e=jg(),O4e=Kg();function K4e(t,e,r){(r!==void 0&&!O4e(t[e],r)||r===void 0&&!(e in t))&&M4e(t,e,r)}ole.exports=K4e});var Ale=I((Kbt,ale)=>{var U4e=Hd(),H4e=Qo();function G4e(t){return H4e(t)&&U4e(t)}ale.exports=G4e});var ule=I((Ubt,lle)=>{var j4e=Ac(),Y4e=H0(),q4e=Qo(),J4e="[object Object]",W4e=Function.prototype,z4e=Object.prototype,cle=W4e.toString,V4e=z4e.hasOwnProperty,_4e=cle.call(Object);function X4e(t){if(!q4e(t)||j4e(t)!=J4e)return!1;var e=Y4e(t);if(e===null)return!0;var r=V4e.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&cle.call(r)==_4e}lle.exports=X4e});var LL=I((Hbt,gle)=>{function Z4e(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}gle.exports=Z4e});var hle=I((Gbt,fle)=>{var $4e=Af(),e5e=lf();function t5e(t){return $4e(t,e5e(t))}fle.exports=t5e});var Ele=I((jbt,ple)=>{var dle=NL(),r5e=UN(),i5e=jN(),n5e=HN(),s5e=YN(),Cle=Pd(),mle=As(),o5e=Ale(),a5e=Od(),A5e=zB(),l5e=Gs(),c5e=ule(),u5e=c0(),Ile=LL(),g5e=hle();function f5e(t,e,r,i,n,s,o){var a=Ile(t,r),l=Ile(e,r),c=o.get(l);if(c){dle(t,r,c);return}var u=s?s(a,l,r+"",t,e,o):void 0,g=u===void 0;if(g){var f=mle(l),h=!f&&a5e(l),p=!f&&!h&&u5e(l);u=l,f||h||p?mle(a)?u=a:o5e(a)?u=n5e(a):h?(g=!1,u=r5e(l,!0)):p?(g=!1,u=i5e(l,!0)):u=[]:c5e(l)||Cle(l)?(u=a,Cle(a)?u=g5e(a):(!l5e(a)||A5e(a))&&(u=s5e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),dle(t,r,u)}ple.exports=f5e});var Ble=I((Ybt,yle)=>{var h5e=Gd(),p5e=NL(),d5e=BF(),C5e=Ele(),m5e=Gs(),I5e=lf(),E5e=LL();function wle(t,e,r,i,n){t!==e&&d5e(e,function(s,o){if(n||(n=new h5e),m5e(s))C5e(t,e,o,r,wle,i,n);else{var a=i?i(E5e(t,o),s,o+"",t,e,n):void 0;a===void 0&&(a=s),p5e(t,o,a)}},I5e)}yle.exports=wle});var ble=I((qbt,Qle)=>{var y5e=e0(),w5e=nF(),B5e=sF();function Q5e(t,e){return B5e(w5e(t,e,y5e),t+"")}Qle.exports=Q5e});var Sle=I((Jbt,vle)=>{var b5e=Kg(),v5e=Hd(),S5e=kd(),x5e=Gs();function k5e(t,e,r){if(!x5e(r))return!1;var i=typeof e;return(i=="number"?v5e(r)&&S5e(e,r.length):i=="string"&&e in r)?b5e(r[e],t):!1}vle.exports=k5e});var kle=I((Wbt,xle)=>{var P5e=ble(),D5e=Sle();function R5e(t){return P5e(function(e,r){var i=-1,n=r.length,s=n>1?r[n-1]:void 0,o=n>2?r[2]:void 0;for(s=t.length>3&&typeof s=="function"?(n--,s):void 0,o&&D5e(r[0],r[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var F5e=Ble(),N5e=kle(),L5e=N5e(function(t,e,r){F5e(t,e,r)});Ple.exports=L5e});var Wle=I(($vt,Jle)=>{var VL;Jle.exports=()=>(typeof VL=="undefined"&&(VL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),VL)});var $le=I(XL=>{function pf(t,e){if(typeof t=="string")return t;if(t){let r,i;if(Array.isArray(t)){for(r=0;r0)return(f=pf(n[g],u))?f.replace("*",c.substring(g.length-1)):Gc(i,c,1)}return Gc(i,c)}}function l6e(t,e={}){let r=0,i,n=e.browser,s=e.fields||["module","main"];for(n&&!s.includes("browser")&&s.unshift("browser");r{var eT;nce.exports=()=>(typeof eT=="undefined"&&(eT=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),eT)});var gce=I((aT,AT)=>{(function(t){aT&&typeof aT=="object"&&typeof AT!="undefined"?AT.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window!="undefined"?window.isWindows=t():typeof global!="undefined"?global.isWindows=t():typeof self!="undefined"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var dce=I((Dxt,fce)=>{"use strict";lT.ifExists=I6e;var mf=require("util"),Is=require("path"),hce=gce(),E6e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,y6e={createPwshFile:!0,createCmdFile:hce(),fs:require("fs")},w6e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function pce(t){let e=P(P({},y6e),t),r=e.fs;return e.fs_={chmod:r.chmod?mf.promisify(r.chmod):async()=>{},mkdir:mf.promisify(r.mkdir),readFile:mf.promisify(r.readFile),stat:mf.promisify(r.stat),unlink:mf.promisify(r.unlink),writeFile:mf.promisify(r.writeFile)},e}async function lT(t,e,r){let i=pce(r);await i.fs_.stat(t),await B6e(t,e,i)}function I6e(t,e,r){return lT(t,e,r).catch(()=>{})}function Q6e(t,e){return e.fs_.unlink(t).catch(()=>{})}async function B6e(t,e,r){let i=await S6e(t,r);return await b6e(e,r),v6e(t,e,i,r)}function b6e(t,e){return e.fs_.mkdir(Is.dirname(t),{recursive:!0})}function v6e(t,e,r,i){let n=pce(i),s=[{generator:P6e,extension:""}];return n.createCmdFile&&s.push({generator:k6e,extension:".cmd"}),n.createPwshFile&&s.push({generator:D6e,extension:".ps1"}),Promise.all(s.map(o=>x6e(t,e+o.extension,r,o.generator,n)))}function R6e(t,e){return Q6e(t,e)}function N6e(t,e){return F6e(t,e)}async function S6e(t,e){let n=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(E6e);if(!n){let s=Is.extname(t).toLowerCase();return{program:w6e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function x6e(t,e,r,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[r.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:r.program,args:o}),await R6e(e,n),await n.fs_.writeFile(e,i(t,e,n),"utf8"),N6e(e,n)}function k6e(t,e,r){let n=Is.relative(Is.dirname(e),t).split("/").join("\\"),s=Is.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=r.prog,l=r.args||"",c=cT(r.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=r.progArgs?`${r.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r +`:"";return o?g+=`@IF EXIST ${o} (\r + ${o} ${l} ${n} ${u}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${a} ${l} ${n} ${u}%*\r +)\r +`:g+=`@${a} ${l} ${n} ${u}%*\r +`,g}function P6e(t,e,r){let i=Is.relative(Is.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=Is.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=r.args||"",l=cT(r.nodePath).posix;n?(s=`"$basedir/${r.prog}"`,i=o):(n=o,a="",i="");let c=r.progArgs?`${r.progArgs.join(" ")} `:"",u=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,g=r.nodePath?`export NODE_PATH="${l}" +`:"";return s?u+=`${g}if [ -x ${s} ]; then + exec ${s} ${a} ${i} ${c}"$@" +else + exec ${n} ${a} ${i} ${c}"$@" +fi +`:u+=`${g}${n} ${a} ${i} ${c}"$@" +exit $? +`,u}function D6e(t,e,r){let i=Is.relative(Is.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=Is.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=r.args||"",c=cT(r.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${r.prog}$exe"`,i=a):(s=a,l="",i="");let f=r.progArgs?`${r.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${u}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return r.nodePath&&(h+=` else { + $env:NODE_PATH="${g}" +}`),o?h+=` +$ret=0 +if (Test-Path ${o}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${o} ${l} ${i} ${f}$args + } else { + & ${o} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args + } else { + & ${s} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:h+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args +} else { + & ${s} ${l} ${i} ${f}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,h}function F6e(t,e){return e.fs_.chmod(t,493)}function cT(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Is.delimiter):Array.from(t),r={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${s}`:s,r[i]={win32:n,posix:s}}return r}fce.exports=lT});var PT=I((fPt,Nce)=>{Nce.exports=require("stream")});var Oce=I((hPt,Lce)=>{"use strict";function Tce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function e9e(t){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(r){var i={data:r,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=r+i.data;return n}},{key:"concat",value:function(r){if(this.length===0)return iQ.alloc(0);for(var i=iQ.allocUnsafe(r>>>0),n=this.head,s=0;n;)o9e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(r,i){var n;return ro.length?o.length:r;if(a===o.length?s+=o:s+=o.slice(0,r),r-=a,r===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(r){var i=iQ.allocUnsafe(r),n=this.head,s=1;for(n.data.copy(i),r-=n.data.length;n=n.next;){var o=n.data,a=r>o.length?o.length:r;if(o.copy(i,i.length-r,0,a),r-=a,r===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:s9e,value:function(r,i){return DT(this,e9e({},i,{depth:0,customInspect:!1}))}}]),t}()});var FT=I((pPt,Kce)=>{"use strict";function a9e(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(RT,this,t)):process.nextTick(RT,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(s){!e&&s?r._writableState?r._writableState.errorEmitted?process.nextTick(nQ,r):(r._writableState.errorEmitted=!0,process.nextTick(Uce,r,s)):process.nextTick(Uce,r,s):e?(process.nextTick(nQ,r),e(s)):process.nextTick(nQ,r)}),this)}function Uce(t,e){RT(t,e),nQ(t)}function nQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function A9e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function RT(t,e){t.emit("error",e)}function l9e(t,e){var r=t._readableState,i=t._writableState;r&&r.autoDestroy||i&&i.autoDestroy?t.destroy(e):t.emit("error",e)}Kce.exports={destroy:a9e,undestroy:A9e,errorOrDestroy:l9e}});var VA=I((dPt,Hce)=>{"use strict";var Gce={};function Es(t,e,r){r||(r=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends r{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=r.name,n.prototype.code=t,Gce[t]=n}function jce(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(i=>String(i)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function c9e(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function u9e(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function g9e(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Es("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Es("ERR_INVALID_ARG_TYPE",function(t,e,r){let i;typeof e=="string"&&c9e(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(u9e(t," argument"))n=`The ${t} ${i} ${jce(e,"type")}`;else{let s=g9e(t,".")?"property":"argument";n=`The "${t}" ${s} ${i} ${jce(e,"type")}`}return n+=`. Received type ${typeof r}`,n},TypeError);Es("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Es("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Es("ERR_STREAM_PREMATURE_CLOSE","Premature close");Es("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Es("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Es("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Es("ERR_STREAM_WRITE_AFTER_END","write after end");Es("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Es("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Es("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");Hce.exports.codes=Gce});var NT=I((CPt,Yce)=>{"use strict";var f9e=VA().codes.ERR_INVALID_OPT_VALUE;function h9e(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function p9e(t,e,r,i){var n=h9e(e,i,r);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?r:"highWaterMark";throw new f9e(s,n)}return Math.floor(n)}return t.objectMode?16:16*1024}Yce.exports={getHighWaterMark:p9e}});var qce=I((mPt,LT)=>{typeof Object.create=="function"?LT.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:LT.exports=function(e,r){if(r){e.super_=r;var i=function(){};i.prototype=r.prototype,e.prototype=new i,e.prototype.constructor=e}}});var _A=I((IPt,TT)=>{try{if(MT=require("util"),typeof MT.inherits!="function")throw"";TT.exports=MT.inherits}catch(t){TT.exports=qce()}var MT});var Wce=I((EPt,Jce)=>{Jce.exports=require("util").deprecate});var UT=I((yPt,zce)=>{"use strict";zce.exports=Sr;function Vce(t){var e=this;this.next=null,this.entry=null,this.finish=function(){d9e(e,t)}}var Ef;Sr.WritableState=em;var C9e={deprecate:Wce()},_ce=PT(),sQ=require("buffer").Buffer,m9e=global.Uint8Array||function(){};function I9e(t){return sQ.from(t)}function E9e(t){return sQ.isBuffer(t)||t instanceof m9e}var OT=FT(),y9e=NT(),w9e=y9e.getHighWaterMark,XA=VA().codes,B9e=XA.ERR_INVALID_ARG_TYPE,Q9e=XA.ERR_METHOD_NOT_IMPLEMENTED,b9e=XA.ERR_MULTIPLE_CALLBACK,v9e=XA.ERR_STREAM_CANNOT_PIPE,S9e=XA.ERR_STREAM_DESTROYED,x9e=XA.ERR_STREAM_NULL_VALUES,k9e=XA.ERR_STREAM_WRITE_AFTER_END,P9e=XA.ERR_UNKNOWN_ENCODING,yf=OT.errorOrDestroy;_A()(Sr,_ce);function D9e(){}function em(t,e,r){Ef=Ef||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof Ef),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=w9e(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=t.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){R9e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Vce(this)}em.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(em.prototype,"buffer",{get:C9e.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}})();var oQ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(oQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Sr,Symbol.hasInstance,{value:function(e){return oQ.call(this,e)?!0:this!==Sr?!1:e&&e._writableState instanceof em}})):oQ=function(e){return e instanceof this};function Sr(t){Ef=Ef||Yc();var e=this instanceof Ef;if(!e&&!oQ.call(Sr,this))return new Sr(t);this._writableState=new em(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),_ce.call(this)}Sr.prototype.pipe=function(){yf(this,new v9e)};function F9e(t,e){var r=new k9e;yf(t,r),process.nextTick(e,r)}function N9e(t,e,r,i){var n;return r===null?n=new x9e:typeof r!="string"&&!e.objectMode&&(n=new B9e("chunk",["string","Buffer"],r)),n?(yf(t,n),process.nextTick(i,n),!1):!0}Sr.prototype.write=function(t,e,r){var i=this._writableState,n=!1,s=!i.objectMode&&E9e(t);return s&&!sQ.isBuffer(t)&&(t=I9e(t)),typeof e=="function"&&(r=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof r!="function"&&(r=D9e),i.ending?F9e(this,r):(s||N9e(this,i,t,r))&&(i.pendingcb++,n=L9e(this,i,s,t,e,r)),n};Sr.prototype.cork=function(){this._writableState.corked++};Sr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Xce(this,t))};Sr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new P9e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Sr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function T9e(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=sQ.from(e,r)),e}Object.defineProperty(Sr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function L9e(t,e,r,i,n,s){if(!r){var o=T9e(e,i,n);i!==o&&(r=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var j9e=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};eue.exports=Mo;var tue=HT(),GT=UT();_A()(Mo,tue);for(jT=j9e(GT.prototype),aQ=0;aQ{var lQ=require("buffer"),qa=lQ.Buffer;function iue(t,e){for(var r in t)e[r]=t[r]}qa.from&&qa.alloc&&qa.allocUnsafe&&qa.allocUnsafeSlow?rue.exports=lQ:(iue(lQ,YT),YT.Buffer=wf);function wf(t,e,r){return qa(t,e,r)}iue(qa,wf);wf.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return qa(t,e,r)};wf.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=qa(t);return e!==void 0?typeof r=="string"?i.fill(e,r):i.fill(e):i.fill(0),i};wf.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return qa(t)};wf.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return lQ.SlowBuffer(t)}});var WT=I(sue=>{"use strict";var qT=nue().Buffer,oue=qT.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function J9e(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function W9e(t){var e=J9e(t);if(typeof e!="string"&&(qT.isEncoding===oue||!oue(t)))throw new Error("Unknown encoding: "+t);return e||t}sue.StringDecoder=rm;function rm(t){this.encoding=W9e(t);var e;switch(this.encoding){case"utf16le":this.text=V9e,this.end=_9e,e=4;break;case"utf8":this.fillLast=z9e,e=4;break;case"base64":this.text=X9e,this.end=Z9e,e=3;break;default:this.write=$9e,this.end=e7e;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=qT.allocUnsafe(e)}rm.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function i7e(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:t.lastNeed=n-3),n):0))}function n7e(t,e,r){if((e[0]&192)!=128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return t.lastNeed=2,"\uFFFD"}}function z9e(t){var e=this.lastTotal-this.lastNeed,r=n7e(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function r7e(t,e){var r=i7e(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function t7e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function V9e(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function _9e(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function X9e(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Z9e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function $9e(t){return t.toString(this.encoding)}function e7e(t){return t&&t.length?this.write(t):""}});var cQ=I((QPt,aue)=>{"use strict";var Aue=VA().codes.ERR_STREAM_PREMATURE_CLOSE;function s7e(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,i=new Array(r),n=0;n{"use strict";var uQ;function ZA(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var A7e=cQ(),$A=Symbol("lastResolve"),qc=Symbol("lastReject"),im=Symbol("error"),gQ=Symbol("ended"),Jc=Symbol("lastPromise"),zT=Symbol("handlePromise"),Wc=Symbol("stream");function el(t,e){return{value:t,done:e}}function l7e(t){var e=t[$A];if(e!==null){var r=t[Wc].read();r!==null&&(t[Jc]=null,t[$A]=null,t[qc]=null,e(el(r,!1)))}}function c7e(t){process.nextTick(l7e,t)}function u7e(t,e){return function(r,i){t.then(function(){if(e[gQ]){r(el(void 0,!0));return}e[zT](r,i)},i)}}var g7e=Object.getPrototypeOf(function(){}),f7e=Object.setPrototypeOf((uQ={get stream(){return this[Wc]},next:function(){var e=this,r=this[im];if(r!==null)return Promise.reject(r);if(this[gQ])return Promise.resolve(el(void 0,!0));if(this[Wc].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[im]?a(e[im]):o(el(void 0,!0))})});var i=this[Jc],n;if(i)n=new Promise(u7e(i,this));else{var s=this[Wc].read();if(s!==null)return Promise.resolve(el(s,!1));n=new Promise(this[zT])}return this[Jc]=n,n}},ZA(uQ,Symbol.asyncIterator,function(){return this}),ZA(uQ,"return",function(){var e=this;return new Promise(function(r,i){e[Wc].destroy(null,function(n){if(n){i(n);return}r(el(void 0,!0))})})}),uQ),g7e),h7e=function(e){var r,i=Object.create(f7e,(r={},ZA(r,Wc,{value:e,writable:!0}),ZA(r,$A,{value:null,writable:!0}),ZA(r,qc,{value:null,writable:!0}),ZA(r,im,{value:null,writable:!0}),ZA(r,gQ,{value:e._readableState.endEmitted,writable:!0}),ZA(r,zT,{value:function(s,o){var a=i[Wc].read();a?(i[Jc]=null,i[$A]=null,i[qc]=null,s(el(a,!1))):(i[$A]=s,i[qc]=o)},writable:!0}),r));return i[Jc]=null,A7e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[qc];s!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,s(n)),i[im]=n;return}var o=i[$A];o!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,o(el(void 0,!0))),i[gQ]=!0}),e.on("readable",c7e.bind(null,i)),i};cue.exports=h7e});var pue=I((vPt,gue)=>{"use strict";function fue(t,e,r,i,n,s,o){try{var a=t[s](o),l=a.value}catch(c){r(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function p7e(t){return function(){var e=this,r=arguments;return new Promise(function(i,n){var s=t.apply(e,r);function o(l){fue(s,i,n,o,a,"next",l)}function a(l){fue(s,i,n,o,a,"throw",l)}o(void 0)})}}function hue(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function C7e(t){for(var e=1;e{"use strict";due.exports=kt;var Bf;kt.ReadableState=Cue;var SPt=require("events").EventEmitter,mue=function(e,r){return e.listeners(r).length},nm=PT(),fQ=require("buffer").Buffer,E7e=global.Uint8Array||function(){};function y7e(t){return fQ.from(t)}function w7e(t){return fQ.isBuffer(t)||t instanceof E7e}var VT=require("util"),It;VT&&VT.debuglog?It=VT.debuglog("stream"):It=function(){};var B7e=Oce(),_T=FT(),Q7e=NT(),b7e=Q7e.getHighWaterMark,hQ=VA().codes,v7e=hQ.ERR_INVALID_ARG_TYPE,S7e=hQ.ERR_STREAM_PUSH_AFTER_EOF,x7e=hQ.ERR_METHOD_NOT_IMPLEMENTED,k7e=hQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Qf,XT,ZT;_A()(kt,nm);var sm=_T.errorOrDestroy,$T=["error","close","destroy","pause","resume"];function P7e(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function Cue(t,e,r){Bf=Bf||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof Bf),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=b7e(this,t,"readableHighWaterMark",r),this.buffer=new B7e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Qf||(Qf=WT().StringDecoder),this.decoder=new Qf(t.encoding),this.encoding=t.encoding)}function kt(t){if(Bf=Bf||Yc(),!(this instanceof kt))return new kt(t);var e=this instanceof Bf;this._readableState=new Cue(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),nm.call(this)}Object.defineProperty(kt.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});kt.prototype.destroy=_T.destroy;kt.prototype._undestroy=_T.undestroy;kt.prototype._destroy=function(t,e){e(t)};kt.prototype.push=function(t,e){var r=this._readableState,i;return r.objectMode?i=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=fQ.from(t,e),e=""),i=!0),Iue(this,t,e,!1,i)};kt.prototype.unshift=function(t){return Iue(this,t,null,!0,!1)};function Iue(t,e,r,i,n){It("readableAddChunk",e);var s=t._readableState;if(e===null)s.reading=!1,R7e(t,s);else{var o;if(n||(o=D7e(s,e)),o)sm(t,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==fQ.prototype&&(e=y7e(e)),i)s.endEmitted?sm(t,new k7e):eM(t,s,e,!0);else if(s.ended)sm(t,new S7e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||e.length!==0?eM(t,s,e,!1):tM(t,s)):eM(t,s,e,!1)}else i||(s.reading=!1,tM(t,s))}return!s.ended&&(s.length=Eue?t=Eue:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function yue(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=F7e(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}kt.prototype.read=function(t){It("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return It("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?rM(this):pQ(this),null;if(t=yue(t,e),t===0&&e.ended)return e.length===0&&rM(this),null;var i=e.needReadable;It("need readable",i),(e.length===0||e.length-t0?n=wue(t,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&rM(this)),n!==null&&this.emit("data",n),n};function R7e(t,e){if(It("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?pQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Bue(t)))}}function pQ(t){var e=t._readableState;It("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(It("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Bue,t))}function Bue(t){var e=t._readableState;It("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,iM(t)}function tM(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(N7e,t,e))}function N7e(t,e){for(;!e.reading&&!e.ended&&(e.length1&&Que(i.pipes,t)!==-1)&&!c&&(It("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function f(m){It("onerror",m),d(),t.removeListener("error",f),mue(t,"error")===0&&sm(t,m)}P7e(t,"error",f);function h(){t.removeListener("finish",p),d()}t.once("close",h);function p(){It("onfinish"),t.removeListener("close",h),d()}t.once("finish",p);function d(){It("unpipe"),r.unpipe(t)}return t.emit("pipe",r),i.flowing||(It("pipe resume"),r.resume()),t};function L7e(t){return function(){var r=t._readableState;It("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&mue(t,"data")&&(r.flowing=!0,iM(t))}}kt.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):t==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,It("on readable",i.length,i.reading),i.length?pQ(this):i.reading||process.nextTick(T7e,this)),r};kt.prototype.addListener=kt.prototype.on;kt.prototype.removeListener=function(t,e){var r=nm.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(bue,this),r};kt.prototype.removeAllListeners=function(t){var e=nm.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(bue,this),e};function bue(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function T7e(t){It("readable nexttick read 0"),t.read(0)}kt.prototype.resume=function(){var t=this._readableState;return t.flowing||(It("resume"),t.flowing=!t.readableListening,M7e(this,t)),t.paused=!1,this};function M7e(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(O7e,t,e))}function O7e(t,e){It("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),iM(t),e.flowing&&!e.reading&&t.read(0)}kt.prototype.pause=function(){return It("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(It("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function iM(t){var e=t._readableState;for(It("flow",e.flowing);e.flowing&&t.read()!==null;);}kt.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;t.on("end",function(){if(It("wrapped end"),r.decoder&&!r.ended){var o=r.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on("data",function(o){if(It("wrapped data"),r.decoder&&(o=r.decoder.write(o)),!(r.objectMode&&o==null)&&!(!r.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,t.pause())}});for(var n in t)this[n]===void 0&&typeof t[n]=="function"&&(this[n]=function(a){return function(){return t[a].apply(t,arguments)}}(n));for(var s=0;s<$T.length;s++)t.on($T[s],this.emit.bind(this,$T[s]));return this._read=function(o){It("wrapped _read",o),i&&(i=!1,t.resume())},this};typeof Symbol=="function"&&(kt.prototype[Symbol.asyncIterator]=function(){return XT===void 0&&(XT=uue()),XT(this)});Object.defineProperty(kt.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(kt.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(kt.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});kt._fromList=wue;Object.defineProperty(kt.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function wue(t,e){if(e.length===0)return null;var r;return e.objectMode?r=e.buffer.shift():!t||t>=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function rM(t){var e=t._readableState;It("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(K7e,e,t))}function K7e(t,e){if(It("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(kt.from=function(t,e){return ZT===void 0&&(ZT=pue()),ZT(kt,t,e)});function Que(t,e){for(var r=0,i=t.length;r{"use strict";vue.exports=Ja;var dQ=VA().codes,U7e=dQ.ERR_METHOD_NOT_IMPLEMENTED,H7e=dQ.ERR_MULTIPLE_CALLBACK,G7e=dQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,j7e=dQ.ERR_TRANSFORM_WITH_LENGTH_0,CQ=Yc();_A()(Ja,CQ);function Y7e(t,e){var r=this._transformState;r.transforming=!1;var i=r.writecb;if(i===null)return this.emit("error",new H7e);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),i(t);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";xue.exports=om;var kue=nM();_A()(om,kue);function om(t){if(!(this instanceof om))return new om(t);kue.call(this,t)}om.prototype._transform=function(t,e,r){r(null,t)}});var Lue=I((DPt,Due)=>{"use strict";var sM;function J7e(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Rue=VA().codes,W7e=Rue.ERR_MISSING_ARGS,z7e=Rue.ERR_STREAM_DESTROYED;function Fue(t){if(t)throw t}function V7e(t){return t.setHeader&&typeof t.abort=="function"}function _7e(t,e,r,i){i=J7e(i);var n=!1;t.on("close",function(){n=!0}),sM===void 0&&(sM=cQ()),sM(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,V7e(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();i(o||new z7e("pipe"))}}}function Nue(t){t()}function X7e(t,e){return t.pipe(e)}function Z7e(t){return!t.length||typeof t[t.length-1]!="function"?Fue:t.pop()}function $7e(){for(var t=arguments.length,e=new Array(t),r=0;r0;return _7e(o,l,c,function(u){n||(n=u),u&&s.forEach(Nue),!l&&(s.forEach(Nue),i(n))})});return e.reduce(X7e)}Due.exports=$7e});var bf=I((ys,am)=>{var Am=require("stream");process.env.READABLE_STREAM==="disable"&&Am?(am.exports=Am.Readable,Object.assign(am.exports,Am),am.exports.Stream=Am):(ys=am.exports=HT(),ys.Stream=Am||ys,ys.Readable=ys,ys.Writable=UT(),ys.Duplex=Yc(),ys.Transform=nM(),ys.PassThrough=Pue(),ys.finished=cQ(),ys.pipeline=Lue())});var Oue=I((RPt,Tue)=>{"use strict";var{Buffer:_s}=require("buffer"),Mue=Symbol.for("BufferList");function nr(t){if(!(this instanceof nr))return new nr(t);nr._init.call(this,t)}nr._init=function(e){Object.defineProperty(this,Mue,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};nr.prototype._new=function(e){return new nr(e)};nr.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let i=0;ithis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};nr.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};nr.prototype.copy=function(e,r,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||_s.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&r||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:_s.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};nr.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let i=this._offset(e),n=this._offset(r),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};nr.prototype.toString=function(e,r,i){return this.slice(r,i).toString(e)};nr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};nr.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=t.length){let l=o.indexOf(t,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-t.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,t))return l;s++}s=0}return-1};nr.prototype._match=function(t,e){if(this.length-t{"use strict";var oM=bf().Duplex,eVe=_A(),lm=Oue();function Oi(t){if(!(this instanceof Oi))return new Oi(t);if(typeof t=="function"){this._callback=t;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),t=null}lm._init.call(this,t),oM.call(this)}eVe(Oi,oM);Object.assign(Oi.prototype,lm.prototype);Oi.prototype._new=function(e){return new Oi(e)};Oi.prototype._write=function(e,r,i){this._appendBuffer(e),typeof i=="function"&&i()};Oi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Oi.prototype.end=function(e){oM.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Oi.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Oi.prototype._isBufferList=function(e){return e instanceof Oi||e instanceof lm||Oi.isBufferList(e)};Oi.isBufferList=lm.isBufferList;mQ.exports=Oi;mQ.exports.BufferListStream=Oi;mQ.exports.BufferList=lm});var lM=I(vf=>{var tVe=Buffer.alloc,rVe="0000000000000000000",iVe="7777777777777777777",Uue="0".charCodeAt(0),Hue=Buffer.from("ustar\0","binary"),nVe=Buffer.from("00","binary"),sVe=Buffer.from("ustar ","binary"),oVe=Buffer.from(" \0","binary"),aVe=parseInt("7777",8),cm=257,aM=263,AVe=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},lVe=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},cVe=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},Gue=function(t,e,r,i){for(;re?iVe.slice(0,e)+" ":rVe.slice(0,e-t.length)+t+" "};function uVe(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],i=t.length-1;i>0;i--){var n=t[i];e?r.push(n):r.push(255-n)}var s=0,o=r.length;for(i=0;i=Math.pow(10,r)&&r++,e+r+t};vf.decodeLongPath=function(t,e){return Sf(t,0,t.length,e)};vf.encodePax=function(t){var e="";t.name&&(e+=AM(" path="+t.name+` +`)),t.linkname&&(e+=AM(" linkpath="+t.linkname+` +`));var r=t.pax;if(r)for(var i in r)e+=AM(" "+i+"="+r[i]+` +`);return Buffer.from(e)};vf.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var n=r.indexOf("/");if(n===-1)return null;i+=i?"/"+r.slice(0,n):r.slice(0,n),r=r.slice(n+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(tl(t.mode&aVe,6),100),e.write(tl(t.uid,6),108),e.write(tl(t.gid,6),116),e.write(tl(t.size,11),124),e.write(tl(t.mtime.getTime()/1e3|0,11),136),e[156]=Uue+cVe(t.type),t.linkname&&e.write(t.linkname,157),Hue.copy(e,cm),nVe.copy(e,aM),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(tl(t.devmajor||0,6),329),e.write(tl(t.devminor||0,6),337),i&&e.write(i,345),e.write(tl(jue(e),6),148),e)};vf.decode=function(t,e,r){var i=t[156]===0?0:t[156]-Uue,n=Sf(t,0,100,e),s=rl(t,100,8),o=rl(t,108,8),a=rl(t,116,8),l=rl(t,124,12),c=rl(t,136,12),u=lVe(i),g=t[157]===0?null:Sf(t,157,100,e),f=Sf(t,265,32),h=Sf(t,297,32),p=rl(t,329,8),d=rl(t,337,8),m=jue(t);if(m===8*32)return null;if(m!==rl(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(Hue.compare(t,cm,cm+6)===0)t[345]&&(n=Sf(t,345,155,e)+"/"+n);else if(!(sVe.compare(t,cm,cm+6)===0&&oVe.compare(t,aM,aM+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:d}}});var _ue=I((LPt,Yue)=>{var que=require("util"),gVe=Kue(),um=lM(),Jue=bf().Writable,Wue=bf().PassThrough,zue=function(){},Vue=function(t){return t&=511,t&&512-t},fVe=function(t,e){var r=new IQ(t,e);return r.end(),r},hVe=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},IQ=function(t,e){this._parent=t,this.offset=e,Wue.call(this,{autoDestroy:!1})};que.inherits(IQ,Wue);IQ.prototype.destroy=function(t){this._parent.destroy(t)};var Wa=function(t){if(!(this instanceof Wa))return new Wa(t);Jue.call(this,t),t=t||{},this._offset=0,this._buffer=gVe(),this._missing=0,this._partial=!1,this._onparse=zue,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=Vue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(Vue(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=um.decodePax(r.slice(0,f)),r.consume(f),s()},l=function(){var f=e._header.size;e._pax=um.decodePax(r.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=um.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(p){e.emit("error",p)}if(r.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=hVe(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,fVe(e,f),n);return}e._stream=new IQ(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};que.inherits(Wa,Jue);Wa.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};Wa.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};Wa.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=zue,this._overflow?this._write(this._overflow,void 0,t):t()}};Wa.prototype._write=function(t,e,r){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(t.length&&(this._partial=!0),t.lengths&&(o=t.slice(s),t=t.slice(0,s)),i?i.end(t):n.append(t),this._overflow=o,this._onparse()}};Wa.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};Yue.exports=Wa});var Zue=I((TPt,Xue)=>{Xue.exports=require("fs").constants||require("constants")});var ige=I((MPt,$ue)=>{var xf=Zue(),ege=tk(),EQ=_A(),pVe=Buffer.alloc,tge=bf().Readable,kf=bf().Writable,dVe=require("string_decoder").StringDecoder,yQ=lM(),CVe=parseInt("755",8),mVe=parseInt("644",8),rge=pVe(1024),cM=function(){},uM=function(t,e){e&=511,e&&t.push(rge.slice(0,512-e))};function IVe(t){switch(t&xf.S_IFMT){case xf.S_IFBLK:return"block-device";case xf.S_IFCHR:return"character-device";case xf.S_IFDIR:return"directory";case xf.S_IFIFO:return"fifo";case xf.S_IFLNK:return"symlink"}return"file"}var wQ=function(t){kf.call(this),this.written=0,this._to=t,this._destroyed=!1};EQ(wQ,kf);wQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};wQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var BQ=function(){kf.call(this),this.linkname="",this._decoder=new dVe("utf-8"),this._destroyed=!1};EQ(BQ,kf);BQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};BQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var gm=function(){kf.call(this),this._destroyed=!1};EQ(gm,kf);gm.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};gm.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Oo=function(t){if(!(this instanceof Oo))return new Oo(t);tge.call(this,t),this._drain=cM,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};EQ(Oo,tge);Oo.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=cM);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=IVe(t.mode)),t.mode||(t.mode=t.type==="directory"?CVe:mVe),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var n=this.push(e);return uM(i,t.size),n?process.nextTick(r):this._drain=r,new gm}if(t.type==="symlink"&&!t.linkname){var s=new BQ;return ege(s,function(a){if(a)return i.destroy(),r(a);t.linkname=s.linkname,i._encode(t),r()}),s}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new gm;var o=new wQ(this);return this._stream=o,ege(o,function(a){if(i._stream=null,a)return i.destroy(),r(a);if(o.written!==t.size)return i.destroy(),r(new Error("size mismatch"));uM(i,t.size),i._finalizing&&i.finalize(),r()}),o}};Oo.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(rge),this.push(null))};Oo.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Oo.prototype._encode=function(t){if(!t.pax){var e=yQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};Oo.prototype._encodePax=function(t){var e=yQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(yQ.encode(r)),this.push(e),uM(this,e.length),r.size=t.size,r.type=t.type,this.push(yQ.encode(r))};Oo.prototype._read=function(t){var e=this._drain;this._drain=cM,e()};$ue.exports=Oo});var nge=I(gM=>{gM.extract=_ue();gM.pack=ige()});var Cge=I((oDt,fge)=>{"use strict";var Pf=class{constructor(e,r,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=r||{},this.__providers=pge(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return mM(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[i,n]of this.entries())e.call(r,n,i,this)}toJSON(){let e={};return this.forEach((r,i)=>{e[i]=r}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let r=e||this.__opts.other;if(r){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(r):RVe(n);for(let[o,a]of s)r(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Pf(this.__specs,this.__opts,pge(this.__providers).concat(e)),hge)}};try{let t=require("util");Pf.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch(t){}function FVe(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function mM(t,e,r){let i=t.__specs[e];if(r&&!i&&(!t.__opts.other||!t.__opts.other(e)))FVe(e);else{i||(i={});let n;for(let s of t.__providers){if(n=dge(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=dge(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(t):i.default:n}}function dge(t,e){let r;return e.__isFiggyPudding?r=mM(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var hge={has(t,e){return e in t.__specs&&mM(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Pf.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};fge.exports=NVe;function NVe(t,e){function r(...i){return new Proxy(new Pf(t,e,i),hge)}return r}function pge(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function RVe(t){return Object.keys(t).map(e=>[e,t[e]])}});var Ege=I((aDt,Ko)=>{"use strict";var hm=require("crypto"),LVe=Cge(),TVe=require("stream").Transform,mge=["sha256","sha384","sha512"],MVe=/^[a-z0-9+/]+(?:=?=?)$/i,OVe=/^([^-]+)-([^?]+)([?\S*]*)$/,KVe=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,UVe=/^[\x21-\x7E]+$/,on=LVe({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>HVe},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),zc=class{get isHash(){return!0}constructor(e,r){r=on(r);let i=!!r.strict;this.source=e.trim();let n=this.source.match(i?KVe:OVe);if(!n||i&&!mge.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=on(e),e.strict&&!(mge.some(i=>i===this.algorithm)&&this.digest.match(MVe)&&(this.options||[]).every(i=>i.match(UVe))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Df=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=on(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>zc.prototype.toString.call(n,e)).filter(n=>n.length).join(r)).filter(i=>i.length).join(r)}concat(e,r){r=on(r);let i=typeof e=="string"?e:pm(e,r);return Uo(`${this.toString(r)} ${i}`,r)}hexDigest(){return Uo(this,{single:!0}).hexDigest()}match(e,r){r=on(r);let i=Uo(e,r),n=i.pickAlgorithm(r);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=on(e);let r=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>r(n,s)||n)}};Ko.exports.parse=Uo;function Uo(t,e){if(e=on(e),typeof t=="string")return IM(t,e);if(t.algorithm&&t.digest){let r=new Df;return r[t.algorithm]=[t],IM(pm(r,e),e)}else return IM(pm(t,e),e)}function IM(t,e){return e.single?new zc(t,e):t.trim().split(/\s+/).reduce((r,i)=>{let n=new zc(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;r[s]||(r[s]=[]),r[s].push(n)}return r},new Df)}Ko.exports.stringify=pm;function pm(t,e){return e=on(e),t.algorithm&&t.digest?zc.prototype.toString.call(t,e):typeof t=="string"?pm(Uo(t,e),e):Df.prototype.toString.call(t,e)}Ko.exports.fromHex=GVe;function GVe(t,e,r){r=on(r);let i=r.options&&r.options.length?`?${r.options.join("?")}`:"";return Uo(`${e}-${Buffer.from(t,"hex").toString("base64")}${i}`,r)}Ko.exports.fromData=jVe;function jVe(t,e){e=on(e);let r=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((n,s)=>{let o=hm.createHash(s).update(t).digest("base64"),a=new zc(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new Df)}Ko.exports.fromStream=YVe;function YVe(t,e){e=on(e);let r=e.Promise||Promise,i=EM(e);return new r((n,s)=>{t.pipe(i),t.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}Ko.exports.checkData=qVe;function qVe(t,e,r){if(r=on(r),e=Uo(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(r),n=hm.createHash(i).update(t).digest("base64"),s=Uo({algorithm:i,digest:n}),o=s.match(e,r);if(o||!r.error)return o;if(typeof r.size=="number"&&t.length!==r.size){let a=new Error(`data size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${t.length}`);throw a.code="EBADSIZE",a.found=t.length,a.expected=r.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${t.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}Ko.exports.checkStream=JVe;function JVe(t,e,r){r=on(r);let i=r.Promise||Promise,n=EM(r.concat({integrity:e}));return new i((s,o)=>{t.pipe(n),t.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}Ko.exports.integrityStream=EM;function EM(t){t=on(t);let e=t.integrity&&Uo(t.integrity,t),r=e&&Object.keys(e).length,i=r&&e.pickAlgorithm(t),n=r&&e[i],s=Array.from(new Set(t.algorithms.concat(i?[i]:[]))),o=s.map(hm.createHash),a=0,l=new TVe({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=t.options&&t.options.length?`?${t.options.join("?")}`:"",u=Uo(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),t),g=r&&u.match(e,t);if(typeof t.size=="number"&&a!==t.size){let f=new Error(`stream size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=t.size,f.sri=e,l.emit("error",f)}else if(t.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}Ko.exports.create=WVe;function WVe(t){t=on(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",i=e.map(hm.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new zc(`${a}-${l}${r}`,t);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new Df)}}}var zVe=new Set(hm.getHashes()),Ige=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>zVe.has(t));function HVe(t,e){return Ige.indexOf(t.toLowerCase())>=Ige.indexOf(e.toLowerCase())?t:e}});var Fd={};it(Fd,{BuildType:()=>Gn,Cache:()=>Qt,Configuration:()=>fe,DEFAULT_LOCK_FILENAME:()=>DR,DEFAULT_RC_FILENAME:()=>PR,FormatType:()=>ps,InstallMode:()=>li,LightReport:()=>Fa,LinkType:()=>gt,Manifest:()=>Ze,MessageName:()=>z,PackageExtensionStatus:()=>ki,PackageExtensionType:()=>oi,Project:()=>Ke,ProjectLookup:()=>KA,Report:()=>Xi,ReportError:()=>nt,SettingsType:()=>ge,StreamReport:()=>Fe,TAG_REGEXP:()=>Rg,TelemetryManager:()=>Rd,ThrowReport:()=>ei,VirtualFetcher:()=>dd,Workspace:()=>Dd,WorkspaceResolver:()=>Yr,YarnVersion:()=>Zr,execUtils:()=>hr,folderUtils:()=>Pb,formatUtils:()=>ue,hashUtils:()=>mn,httpUtils:()=>Zt,miscUtils:()=>de,scriptUtils:()=>Kt,semverUtils:()=>qt,structUtils:()=>S,tgzUtils:()=>Ai,treeUtils:()=>Hs});var hr={};it(hr,{EndStrategy:()=>Pn,execvp:()=>Nhe,pipevp:()=>to});var ch={};it(ch,{AliasFS:()=>Xo,CwdFS:()=>Ft,DEFAULT_COMPRESSION_LEVEL:()=>pl,FakeFS:()=>eA,Filename:()=>wt,JailFS:()=>Zo,LazyFS:()=>oh,LinkStrategy:()=>eh,NoFS:()=>bI,NodeFS:()=>Wt,PortablePath:()=>Se,PosixFS:()=>ah,ProxiedFS:()=>fi,VirtualFS:()=>Pr,ZipFS:()=>Jr,ZipOpenFS:()=>Jn,constants:()=>mr,extendFs:()=>SI,normalizeLineEndings:()=>ul,npath:()=>M,opendir:()=>wI,patchFs:()=>pb,ppath:()=>v,statUtils:()=>rb,toFilename:()=>kr,xfs:()=>T});var mr={};it(mr,{SAFE_TIME:()=>tb,S_IFDIR:()=>zo,S_IFLNK:()=>_o,S_IFMT:()=>kn,S_IFREG:()=>Vo});var kn=61440,zo=16384,Vo=32768,_o=40960,tb=456789e3;var rb={};it(rb,{BigIntStatsEntry:()=>Xf,DEFAULT_MODE:()=>_f,DirEntry:()=>uO,StatEntry:()=>Za,areStatsEqual:()=>nb,clearStats:()=>pI,convertToBigIntStats:()=>dI,makeDefaultStats:()=>Zf,makeEmptyStats:()=>Jfe});var ib=ie(require("util"));var _f=Vo|420,uO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Za=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=_f;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Xf=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(_f);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(kn))===BigInt(zo)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(kn))===BigInt(Vo)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(kn))===BigInt(_o)}};function Zf(){return new Za}function Jfe(){return pI(Zf())}function pI(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):ib.types.isDate(r)&&(t[e]=new Date(0))}return t}function dI(t){let e=new Xf;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let i=t[r];typeof i=="number"?e[r]=BigInt(i):ib.types.isDate(i)&&(e[r]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nb(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,i=e;return!(r.atimeNs!==i.atimeNs||r.mtimeNs!==i.mtimeNs||r.ctimeNs!==i.ctimeNs||r.birthtimeNs!==i.birthtimeNs)}var mI=ie(require("fs"));var $f=ie(require("path")),gO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(gO||(gO={}));var Se={root:"/",dot:"."},wt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},M=Object.create($f.default),v=Object.create($f.default.posix);M.cwd=()=>process.cwd();v.cwd=()=>sb(process.cwd());v.resolve=(...t)=>t.length>0&&v.isAbsolute(t[0])?$f.default.posix.resolve(...t):$f.default.posix.resolve(v.cwd(),...t);var fO=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};M.fromPortablePath=hO;M.toPortablePath=sb;M.contains=(t,e)=>fO(M,t,e);v.contains=(t,e)=>fO(v,t,e);var Wfe=/^([a-zA-Z]:.*)$/,zfe=/^\\\\(\.\\)?(.*)$/,Vfe=/^\/([a-zA-Z]:.*)$/,_fe=/^\/unc\/(\.dot\/)?(.*)$/;function hO(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(Vfe))t=e[1];else if(r=t.match(_fe))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function sb(t){if(process.platform!=="win32")return t;let e,r;return(e=t.match(Wfe))?t=`/${e[1]}`:(r=t.match(zfe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t.replace(/\\/g,"/")}function CI(t,e){return t===M?hO(e):sb(e)}function kr(t){if(M.parse(t).dir!==""||v.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var II=new Date(tb*1e3),eh;(function(r){r.Allow="allow",r.ReadOnly="readOnly"})(eh||(eh={}));async function pO(t,e,r,i,n){let s=t.pathUtils.normalize(e),o=r.pathUtils.normalize(i),a=[],l=[],c=n.stableTime?{mtime:II,atime:II}:await r.lstatPromise(o);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[c.atime,c.mtime]});let u=typeof t.lutimesPromise=="function"?t.lutimesPromise.bind(t):t.utimesPromise.bind(t);await ob(a,l,u,t,s,r,o,n);for(let g of a)await g();await Promise.all(l.map(g=>g()))}async function ob(t,e,r,i,n,s,o,a){var f,h;let l=await Xfe(i,n),c=await s.lstatPromise(o),u=a.stableTime?{mtime:II,atime:II}:c,g;switch(!0){case c.isDirectory():g=await Zfe(t,e,r,i,n,l,s,o,c,a);break;case c.isFile():g=await $fe(t,e,r,i,n,l,s,o,c,a);break;case c.isSymbolicLink():g=await ehe(t,e,r,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(g||((f=l==null?void 0:l.mtime)==null?void 0:f.getTime())!==u.mtime.getTime()||((h=l==null?void 0:l.atime)==null?void 0:h.getTime())!==u.atime.getTime())&&(e.push(()=>r(n,u.atime,u.mtime)),g=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),g=!0),g}async function Xfe(t,e){try{return await t.lstatPromise(e)}catch(r){return null}}async function Zfe(t,e,r,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(t.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(f){if(f.code!=="EEXIST")throw f}}),u=!0);let g=await o.readdirPromise(a);if(c.stableSort)for(let f of g.sort())await ob(t,e,r,i,i.pathUtils.join(n,f),o,o.pathUtils.join(a,f),c)&&(u=!0);else(await Promise.all(g.map(async h=>{await ob(t,e,r,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),c)}))).some(h=>h)&&(u=!0);return u}var ab=new WeakMap;function Ab(t,e,r,i,n){return async()=>{await t.linkPromise(r,e),n===eh.ReadOnly&&(i.mode&=~146,await t.chmodPromise(e,i.mode))}}function the(t,e,r,i,n){let s=ab.get(t);return typeof s=="undefined"?async()=>{try{await t.copyFilePromise(r,e,mI.default.constants.COPYFILE_FICLONE_FORCE),ab.set(t,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")ab.set(t,!1),await Ab(t,e,r,i,n)();else throw o}}:s?async()=>t.copyFilePromise(r,e,mI.default.constants.COPYFILE_FICLONE_FORCE):Ab(t,e,r,i,n)}async function $fe(t,e,r,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?the(i,n,a,l,u):async()=>i.copyFilePromise(a,n,mI.default.constants.COPYFILE_FICLONE):u!==null?Ab(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return t.push(async()=>g()),!0}async function ehe(t,e,r,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;return t.push(async()=>{await i.symlinkPromise(CI(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function qn(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function EI(t){return qn("EBUSY",t)}function th(t,e){return qn("ENOSYS",`${t}, ${e}`)}function $a(t){return qn("EINVAL",`invalid argument, ${t}`)}function Hi(t){return qn("EBADF",`bad file descriptor, ${t}`)}function bs(t){return qn("ENOENT",`no such file or directory, ${t}`)}function eo(t){return qn("ENOTDIR",`not a directory, ${t}`)}function rh(t){return qn("EISDIR",`illegal operation on a directory, ${t}`)}function yI(t){return qn("EEXIST",`file already exists, ${t}`)}function ln(t){return qn("EROFS",`read-only filesystem, ${t}`)}function dO(t){return qn("ENOTEMPTY",`directory not empty, ${t}`)}function CO(t){return qn("EOPNOTSUPP",`operation not supported, ${t}`)}function mO(){return qn("ERR_DIR_CLOSED","Directory handle was closed")}var lb=class extends Error{constructor(e,r){super(e);this.name="Libzip Error",this.code=r}};var IO=class{constructor(e,r,i={}){this.path=e;this.nextDirent=r;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw mO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e!="undefined"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}};function wI(t,e,r,i){let n=()=>{let s=r.shift();return typeof s=="undefined"?null:Object.assign(t.statSync(t.pathUtils.join(e,s)),{name:s})};return new IO(e,n,i)}var EO=ie(require("os"));var eA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(r)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:r=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(r){let o=await this.readdirPromise(e);await Promise.all(o.map(a=>this.removePromise(this.pathUtils.resolve(e,a))))}let s=0;do try{await this.rmdirPromise(e);break}catch(o){if(o.code==="EBUSY"||o.code==="ENOTEMPTY"){if(i===0)break;await new Promise(a=>setTimeout(a,s*100));continue}else throw o}while(s++{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} +`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} +`)}async preserveTimePromise(e,r){let i=await this.lstatPromise(e),n=await r();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,r){let i=this.lstatSync(e),n=r();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},gl=class extends eA{constructor(){super(v)}};function rhe(t){let e=t.match(/\r?\n/g);if(e===null)return EO.EOL;let r=e.filter(n=>n===`\r +`).length,i=e.length-r;return r>i?`\r +`:` +`}function ul(t,e){return e.replace(/\r?\n/g,rhe(t))}var $c=ie(require("fs")),cb=ie(require("stream")),QO=ie(require("util")),ub=ie(require("zlib"));var yO=ie(require("fs"));var Wt=class extends gl{constructor(e=yO.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Se.root}resolve(e){return v.resolve(e)}async openPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.open(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}openSync(e,r,i){return this.realFs.openSync(M.fromPortablePath(e),r,i)}async opendirPromise(e,r){return await new Promise((i,n)=>{typeof r!="undefined"?this.realFs.opendir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.opendir(M.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,r){let i=typeof r!="undefined"?this.realFs.opendirSync(M.fromPortablePath(e),r):this.realFs.opendirSync(M.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,r,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,r,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,r,i,n,s){return this.realFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return await new Promise((o,a)=>typeof r=="string"?this.realFs.write(e,r,i,this.makeCallback(o,a)):this.realFs.write(e,r,i,n,s,this.makeCallback(o,a)))}writeSync(e,r,i,n,s){return typeof r=="string"?this.realFs.writeSync(e,r,i):this.realFs.writeSync(e,r,i,n,s)}async closePromise(e){await new Promise((r,i)=>{this.realFs.close(e,this.makeCallback(r,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createReadStream(i,r)}createWriteStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createWriteStream(i,r)}async realpathPromise(e){return await new Promise((r,i)=>{this.realFs.realpath(M.fromPortablePath(e),{},this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}realpathSync(e){return M.toPortablePath(this.realFs.realpathSync(M.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(M.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(M.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((i,n)=>{this.realFs.access(M.fromPortablePath(e),r,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(M.fromPortablePath(e))}async statPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.stat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.stat(M.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,r){return r?this.realFs.statSync(M.fromPortablePath(e),r):this.realFs.statSync(M.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.fstat(e,r,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.lstat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.lstat(M.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,r){return r?this.realFs.lstatSync(M.fromPortablePath(e),r):this.realFs.lstatSync(M.fromPortablePath(e))}async chmodPromise(e,r){return await new Promise((i,n)=>{this.realFs.chmod(M.fromPortablePath(e),r,this.makeCallback(i,n))})}chmodSync(e,r){return this.realFs.chmodSync(M.fromPortablePath(e),r)}async chownPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.chown(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}chownSync(e,r,i){return this.realFs.chownSync(M.fromPortablePath(e),r,i)}async renamePromise(e,r){return await new Promise((i,n)=>{this.realFs.rename(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}renameSync(e,r){return this.realFs.renameSync(M.fromPortablePath(e),M.fromPortablePath(r))}async copyFilePromise(e,r,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(M.fromPortablePath(e),M.fromPortablePath(r),i,this.makeCallback(n,s))})}copyFileSync(e,r,i=0){return this.realFs.copyFileSync(M.fromPortablePath(e),M.fromPortablePath(r),i)}async appendFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFile(o,r,i,this.makeCallback(n,s)):this.realFs.appendFile(o,r,this.makeCallback(n,s))})}appendFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,r,i):this.realFs.appendFileSync(n,r)}async writeFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFile(o,r,i,this.makeCallback(n,s)):this.realFs.writeFile(o,r,this.makeCallback(n,s))})}writeFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,r,i):this.realFs.writeFileSync(n,r)}async unlinkPromise(e){return await new Promise((r,i)=>{this.realFs.unlink(M.fromPortablePath(e),this.makeCallback(r,i))})}unlinkSync(e){return this.realFs.unlinkSync(M.fromPortablePath(e))}async utimesPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.utimes(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}utimesSync(e,r,i){this.realFs.utimesSync(M.fromPortablePath(e),r,i)}async lutimesPromiseImpl(e,r,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,M.fromPortablePath(e),r,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,r,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,M.fromPortablePath(e),r,i)}async mkdirPromise(e,r){return await new Promise((i,n)=>{this.realFs.mkdir(M.fromPortablePath(e),r,this.makeCallback(i,n))})}mkdirSync(e,r){return this.realFs.mkdirSync(M.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.rmdir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.rmdir(M.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,r){return this.realFs.rmdirSync(M.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((i,n)=>{this.realFs.link(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}linkSync(e,r){return this.realFs.linkSync(M.fromPortablePath(e),M.fromPortablePath(r))}async symlinkPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.symlink(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i,this.makeCallback(n,s))})}symlinkSync(e,r,i){return this.realFs.symlinkSync(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i)}async readFilePromise(e,r){return await new Promise((i,n)=>{let s=typeof e=="string"?M.fromPortablePath(e):e;this.realFs.readFile(s,r,this.makeCallback(i,n))})}readFileSync(e,r){let i=typeof e=="string"?M.fromPortablePath(e):e;return this.realFs.readFileSync(i,r)}async readdirPromise(e,r){return await new Promise((i,n)=>{(r==null?void 0:r.withFileTypes)?this.realFs.readdir(M.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(M.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,r){return(r==null?void 0:r.withFileTypes)?this.realFs.readdirSync(M.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(M.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,i)=>{this.realFs.readlink(M.fromPortablePath(e),this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}readlinkSync(e){return M.toPortablePath(this.realFs.readlinkSync(M.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((i,n)=>{this.realFs.truncate(M.fromPortablePath(e),r,this.makeCallback(i,n))})}truncateSync(e,r){return this.realFs.truncateSync(M.fromPortablePath(e),r)}watch(e,r,i){return this.realFs.watch(M.fromPortablePath(e),r,i)}watchFile(e,r,i){return this.realFs.watchFile(M.fromPortablePath(e),r,i)}unwatchFile(e,r){return this.realFs.unwatchFile(M.fromPortablePath(e),r)}makeCallback(e,r){return(i,n)=>{i?r(i):e(n)}}};var wO=ie(require("events"));var fl;(function(r){r.Change="change",r.Stop="stop"})(fl||(fl={}));var hl;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(hl||(hl={}));function BO(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var ih=class extends wO.EventEmitter{constructor(e,r,{bigint:i=!1}={}){super();this.status=hl.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=r,this.bigint=i,this.lastStats=this.stat()}static create(e,r,i){let n=new ih(e,r,i);return n.start(),n}start(){BO(this.status,hl.Ready),this.status=hl.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(fl.Change,this.lastStats,this.lastStats)},3)}stop(){BO(this.status,hl.Running),this.status=hl.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(fl.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let r=this.bigint?new Xf:new Za;return pI(r)}}makeInterval(e){let r=setInterval(()=>{let i=this.stat(),n=this.lastStats;nb(i,n)||(this.lastStats=i,this.emit(fl.Change,i,n))},e.interval);return e.persistent?r:r.unref()}registerChangeListener(e,r){this.addListener(fl.Change,e),this.changeListeners.set(e,this.makeInterval(r))}unregisterChangeListener(e){this.removeListener(fl.Change,e);let r=this.changeListeners.get(e);typeof r!="undefined"&&clearInterval(r),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var BI=new WeakMap;function QI(t,e,r,i){let n,s,o,a;switch(typeof r){case"function":n=!1,s=!0,o=5007,a=r;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=r),a=i;break}let l=BI.get(t);typeof l=="undefined"&&BI.set(t,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=ih.create(t,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function nh(t,e,r){let i=BI.get(t);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof r=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function sh(t){let e=BI.get(t);if(typeof e!="undefined")for(let r of e.keys())nh(t,r)}var pl="mixed";function ihe(t){if(typeof t=="string"&&String(+t)===t)return+t;if(Number.isFinite(t))return t<0?Date.now()/1e3:t;if((0,QO.isDate)(t))return t.getTime()/1e3;throw new Error("Invalid time")}function bO(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Jr=class extends gl{constructor(e,r){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=r.libzip;let i=r;if(this.level=typeof i.level!="undefined"?i.level:pl,e!=null||(e=bO()),typeof e=="string"){let{baseFs:o=new Wt}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(r.stats)this.stats=r.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Zf();else throw o}else this.stats=Zf();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),r.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(M.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Se.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(r,r+e);return Buffer.from(n)}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw EI("archive closed, close");sh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===_f?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,bO(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return v.resolve(Se.root,e)}async openPromise(e,r,i){return this.openSync(e,r,i)}openSync(e,r,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,r){return this.opendirSync(e,r)}opendirSync(e,r={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return wI(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,r,i,n,s){return this.readSync(e,r,i,n,s)}readSync(e,r,i=0,n=r.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Hi("read");let a;s===-1||s===null?a=o.cursor:a=s;let l=this.readFileSync(o.p);l.copy(r,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,r,i,n,s){return typeof r=="string"?this.writeSync(e,r,s):this.writeSync(e,r,i,n,s)}writeSync(e,r,i,n,s){throw typeof this.fds.get(e)=="undefined"?Hi("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Hi("read");this.fds.delete(e)}createReadStream(e,{encoding:r}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cb.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,r);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:r}={}){if(this.readOnly)throw ln(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cb.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),r),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let r=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`lstat '${e}'`);return r}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw EI(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=v.resolve(Se.root,e);return this.entries.has(i)||this.listings.has(i)}let r;try{r=this.resolveFilename(`stat '${e}'`,e)}catch(i){return!1}return this.entries.has(r)||this.listings.has(r)}async accessPromise(e,r){return this.accessSync(e,r)}accessSync(e,r=$c.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`access '${e}'`);if(this.readOnly&&r&$c.constants.W_OK)throw ln(`access '${e}'`)}async statPromise(e,r){return this.statSync(e,r)}statSync(e,r){let i=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`stat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,r)}async fstatPromise(e,r){return this.fstatSync(e,r)}fstatSync(e,r){let i=this.fds.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw bs(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw eo(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,r)}async lstatPromise(e,r){return this.lstatSync(e,r)}lstatSync(e,r){let i=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`lstat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,r)}statImpl(e,r,i={}){let n=this.entries.get(r);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,d=f,m=new Date(h),E=new Date(p),B=new Date(d),b=new Date(f),R=this.listings.has(r)?zo:this.isSymbolicLink(n)?_o:Vo,H=R===zo?493:420,L=R|this.getUnixMode(n,H)&511,K=this.libzip.struct.statCrc(s),J=Object.assign(new Za,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:m,birthtime:E,ctime:B,mtime:b,atimeMs:h,birthtimeMs:p,ctimeMs:d,mtimeMs:f,mode:L,crc:K});return i.bigint===!0?dI(J):J}if(this.listings.has(r)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),d=new Date(g),m=new Date(f),E=new Date(h),B=zo|493,b=0,R=Object.assign(new Za,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:d,ctime:m,mtime:E,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:B,crc:b});return i.bigint===!0?dI(R):R}throw new Error("Unreachable")}getUnixMode(e,r){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?r:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let r=this.listings.get(e);if(r)return r;let i=this.registerListing(v.dirname(e));return r=new Set,i.add(v.basename(e)),this.listings.set(e,r),r}registerEntry(e,r){this.registerListing(v.dirname(e)).add(v.basename(e)),this.entries.set(e,r)}unregisterListing(e){this.listings.delete(e);let r=this.listings.get(v.dirname(e));r==null||r.delete(v.basename(e))}unregisterEntry(e){this.unregisterListing(e);let r=this.entries.get(e);this.entries.delete(e),typeof r!="undefined"&&(this.fileSources.delete(r),this.isSymbolicLink(r)&&this.symlinkCount--)}deleteEntry(e,r){if(this.unregisterEntry(e),this.libzip.delete(this.zip,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,r,i=!0){if(!this.ready)throw EI(`archive closed, ${e}`);let n=v.resolve(Se.root,r);if(n==="/")return Se.root;let s=this.entries.get(n);if(i&&s!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(s)){let o=this.getFileSource(s).toString();return this.resolveFilename(e,v.resolve(v.dirname(n),o),!0)}else return n;for(;;){let o=this.resolveFilename(e,v.dirname(n),!0),a=this.listings.has(o),l=this.entries.has(o);if(!a&&!l)throw bs(e);if(!a)throw eo(e);if(n=v.resolve(o,v.basename(n)),!i||this.symlinkCount===0)break;let c=this.libzip.name.locate(this.zip,n.slice(1));if(c===-1)break;if(this.isSymbolicLink(c)){let u=this.getFileSource(c).toString();n=v.resolve(v.dirname(n),u)}else break}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,r);if(s===0)throw this.libzip.free(r),this.makeLibzipError(r);return s}allocateSource(e){let{buffer:r,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,r,i,0,!0);if(n===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,r){let i=Buffer.isBuffer(r)?r:Buffer.from(r),n=v.relative(Se.root,e),s=this.allocateSource(r);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a;if(this.level===0?a=this.libzip.ZIP_CM_STORE:a=this.libzip.ZIP_CM_DEFLATE,this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&kn)===_o}getFileSource(e,r={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(r.asyncDecompress)return new Promise((h,p)=>{ub.default.inflateRaw(f,(d,m)=>{d?p(d):(this.fileSources.set(e,m),h(m))})});{let h=ub.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async chmodPromise(e,r){return this.chmodSync(e,r)}chmodSync(e,r){if(this.readOnly)throw ln(`chmod '${e}'`);r&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Vo|0)&~511|r;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,r,i){return this.chownSync(e,r,i)}chownSync(e,r,i){throw new Error("Unimplemented")}async renamePromise(e,r){return this.renameSync(e,r)}renameSync(e,r){throw new Error("Unimplemented")}async copyFilePromise(e,r,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,r,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,r,i=0){if(this.readOnly)throw ln(`copyfile '${e} -> '${r}'`);if((i&$c.constants.COPYFILE_FICLONE_FORCE)!=0)throw th("unsupported clone operation",`copyfile '${e}' -> ${r}'`);let n=this.resolveFilename(`copyfile '${e} -> ${r}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw $a(`copyfile '${e}' -> '${r}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${r}'`,r),a=this.entries.get(o);if((i&($c.constants.COPYFILE_EXCL|$c.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw yI(`copyfile '${e}' -> '${r}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,r,i){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFilePromise(e,r,i)}appendFileSync(e,r,i={}){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFileSync(e,r,i)}fdToPath(e,r){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Hi(r);return i}async writeFilePromise(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([this.getFileSource(o),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,r){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw ln(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw rh(`open '${e}'`);let n=null,s=null;typeof r=="string"?n=r:typeof r=="object"&&({encoding:n=null,mode:s=null}=r);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw ln(`unlink '${e}'`);let r=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(r))throw rh(`unlink '${e}'`);let i=this.entries.get(r);if(typeof i=="undefined")throw $a(`unlink '${e}'`);this.deleteEntry(r,i)}async utimesPromise(e,r,i){return this.utimesSync(e,r,i)}utimesSync(e,r,i){if(this.readOnly)throw ln(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,r,i){return this.lutimesSync(e,r,i)}lutimesSync(e,r,i){if(this.readOnly)throw ln(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,r){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,ihe(r),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,r){return this.mkdirSync(e,r)}mkdirSync(e,{mode:r=493,recursive:i=!1}={}){if(i){this.mkdirpSync(e,{chmod:r});return}if(this.readOnly)throw ln(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw yI(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,r)}async rmdirPromise(e,r){return this.rmdirSync(e,r)}rmdirSync(e,{recursive:r=!1}={}){if(this.readOnly)throw ln(`rmdir '${e}'`);if(r){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw eo(`rmdir '${e}'`);if(n.size>0)throw dO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw $a(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let r=this.libzip.dir.add(this.zip,v.relative(Se.root,e));if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,r),r}async linkPromise(e,r){return this.linkSync(e,r)}linkSync(e,r){throw CO(`link '${e}' -> '${r}'`)}async symlinkPromise(e,r){return this.symlinkSync(e,r)}symlinkSync(e,r){if(this.readOnly)throw ln(`symlink '${e}' -> '${r}'`);let i=this.resolveFilename(`symlink '${e}' -> '${r}'`,r);if(this.listings.has(i))throw rh(`symlink '${e}' -> '${r}'`);if(this.entries.has(i))throw yI(`symlink '${e}' -> '${r}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(_o|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return r?i.toString(r):i}readFileSync(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=this.readFileBuffer(e);return r?i.toString(r):i}readFileBuffer(e,r={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`open '${e}'`);if(this.listings.has(i))throw rh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,r)}async readdirPromise(e,r){return this.readdirSync(e,r)}readdirSync(e,r){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`scandir '${e}'`);let s=[...n];return(r==null?void 0:r.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",v.join(e,o)),{name:o})):s}async readlinkPromise(e){let r=this.prepareReadlink(e);return(await this.getFileSource(r,{asyncDecompress:!0})).toString()}readlinkSync(e){let r=this.prepareReadlink(e);return this.getFileSource(r).toString()}prepareReadlink(e){let r=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(r))throw eo(`open '${e}'`);if(this.listings.has(r))throw $a(`readlink '${e}'`);let i=this.entries.get(r);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw $a(`readlink '${e}'`);return i}async truncatePromise(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(r,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(r,0);return s.copy(o),this.writeFileSync(e,o)}watch(e,r,i){let n;switch(typeof r){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=r);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,r,i){let n=v.resolve(Se.root,e);return QI(this,n,r,i)}unwatchFile(e,r){let i=v.resolve(Se.root,e);return nh(this,i,r)}};var fi=class extends eA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,i){return this.baseFs.openPromise(this.mapToBase(e),r,i)}openSync(e,r,i){return this.baseFs.openSync(this.mapToBase(e),r,i)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,i,n,s){return await this.baseFs.readPromise(e,r,i,n,s)}readSync(e,r,i,n,s){return this.baseFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s)}writeSync(e,r,i,n,s){return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}async lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async chownPromise(e,r,i){return this.baseFs.chownPromise(this.mapToBase(e),r,i)}chownSync(e,r,i){return this.baseFs.chownSync(this.mapToBase(e),r,i)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),i)}copyFileSync(e,r,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),i)}async appendFilePromise(e,r,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,i)}appendFileSync(e,r,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,i)}async writeFilePromise(e,r,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,i)}writeFileSync(e,r,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,i){return this.baseFs.utimesPromise(this.mapToBase(e),r,i)}utimesSync(e,r,i){return this.baseFs.utimesSync(this.mapToBase(e),r,i)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,r){return r==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),r):this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return r==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),r):this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}watch(e,r,i){return this.baseFs.watch(this.mapToBase(e),r,i)}watchFile(e,r,i){return this.baseFs.watchFile(this.mapToBase(e),r,i)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Xo=class extends fi{constructor(e,{baseFs:r,pathUtils:i}){super(i);this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var Ft=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?v.normalize(e):this.baseFs.resolve(v.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var vO=Se.root,Zo=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.resolve(Se.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Se.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(vO,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(vO,this.pathUtils.relative(this.target,e))}};var oh=class extends fi{constructor(e,r){super(r);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var ze=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gb=class extends eA{constructor(){super(v)}getExtractHint(){throw ze()}getRealPath(){throw ze()}resolve(){throw ze()}async openPromise(){throw ze()}openSync(){throw ze()}async opendirPromise(){throw ze()}opendirSync(){throw ze()}async readPromise(){throw ze()}readSync(){throw ze()}async writePromise(){throw ze()}writeSync(){throw ze()}async closePromise(){throw ze()}closeSync(){throw ze()}createWriteStream(){throw ze()}createReadStream(){throw ze()}async realpathPromise(){throw ze()}realpathSync(){throw ze()}async readdirPromise(){throw ze()}readdirSync(){throw ze()}async existsPromise(e){throw ze()}existsSync(e){throw ze()}async accessPromise(){throw ze()}accessSync(){throw ze()}async statPromise(){throw ze()}statSync(){throw ze()}async fstatPromise(e){throw ze()}fstatSync(e){throw ze()}async lstatPromise(e){throw ze()}lstatSync(e){throw ze()}async chmodPromise(){throw ze()}chmodSync(){throw ze()}async chownPromise(){throw ze()}chownSync(){throw ze()}async mkdirPromise(){throw ze()}mkdirSync(){throw ze()}async rmdirPromise(){throw ze()}rmdirSync(){throw ze()}async linkPromise(){throw ze()}linkSync(){throw ze()}async symlinkPromise(){throw ze()}symlinkSync(){throw ze()}async renamePromise(){throw ze()}renameSync(){throw ze()}async copyFilePromise(){throw ze()}copyFileSync(){throw ze()}async appendFilePromise(){throw ze()}appendFileSync(){throw ze()}async writeFilePromise(){throw ze()}writeFileSync(){throw ze()}async unlinkPromise(){throw ze()}unlinkSync(){throw ze()}async utimesPromise(){throw ze()}utimesSync(){throw ze()}async readFilePromise(){throw ze()}readFileSync(){throw ze()}async readlinkPromise(){throw ze()}readlinkSync(){throw ze()}async truncatePromise(){throw ze()}truncateSync(){throw ze()}watch(){throw ze()}watchFile(){throw ze()}unwatchFile(){throw ze()}},bI=gb;bI.instance=new gb;var ah=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return M.fromPortablePath(e)}mapToBase(e){return M.toPortablePath(e)}};var nhe=/^[0-9]+$/,fb=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,she=/^([^/]+-)?[a-f0-9]+$/,Pr=class extends fi{static makeVirtualPath(e,r,i){if(v.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!v.basename(r).match(she))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=v.relative(v.dirname(e),i).split("/"),o=0;for(;o{let r=t.indexOf(e);if(r<=0)return null;let i=r;for(;r>=0&&(i=r+e.length,t[i]!==v.sep);){if(t[r-1]===v.sep)return null;r=t.indexOf(e,i)}return t.length>i&&t[i]!==v.sep?null:t.slice(0,i)},Jn=class extends gl{constructor({libzip:e,baseFs:r=new Wt,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=r,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,r){let i=new Jn(r);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,r){let i=this.nextFd++|$o;return this.fdMap.set(i,[e,r]),i}async openPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,r,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,r,i)))}openSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,r,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,r,i)))}async opendirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,r),async(i,{subPath:n})=>await i.opendirPromise(n,r),{requireSubpath:!1})}opendirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,r),(i,{subPath:n})=>i.opendirSync(n,r),{requireSubpath:!1})}async readPromise(e,r,i,n,s){if((e&$o)==0)return await this.baseFs.readPromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("read");let[a,l]=o;return await a.readPromise(l,r,i,n,s)}readSync(e,r,i,n,s){if((e&$o)==0)return this.baseFs.readSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("readSync");let[a,l]=o;return a.readSync(l,r,i,n,s)}async writePromise(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("write");let[a,l]=o;return typeof r=="string"?await a.writePromise(l,r,i):await a.writePromise(l,r,i,n,s)}writeSync(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("writeSync");let[a,l]=o;return typeof r=="string"?a.writeSync(l,r,i):a.writeSync(l,r,i,n,s)}async closePromise(e){if((e&$o)==0)return await this.baseFs.closePromise(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("close");this.fdMap.delete(e);let[i,n]=r;return await i.closePromise(n)}closeSync(e){if((e&$o)==0)return this.baseFs.closeSync(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("closeSync");this.fdMap.delete(e);let[i,n]=r;return i.closeSync(n)}createReadStream(e,r){return e===null?this.baseFs.createReadStream(e,r):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,r),(i,{subPath:n})=>i.createReadStream(n,r))}createWriteStream(e,r){return e===null?this.baseFs.createWriteStream(e,r):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,r),(i,{subPath:n})=>i.createWriteStream(n,r))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,await r.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,r.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(r,{subPath:i})=>await r.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(r,{subPath:i})=>r.existsSync(i))}async accessPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,r),async(i,{subPath:n})=>await i.accessPromise(n,r))}accessSync(e,r){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,r),(i,{subPath:n})=>i.accessSync(n,r))}async statPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,r),async(i,{subPath:n})=>await i.statPromise(n,r))}statSync(e,r){return this.makeCallSync(e,()=>this.baseFs.statSync(e,r),(i,{subPath:n})=>i.statSync(n,r))}async fstatPromise(e,r){if((e&$o)==0)return this.baseFs.fstatPromise(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstat");let[n,s]=i;return n.fstatPromise(s,r)}fstatSync(e,r){if((e&$o)==0)return this.baseFs.fstatSync(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let[n,s]=i;return n.fstatSync(s,r)}async lstatPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,r),async(i,{subPath:n})=>await i.lstatPromise(n,r))}lstatSync(e,r){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,r),(i,{subPath:n})=>i.lstatSync(n,r))}async chmodPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,r),async(i,{subPath:n})=>await i.chmodPromise(n,r))}chmodSync(e,r){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,r),(i,{subPath:n})=>i.chmodSync(n,r))}async chownPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,r,i),async(n,{subPath:s})=>await n.chownPromise(s,r,i))}chownSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,r,i),(n,{subPath:s})=>n.chownSync(s,r,i))}async renamePromise(e,r){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.renamePromise(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(r,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,r){return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.renameSync(e,r),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(r,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,r,i=0){let n=async(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.copyFilePromise(e,r,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(r,async()=>await n(s,o,this.baseFs,r),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,r,i=0){let n=(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.copyFileSync(e,r,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(r,()=>n(s,o,this.baseFs,r),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,r,i),async(n,{subPath:s})=>await n.appendFilePromise(s,r,i))}appendFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,r,i),(n,{subPath:s})=>n.appendFileSync(s,r,i))}async writeFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,r,i),async(n,{subPath:s})=>await n.writeFilePromise(s,r,i))}writeFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,r,i),(n,{subPath:s})=>n.writeFileSync(s,r,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(r,{subPath:i})=>await r.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(r,{subPath:i})=>r.unlinkSync(i))}async utimesPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,r,i),async(n,{subPath:s})=>await n.utimesPromise(s,r,i))}utimesSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,r,i),(n,{subPath:s})=>n.utimesSync(s,r,i))}async mkdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,r),async(i,{subPath:n})=>await i.mkdirPromise(n,r))}mkdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,r),(i,{subPath:n})=>i.mkdirSync(n,r))}async rmdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,r),async(i,{subPath:n})=>await i.rmdirPromise(n,r))}rmdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,r),(i,{subPath:n})=>i.rmdirSync(n,r))}async linkPromise(e,r){return await this.makeCallPromise(r,async()=>await this.baseFs.linkPromise(e,r),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,r){return this.makeCallSync(r,()=>this.baseFs.linkSync(e,r),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,r,i){return await this.makeCallPromise(r,async()=>await this.baseFs.symlinkPromise(e,r,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,r,i){return this.makeCallSync(r,()=>this.baseFs.symlinkSync(e,r,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,r){return this.makeCallPromise(e,async()=>{switch(r){case"utf8":return await this.baseFs.readFilePromise(e,r);default:return await this.baseFs.readFilePromise(e,r)}},async(i,{subPath:n})=>await i.readFilePromise(n,r))}readFileSync(e,r){return this.makeCallSync(e,()=>{switch(r){case"utf8":return this.baseFs.readFileSync(e,r);default:return this.baseFs.readFileSync(e,r)}},(i,{subPath:n})=>i.readFileSync(n,r))}async readdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,r),async(i,{subPath:n})=>await i.readdirPromise(n,r),{requireSubpath:!1})}readdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,r),(i,{subPath:n})=>i.readdirSync(n,r),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(r,{subPath:i})=>await r.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(r,{subPath:i})=>r.readlinkSync(i))}async truncatePromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,r),async(i,{subPath:n})=>await i.truncatePromise(n,r))}truncateSync(e,r){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,r),(i,{subPath:n})=>i.truncateSync(n,r))}watch(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,r,i),(n,{subPath:s})=>n.watch(s,r,i))}watchFile(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,r,i),()=>QI(this,e,r,i))}unwatchFile(e,r){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,r),()=>nh(this,e,r))}async makeCallPromise(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await r();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await r():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await r()}makeCallSync(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return r();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?r():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let r="";for(;;){let i=e.substr(r.length),n;if(!this.fileExtensions)n=SO(i,".zip");else for(let s of this.fileExtensions)if(n=SO(i,s),n)break;if(!n)return null;if(r=this.pathUtils.join(r,n),this.isZip.has(r)===!1){if(this.notZip.has(r))continue;try{if(!this.baseFs.lstatSync(r).isFile()){this.notZip.add(r);continue}}catch{return null}this.isZip.add(r)}return{archivePath:r,subPath:this.pathUtils.join(Se.root,e.substr(r.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let r=Date.now(),i=r+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(r>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-r).unref())}async getZipPromise(e,r){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new Jr(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await r(n.zipFs)}finally{n.refCount-=1}}else{let n=new Jr(e,await i());try{return await r(n)}finally{n.saveAndClose()}}}getZipSync(e,r){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new Jr(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,r(n.zipFs)}else{let n=new Jr(e,i());try{return r(n)}finally{n.saveAndClose()}}}};var lh=ie(require("util"));var vI=ie(require("url"));var hb=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof vI.URL?(0,vI.fileURLToPath)(e):e}};var ohe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),xO=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),ahe=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]);function pb(t,e){e=new hb(e);let r=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[lh.promisify.custom])!="undefined"&&(s[lh.promisify.custom]=o[lh.promisify.custom])};{r(t,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),r(t,"read",(i,n,...s)=>{let a=typeof s[s.length-1]=="function"?s.pop():()=>{};process.nextTick(()=>{e.readPromise(i,n,...s).then(l=>{a(null,l,n)},l=>{a(l,0,n)})})});for(let i of xO){let n=i.replace(/Promise$/,"");if(typeof t[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;r(t,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}});for(let i of ohe){let n=i;if(typeof t[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&r(t,n,s.bind(e))}t.realpathSync.native=t.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=t.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let o of xO){let a=o.replace(/Promise$/,"");if(typeof n[a]=="undefined")continue;let l=e[o];typeof l!="undefined"&&o!=="open"&&r(n,a,l.bind(e))}class s{constructor(a){this.fd=a}}for(let o of ahe){let a=o.replace(/Promise$/,""),l=e[o];typeof l!="undefined"&&r(s.prototype,a,function(...c){return l.call(e,this.fd,...c)})}r(n,"open",async(...o)=>{let a=await e.openPromise(...o);return new s(a)})}}t.read[lh.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n})}function SI(t,e){let r=Object.create(t);return pb(r,e),r}var kO=ie(require("os"));function PO(t){let e=M.toPortablePath(kO.default.tmpdir()),r=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return v.join(e,`${t}${r}`)}var vs=new Set,DO=!1;function RO(){DO||(DO=!0,process.once("exit",()=>{T.rmtempSync()}))}var T=Object.assign(new Wt,{detachTemp(t){vs.delete(t)},mktempSync(t){for(RO();;){let e=PO("xfs-");try{this.mkdirSync(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=this.realpathSync(e);if(vs.add(r),typeof t!="undefined")try{return t(r)}finally{if(vs.has(r)){vs.delete(r);try{this.removeSync(r)}catch{}}}else return r}},async mktempPromise(t){for(RO();;){let e=PO("xfs-");try{await this.mkdirPromise(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=await this.realpathPromise(e);if(vs.add(r),typeof t!="undefined")try{return await t(r)}finally{if(vs.has(r)){vs.delete(r);try{await this.removePromise(r)}catch{}}}else return r}},async rmtempPromise(){await Promise.all(Array.from(vs.values()).map(async t=>{try{await T.removePromise(t,{maxRetries:0}),vs.delete(t)}catch{}}))},rmtempSync(){for(let t of vs)try{T.removeSync(t),vs.delete(t)}catch{}}});var vb=ie(bb()),Pn;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(Pn||(Pn={}));function dl(t){return t!==null&&typeof t.fd=="number"}var Cl=new Set;function Sb(){}function xb(){for(let t of Cl)t.kill()}async function to(t,e,{cwd:r,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":dl(s)&&(c[0]=s),dl(o)&&(c[1]=o),dl(a)&&(c[2]=a);let u=(0,vb.default)(t,e,{cwd:M.fromPortablePath(r),env:_(P({},i),{PWD:M.fromPortablePath(r)}),stdio:c});Cl.add(u),Cl.size===1&&(process.on("SIGINT",Sb),process.on("SIGTERM",xb)),!dl(s)&&s!==null&&s.pipe(u.stdin),dl(o)||u.stdout.pipe(o,{end:!1}),dl(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))dl(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,d)=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:kb(p,d)}):h(p!==null?new Error(`Child "${t}" exited with exit code ${p}`):new Error(`Child "${t}" exited with signal ${d}`))})})}async function Nhe(t,e,{cwd:r,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=M.fromPortablePath(r);typeof i.PWD!="undefined"&&(i=_(P({},i),{PWD:c}));let u=(0,vb.default)(t,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",()=>{f()}),u.on("close",(h,p)=>{let d=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),m=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:kb(h,p),stdout:d,stderr:m}):f(Object.assign(new Error(`Child "${t}" exited with exit code ${h} + +${m}`),{code:kb(h,p),stdout:d,stderr:m}))})})}var Lhe=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function kb(t,e){let r=Lhe.get(e);return typeof r!="undefined"?128+r:t!=null?t:1}var Pb={};it(Pb,{getDefaultGlobalFolder:()=>Rb,getHomeFolder:()=>uh,isFolderInside:()=>Fb});var Db=ie(require("os"));function Rb(){if(process.platform==="win32"){let t=M.toPortablePath(process.env.LOCALAPPDATA||M.join((0,Db.homedir)(),"AppData","Local"));return v.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=M.toPortablePath(process.env.XDG_DATA_HOME);return v.resolve(t,"yarn/berry")}return v.resolve(uh(),".yarn/berry")}function uh(){return M.toPortablePath((0,Db.homedir)()||"/usr/local/share")}function Fb(t,e){let r=v.relative(e,t);return r&&!r.startsWith("..")&&!v.isAbsolute(r)}var ue={};it(ue,{LogLevel:()=>Ts,Style:()=>Gl,Type:()=>Le,addLogFilterSupport:()=>Cp,applyColor:()=>On,applyHyperlink:()=>Ku,applyStyle:()=>Py,json:()=>Uu,mark:()=>xx,pretty:()=>Ve,prettyField:()=>Yl,prettyList:()=>Kx,supportsColor:()=>xy,supportsHyperlinks:()=>Mx,tuple:()=>jl});var pp=ie(jb()),dp=ie(ml()),o3=ie(Nn()),a3=ie(gU());var z;(function(te){te[te.UNNAMED=0]="UNNAMED",te[te.EXCEPTION=1]="EXCEPTION",te[te.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",te[te.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",te[te.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",te[te.BUILD_DISABLED=5]="BUILD_DISABLED",te[te.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",te[te.MUST_BUILD=7]="MUST_BUILD",te[te.MUST_REBUILD=8]="MUST_REBUILD",te[te.BUILD_FAILED=9]="BUILD_FAILED",te[te.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",te[te.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",te[te.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",te[te.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",te[te.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",te[te.REMOTE_INVALID=15]="REMOTE_INVALID",te[te.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",te[te.RESOLUTION_PACK=17]="RESOLUTION_PACK",te[te.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",te[te.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",te[te.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",te[te.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",te[te.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",te[te.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",te[te.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",te[te.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",te[te.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",te[te.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",te[te.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",te[te.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",te[te.FETCH_FAILED=30]="FETCH_FAILED",te[te.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",te[te.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",te[te.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",te[te.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",te[te.NETWORK_ERROR=35]="NETWORK_ERROR",te[te.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",te[te.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",te[te.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",te[te.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",te[te.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",te[te.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",te[te.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",te[te.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",te[te.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",te[te.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",te[te.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",te[te.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",te[te.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",te[te.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",te[te.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",te[te.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",te[te.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",te[te.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",te[te.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",te[te.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",te[te.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",te[te.INVALID_MANIFEST=57]="INVALID_MANIFEST",te[te.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",te[te.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",te[te.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",te[te.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",te[te.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",te[te.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",te[te.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",te[te.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",te[te.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",te[te.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",te[te.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",te[te.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",te[te.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",te[te.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",te[te.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",te[te.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",te[te.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",te[te.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",te[te.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",te[te.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE"})(z||(z={}));function KI(t){return`YN${t.toString(10).padStart(4,"0")}`}var de={};it(de,{BufferStream:()=>OH,CachingStrategy:()=>Dl,DefaultStream:()=>KH,assertNever:()=>Lv,bufferStream:()=>Cu,buildIgnorePattern:()=>DIe,convertMapsToIndexableObjects:()=>aE,dynamicRequire:()=>mu,escapeRegExp:()=>SIe,getArrayWithDefault:()=>hu,getFactoryWithDefault:()=>na,getMapWithDefault:()=>pu,getSetWithDefault:()=>Pl,isIndexableObject:()=>Tv,isPathLike:()=>RIe,isTaggedYarnVersion:()=>vIe,mapAndFilter:()=>kl,mapAndFind:()=>MH,overrideType:()=>Nv,parseBoolean:()=>Hh,parseOptionalBoolean:()=>jH,prettifyAsyncErrors:()=>du,prettifySyncErrors:()=>Mv,releaseAfterUseAsync:()=>kIe,replaceEnvVariables:()=>Ov,sortMap:()=>gn,tryParseOptionalBoolean:()=>Kv,validateEnum:()=>xIe});var vh={};it(vh,{Builtins:()=>Ev,Cli:()=>oo,Command:()=>ye,Option:()=>Y,UsageError:()=>me});var yl=0,Ih=1,Gi=2,sv="",hi="\0",Au=-1,ov=/^(-h|--help)(?:=([0-9]+))?$/,UI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,fU=/^-[a-zA-Z]{2,}$/,av=/^([^=]+)=([\s\S]*)$/,Av=process.env.DEBUG_CLI==="1";var me=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Eh=class extends Error{constructor(e,r){super();if(this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===r[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} + +${this.candidates.map(({usage:n})=>`$ ${n}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${i} +${lv(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${lv(e)}`}},cv=class extends Error{constructor(e,r){super();this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${lv(e)}`}},lv=t=>`While running ${t.filter(e=>e!==hi).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`;var yh=Symbol("clipanion/isOption");function ji(t){return _(P({},t),{[yh]:!0})}function so(t,e){return typeof t=="undefined"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function HI(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function wh(t,e){return e.length===1?new me(`${t}: ${HI(e[0],!0)}`):new me(`${t}: +${e.map(r=>` +- ${HI(r)}`).join("")}`)}function Bh(t,e,r){if(typeof r=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!r(e,{errors:i,coercions:n,coercion:s}))throw wh(`Invalid value for ${t}`,i);for(let[,a]of n)a();return e}var ye=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(typeof r!="undefined"){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(Ss(),lu)),a=o(n(s()),r),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw wh("Invalid option schema",l);for(let[,g]of c)g()}let i=await this.execute();return typeof i!="undefined"?i:0}};ye.isOption=yh;ye.Default=[];function un(t){Av&&console.log(t)}var BU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Au};function QU(){return{nodes:[qi(),qi(),qi()]}}function nCe(t){let e=QU(),r=[],i=e.nodes.length;for(let n of t){r.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=t.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)r(a);for(let[,{to:o}]of n.dynamics)r(o);for(let{to:o}of n.shortcuts)r(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=t.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};r(yl)}function oCe(t,{prefix:e=""}={}){if(Av){un(`${e}Nodes are:`);for(let r=0;rl!==Gi).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===Gi))throw new Eh(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=aCe(a)}if(i.length>0){un(" Results:");for(let s of i)un(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else un(" No results");return i}function ACe(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,hi)){for(let{to:r}of t.statics[hi])if(r===Ih)return!0}return!1}function cCe(t,e,r){let i=r&&e.length>0?[""]:[],n=vU(t,e,r),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let d=t.nodes[p],m=Object.keys(d.statics);for(let E of Object.keys(d.statics)){let B=m[0];for(let{to:b,reducer:R}of d.statics[B])R==="pushPath"&&(u||l.push(B),g.push(b))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=t.nodes[l],g=ACe(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==hi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===Gi)continue;let p=lCe(f,c);if(p!==null)for(let d of p)a([...i,d],l)}}return[...s].sort()}function gCe(t,e){let r=vU(t,[...e,hi]);return uCe(e,r.map(({state:i})=>i))}function aCe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function uCe(t,e){let r=e.filter(g=>g.selectedIndex!==null);if(r.length===0)throw new Error;let i=r.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Eh(t,r.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=fCe(c);if(u.length>1)throw new cv(t,u.map(g=>g.candidateUsage));return u[0]}function fCe(t){let e=[],r=[];for(let i of t)i.selectedIndex===Au?r.push(i):e.push(i);return r.length>0&&e.push(_(P({},BU),{path:SU(...r.map(i=>i.path)),options:r.reduce((i,n)=>i.concat(n.options),[])})),e}function SU(t,e,...r){return e===void 0?Array.from(t):SU(t.filter((i,n)=>i===e[n]),...r)}function qi(){return{dynamics:[],shortcuts:[],statics:{}}}function bU(t){return t===Ih||t===Gi}function Cv(t,e=0){return{to:bU(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function iCe(t,e=0){let r=qi();for(let[i,n]of t.dynamics)r.dynamics.push([i,Cv(n,e)]);for(let i of t.shortcuts)r.shortcuts.push(Cv(i,e));for(let[i,n]of Object.entries(t.statics))r.statics[i]=n.map(s=>Cv(s,e));return r}function pi(t,e,r,i,n){t.nodes[e].dynamics.push([r,{to:i,reducer:n}])}function cu(t,e,r,i){t.nodes[e].shortcuts.push({to:r,reducer:i})}function ta(t,e,r,i,n){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:i,reducer:n})}function jI(t,e,r,i){if(Array.isArray(e)){let[n,...s]=e;return t[n](r,i,...s)}else return t[e](r,i)}function lCe(t,e){let r=Array.isArray(t)?YI[t[0]]:YI[t];if(typeof r.suggest=="undefined")return null;let i=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...i)}var YI={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,i)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&fU.test(e)&&[...e.slice(1)].every(i=>r.includes(`-${i}`)),isBoundOption:(t,e,r,i)=>{let n=e.match(av);return!t.ignoreOptions&&!!n&&UI.test(n[1])&&r.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&ov.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&UI.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!UI.test(e)};YI.isOption.suggest=(t,e,r=!0)=>r?null:[e];var dv={setCandidateState:(t,e,r)=>P(P({},t),r),setSelectedIndex:(t,e,r)=>_(P({},t),{selectedIndex:r}),pushBatch:(t,e)=>_(P({},t),{options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,i]=e.match(av);return _(P({},t),{options:t.options.concat({name:r,value:i})})},pushPath:(t,e)=>_(P({},t),{path:t.path.concat(e)}),pushPositional:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:Ln})}),pushTrue:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>_(P({},t),{options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let i=_(P({},t),{options:[...t.options]}),n=t.options[t.options.length-1];return n.value=((r=n.value)!==null&&r!==void 0?r:[]).concat([e]),i},setStringValue:(t,e)=>{let r=_(P({},t),{options:[...t.options]}),i=t.options[t.options.length-1];return i.value=e,r},inhibateOptions:t=>_(P({},t),{ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,i]=e.match(ov);return typeof i!="undefined"?_(P({},t),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):_(P({},t),{options:[{name:"-c",value:String(r)}]})},setError:(t,e,r)=>e===hi?_(P({},t),{errorMessage:`${r}.`}):_(P({},t),{errorMessage:`${r} ("${e}").`}),setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return _(P({},t),{errorMessage:`Not enough arguments to option ${r.name}.`})}},Ln=Symbol(),xU=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:i,proxy:n})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Ln)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Ln?this.arity.extra.push(e):this.arity.extra!==Ln&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Ln)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Ln?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=QU(),r=yl,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);r=xs(e,qi()),ta(e,yl,sv,r,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=r;if(a.length>0){let f=xs(e,qi());cu(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=xs(e,qi());pi(e,l,"isHelp",f,["useHelp",this.cliIndex]),ta(e,f,hi,Ih,["setSelectedIndex",Au]),this.registerOptions(e,l)}this.arity.leading.length>0&&ta(e,l,hi,Gi,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&ta(e,h,hi,Gi,["setError","Not enough positional arguments"]),pi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Ln||this.arity.extra.length>0){let f=xs(e,qi());if(cu(e,c,f),this.arity.extra===Ln){let h=xs(e,qi());this.arity.proxy||this.registerOptions(e,h),pi(e,c,s,h,"pushExtraNoLimits"),pi(e,h,s,h,"pushExtraNoLimits"),cu(e,h,f)}else for(let h=0;h0&&ta(e,u,hi,Gi,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)pi(e,r,["isOption",s,i.hidden||s!==n],r,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&pi(e,r,["isNegatedOption",s],r,["pushFalse",s]);else{let s=xs(e,qi());for(let o of i.names)pi(e,r,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&egCe(i,n),suggest:(n,s)=>cCe(i,n,s)}}};var kU=80,mv=Array(kU).fill("\u2501");for(let t=0;t<=24;++t)mv[mv.length-t]=`[38;5;${232+t}m\u2501`;var Iv={header:t=>`\u2501\u2501\u2501 ${t}${t.length`${t}`,error:t=>`${t}`,code:t=>`${t}`},PU={header:t=>t,bold:t=>t,error:t=>t,code:t=>t};function hCe(t){let e=t.split(` +`),r=e.filter(n=>n.match(/\S/)),i=r.length>0?r.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` +`)}function Vn(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` +`),t=hCe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),t=t.replace(/\n(\n)?\n*/g,"$1"),r&&(t=t.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` +`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` +`)}).join(` + +`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),t?`${t} +`:""}var bh=class extends ye{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,r){let i=new bh(r);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}};var DU=Symbol("clipanion/errorCommand");function pCe(){return process.env.FORCE_COLOR==="0"?!1:!!(process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY)}var oo=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:i,enableColors:n=pCe()}={}){this.registrations=new Map,this.builder=new Qh({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=i,this.enableColors=n}static from(e,r={}){let i=new oo(r);for(let n of e)i.register(n);return i}register(e){var r;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[ye.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(r=e.paths)!==null&&r!==void 0?r:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:r,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case Au:return bh.from(n,r);default:{let{commandClass:s}=r[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[DU]=a,l}}break}}async run(e,r){let i;if(!Array.isArray(e))i=e;else try{i=this.process(e)}catch(s){return r.stdout.write(this.error(s)),1}if(i.help)return r.stdout.write(this.usage(i,{detailed:!0})),0;i.context=r,i.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(s,o)=>this.error(s,o),process:s=>this.process(s),run:(s,o)=>this.run(s,P(P({},r),o)),usage:(s,o)=>this.usage(s,o)};let n;try{n=await i.validateAndExecute().catch(s=>i.catch(s).then(()=>0))}catch(s){return r.stdout.write(this.error(s,{command:i})),1}return n}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:i}=this.builder.compile();return i(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Vn(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Vn(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Vn(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Vn(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return r}usage(e=null,{colored:r,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof ye?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Vn(l,{format:this.format(r),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` +`),(c!==""||u.length>0)&&(a+=`${this.format(r).header("Usage")} +`,a+=` +`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(r).bold(n)}${g} +`,f.length>0){a+=` +`,a+=`${Iv.header("Options")} +`;let h=f.reduce((p,d)=>Math.max(p,d.definition.length),0);a+=` +`;for(let{definition:p,description:d}of f)a+=` ${this.format(r).bold(p.padEnd(h))} ${Vn(d,{format:this.format(r),paragraphs:!1})}`}if(c!==""&&(a+=` +`,a+=`${this.format(r).header("Details")} +`,a+=` +`,a+=Vn(c,{format:this.format(r),paragraphs:!0})),u.length>0){a+=` +`,a+=`${this.format(r).header("Examples")} +`;for(let[h,p]of u)a+=` +`,a+=Vn(h,{format:this.format(r),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(r).bold(n)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(r).bold(n)}${l} +`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Vn(f.usage.category,{format:this.format(r),paragraphs:!1}):null,d=l.get(p);typeof d=="undefined"&&l.set(p,d=[]);let{usage:m}=this.getUsageByIndex(h);d.push({commandClass:f,usage:m})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:u?a+=`${this.format(r).header(`${this.binaryLabel}`)} +`:a+=`${this.format(r).header(`${this.binaryVersion}`)} +`,a+=` ${this.format(r).bold(n)}${this.binaryName} +`):a+=`${this.format(r).bold(n)}${this.binaryName} +`;for(let f of c){let h=l.get(f).slice().sort((d,m)=>d.usage.localeCompare(m.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` +`,a+=`${this.format(r).header(`${p}`)} +`;for(let{commandClass:d,usage:m}of h){let E=d.usage.description||"undocumented";a+=` +`,a+=` ${this.format(r).bold(m)} +`,a+=` ${Vn(E,{format:this.format(r),paragraphs:!1})}`}}a+=` +`,a+=Vn("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return a}error(e,r){var i,{colored:n,command:s=(i=e[DU])!==null&&i!==void 0?i:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} +`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` +`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} +`),o}getUsageByRegistration(e,r){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}format(e=this.enableColors){return e?Iv:PU}};oo.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr};var Ev={};it(Ev,{DefinitionsCommand:()=>qI,HelpCommand:()=>JI,VersionCommand:()=>WI});var qI=class extends ye{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};qI.paths=[["--clipanion=definitions"]];var JI=class extends ye{async execute(){this.context.stdout.write(this.cli.usage())}};JI.paths=[["-h"],["--help"]];var WI=class extends ye{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};WI.paths=[["-v"],["--version"]];var Y={};it(Y,{Array:()=>RU,Boolean:()=>FU,Counter:()=>NU,Proxy:()=>LU,Rest:()=>TU,String:()=>MU,applyValidator:()=>Bh,cleanValidationError:()=>HI,formatError:()=>wh,isOptionSymbol:()=>yh,makeCommandOption:()=>ji,rerouteArguments:()=>so});function RU(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function FU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function NU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function LU(t={}){return ji({definition(e,r){var i;e.addProxy({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){return i.positionals.map(({value:n})=>n)}})}function TU(t={}){return ji({definition(e,r){var i;e.addRest({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){let n=o=>{let a=i.positionals[o];return a.extra===Ln||a.extra===!1&&oo)}})}function dCe(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?Bh(g!=null?g:c,f,n.validator):f}})}function CCe(t={}){let{required:e=!0}=t;return ji({definition(r,i){var n;r.addPositional({name:(n=t.name)!==null&&n!==void 0?n:i,required:t.required})},transformer(r,i,n){var s;for(let o=0;oJSON.stringify(i)).join(", ")})`);return e}function kl(t,e){let r=[];for(let i of t){let n=e(i);n!==LH&&r.push(n)}return r}var LH=Symbol();kl.skip=LH;function MH(t,e){for(let r of t){let i=e(r);if(i!==TH)return i}}var TH=Symbol();MH.skip=TH;function Tv(t){return typeof t=="object"&&t!==null}function aE(t){if(t instanceof Map&&(t=Object.fromEntries(t)),Tv(t))for(let e of Object.keys(t)){let r=t[e];Tv(r)&&(t[e]=aE(r))}return t}function na(t,e,r){let i=t.get(e);return typeof i=="undefined"&&t.set(e,i=r()),i}function hu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=[]),r}function Pl(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Set),r}function pu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Map),r}async function kIe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function du(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function Mv(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Cu(t){return await new Promise((e,r)=>{let i=[];t.on("error",n=>{r(n)}),t.on("data",n=>{i.push(n)}),t.on("end",()=>{e(Buffer.concat(i))})})}var OH=class extends Fv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}},KH=class extends Fv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},Uh=eval("require");function UH(t){return Uh(M.fromPortablePath(t))}function HH(path){let physicalPath=M.fromPortablePath(path),currentCacheEntry=Uh.cache[physicalPath];delete Uh.cache[physicalPath];let result;try{result=UH(physicalPath);let freshCacheEntry=Uh.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{Uh.cache[physicalPath]=currentCacheEntry}return result}var GH=new Map;function PIe(t){let e=GH.get(t),r=T.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let i=HH(t);return GH.set(t,{mtime:r.mtimeMs,instance:i}),i}var Dl;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Dl||(Dl={}));function mu(t,{cachingStrategy:e=2}={}){switch(e){case 0:return HH(t);case 1:return PIe(t);case 2:return UH(t);default:throw new Error("Unsupported caching strategy")}}function gn(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(r.map(o=>s(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function DIe(t){return t.length===0?null:t.map(e=>`(${FH.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Ov(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new me(`Environment variable not found (${n})`)})}function Hh(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function jH(t){return typeof t=="undefined"?t:Hh(t)}function Kv(t){try{return jH(t)}catch{return null}}function RIe(t){return!!(M.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}var S={};it(S,{areDescriptorsEqual:()=>i3,areIdentsEqual:()=>cp,areLocatorsEqual:()=>up,areVirtualPackagesEquivalent:()=>XQe,bindDescriptor:()=>VQe,bindLocator:()=>_Qe,convertDescriptorToLocator:()=>By,convertLocatorToDescriptor:()=>WQe,convertPackageToLocator:()=>zQe,convertToIdent:()=>JQe,convertToManifestRange:()=>ebe,copyPackage:()=>ap,devirtualizeDescriptor:()=>Ap,devirtualizeLocator:()=>lp,getIdentVendorPath:()=>Lx,isPackageCompatible:()=>Sy,isVirtualDescriptor:()=>hA,isVirtualLocator:()=>Eo,makeDescriptor:()=>Yt,makeIdent:()=>Io,makeLocator:()=>Vi,makeRange:()=>by,parseDescriptor:()=>pA,parseFileStyleRange:()=>ZQe,parseIdent:()=>In,parseLocator:()=>Hl,parseRange:()=>Tu,prettyDependent:()=>Nx,prettyDescriptor:()=>Xt,prettyIdent:()=>Vr,prettyLocator:()=>lt,prettyLocatorNoColors:()=>Rx,prettyRange:()=>yy,prettyReference:()=>fp,prettyResolution:()=>Fx,prettyWorkspace:()=>hp,renamePackage:()=>op,slugifyIdent:()=>Dx,slugifyLocator:()=>Mu,sortDescriptors:()=>Ou,stringifyDescriptor:()=>En,stringifyIdent:()=>St,stringifyLocator:()=>is,tryParseDescriptor:()=>gp,tryParseIdent:()=>n3,tryParseLocator:()=>Qy,virtualizeDescriptor:()=>kx,virtualizePackage:()=>Px});var Lu=ie(require("querystring")),e3=ie(Or()),t3=ie(wY());var mn={};it(mn,{checksumFile:()=>Iy,checksumPattern:()=>Ey,makeHash:()=>zi});var my=ie(require("crypto")),Sx=ie(vx());function zi(...t){let e=(0,my.createHash)("sha512"),r="";for(let i of t)typeof i=="string"?r+=i:i&&(r&&(e.update(r),r=""),e.update(i));return r&&e.update(r),e.digest("hex")}async function Iy(t,{baseFs:e,algorithm:r}={baseFs:T,algorithm:"sha512"}){let i=await e.openPromise(t,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,my.createHash)(r),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function Ey(t,{cwd:e}){let i=(await(0,Sx.default)(t,{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,Sx.default)([t,...i],{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=M.toPortablePath(a),u=await T.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await T.readlinkPromise(c))):u.isFile()&&l.push(await T.readFilePromise(c)),l.join("\0")})),o=(0,my.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var wy="virtual:",YQe=5,r3=/(os|cpu)=([a-z0-9_-]+)/,qQe=(0,t3.makeParser)(r3);function Io(t,e){if(t==null?void 0:t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:zi(t,e),scope:t,name:e}}function Yt(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:zi(t.identHash,e),range:e}}function Vi(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:zi(t.identHash,e),reference:e}}function JQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function By(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function WQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function zQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function op(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function ap(t){return op(t,t)}function kx(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return Yt(t,`virtual:${e}#${t.range}`)}function Px(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return op(t,Vi(t,`virtual:${e}#${t.reference}`))}function hA(t){return t.range.startsWith(wy)}function Eo(t){return t.reference.startsWith(wy)}function Ap(t){if(!hA(t))throw new Error("Not a virtual descriptor");return Yt(t,t.range.replace(/^[^#]*#/,""))}function lp(t){if(!Eo(t))throw new Error("Not a virtual descriptor");return Vi(t,t.reference.replace(/^[^#]*#/,""))}function VQe(t,e){return t.range.includes("::")?t:Yt(t,`${t.range}::${Lu.default.stringify(e)}`)}function _Qe(t,e){return t.reference.includes("::")?t:Vi(t,`${t.reference}::${Lu.default.stringify(e)}`)}function cp(t,e){return t.identHash===e.identHash}function i3(t,e){return t.descriptorHash===e.descriptorHash}function up(t,e){return t.locatorHash===e.locatorHash}function XQe(t,e){if(!Eo(t))throw new Error("Invalid package type");if(!Eo(e))throw new Error("Invalid package type");if(!cp(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let i=e.dependencies.get(r.identHash);if(!i||!i3(r,i))return!1}return!0}function In(t){let e=n3(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function n3(t){let e=t.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,r,i]=e,n=typeof r!="undefined"?r:null;return Io(n,i)}function pA(t,e=!1){let r=gp(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function gp(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid range (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Yt(Io(o,n),a)}function Hl(t,e=!1){let r=Qy(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function Qy(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid reference (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Vi(Io(o,n),a)}function Tu(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let i=typeof r[1]!="undefined"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof r[3]!="undefined"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${t})`);let s=typeof r[3]!="undefined"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),o=(e==null?void 0:e.parseSelector)?Lu.default.parse(s):s,a=typeof r[4]!="undefined"?Lu.default.parse(r[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ZQe(t,{protocol:e}){let{selector:r,params:i}=Tu(t,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Hl(i.locator,!0),path:r}}function s3(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function $Qe(t){return t===null?!1:Object.entries(t).length>0}function by({protocol:t,source:e,selector:r,params:i}){let n="";return t!==null&&(n+=`${t}`),e!==null&&(n+=`${s3(e)}#`),n+=s3(r),$Qe(i)&&(n+=`::${Lu.default.stringify(i)}`),n}function ebe(t){let{params:e,protocol:r,source:i,selector:n}=Tu(t);for(let s in e)s.startsWith("__")&&delete e[s];return by({protocol:r,source:i,params:e,selector:n})}function St(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function En(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function is(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function Dx(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function Mu(t){let{protocol:e,selector:r}=Tu(t.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=e3.default.valid(r),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=t.scope?`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`:`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`;return kr(a)}function Vr(t,e){return e.scope?`${Ve(t,`@${e.scope}/`,Le.SCOPE)}${Ve(t,e.name,Le.NAME)}`:`${Ve(t,e.name,Le.NAME)}`}function vy(t){if(t.startsWith(wy)){let e=vy(t.substr(t.indexOf("#")+1)),r=t.substr(wy.length,YQe);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function yy(t,e){return`${Ve(t,vy(e),Le.RANGE)}`}function Xt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.RANGE)}${yy(t,e.range)}`}function fp(t,e){return`${Ve(t,vy(e),Le.REFERENCE)}`}function lt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.REFERENCE)}${fp(t,e.reference)}`}function Rx(t){return`${St(t)}@${vy(t.reference)}`}function Ou(t){return gn(t,[e=>St(e),e=>e.range])}function hp(t,e){return Vr(t,e.locator)}function Fx(t,e,r){let i=hA(e)?Ap(e):e;return r===null?`${Xt(t,i)} \u2192 ${xx(t).Cross}`:i.identHash===r.identHash?`${Xt(t,i)} \u2192 ${fp(t,r.reference)}`:`${Xt(t,i)} \u2192 ${lt(t,r)}`}function Nx(t,e,r){return r===null?`${lt(t,e)}`:`${lt(t,e)} (via ${yy(t,r.range)})`}function Lx(t){return`node_modules/${St(t)}`}function Sy(t,e){return t.conditions?qQe(t.conditions,r=>{let[,i,n]=r.match(r3),s=e[i];return s?s.includes(n):!0}):!0}var gt;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(gt||(gt={}));var oi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(oi||(oi={}));var ki;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(ki||(ki={}));var Le={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING"},Gl;(function(e){e[e.BOLD=2]="BOLD"})(Gl||(Gl={}));var Tx=dp.default.GITHUB_ACTIONS?{level:2}:pp.default.supportsColor?{level:pp.default.supportsColor.level}:{level:0},xy=Tx.level!==0,Mx=xy&&!dp.default.GITHUB_ACTIONS&&!dp.default.CIRCLE&&!dp.default.GITLAB,Ox=new pp.default.Instance(Tx),tbe=new Map([[Le.NO_HINT,null],[Le.NULL,["#a853b5",129]],[Le.SCOPE,["#d75f00",166]],[Le.NAME,["#d7875f",173]],[Le.RANGE,["#00afaf",37]],[Le.REFERENCE,["#87afff",111]],[Le.NUMBER,["#ffd700",220]],[Le.PATH,["#d75fd7",170]],[Le.URL,["#d75fd7",170]],[Le.ADDED,["#5faf00",70]],[Le.REMOVED,["#d70000",160]],[Le.CODE,["#87afff",111]],[Le.SIZE,["#ffd700",220]]]),Ls=t=>t,ky={[Le.NUMBER]:Ls({pretty:(t,e)=>`${e}`,json:t=>t}),[Le.IDENT]:Ls({pretty:(t,e)=>Vr(t,e),json:t=>St(t)}),[Le.LOCATOR]:Ls({pretty:(t,e)=>lt(t,e),json:t=>is(t)}),[Le.DESCRIPTOR]:Ls({pretty:(t,e)=>Xt(t,e),json:t=>En(t)}),[Le.RESOLUTION]:Ls({pretty:(t,{descriptor:e,locator:r})=>Fx(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:En(t),locator:e!==null?is(e):null})}),[Le.DEPENDENT]:Ls({pretty:(t,{locator:e,descriptor:r})=>Nx(t,e,r),json:({locator:t,descriptor:e})=>({locator:is(t),descriptor:En(e)})}),[Le.PACKAGE_EXTENSION]:Ls({pretty:(t,e)=>{switch(e.type){case oi.Dependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"dependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependencyMeta:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependenciesMeta",Le.CODE)} \u27A4 ${Vr(t,In(e.selector))} \u27A4 ${On(t,e.key,Le.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case oi.Dependency:return`${St(t.parentDescriptor)} > ${St(t.descriptor)}`;case oi.PeerDependency:return`${St(t.parentDescriptor)} >> ${St(t.descriptor)}`;case oi.PeerDependencyMeta:return`${St(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Le.SETTING]:Ls({pretty:(t,e)=>(t.get(e),Ku(t,On(t,e,Le.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Le.DURATION]:Ls({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),i=Math.ceil((e-r*60*1e3)/1e3);return i===0?`${r}m`:`${r}m ${i}s`}else{let r=Math.floor(e/1e3),i=e-r*1e3;return i===0?`${r}s`:`${r}s ${i}ms`}},json:t=>t}),[Le.SIZE]:Ls({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],i=r.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return On(t,`${s} ${r[i-1]}`,Le.NUMBER)},json:t=>t}),[Le.PATH]:Ls({pretty:(t,e)=>On(t,M.fromPortablePath(e),Le.PATH),json:t=>M.fromPortablePath(t)})};function jl(t,e){return[e,t]}function Py(t,e,r){return t.get("enableColors")&&r&2&&(e=pp.default.bold(e)),e}function On(t,e,r){if(!t.get("enableColors"))return e;let i=tbe.get(r);if(i===null)return e;let n=typeof i=="undefined"?r:Tx.level>=3?i[0]:i[1],s=typeof n=="number"?Ox.ansi256(n):n.startsWith("#")?Ox.hex(n):Ox[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var rbe=!!process.env.KONSOLE_VERSION;function Ku(t,e,r){return t.get("enableHyperlinks")?rbe?`]8;;${r}\\${e}]8;;\\`:`]8;;${r}\x07${e}]8;;\x07`:e}function Ve(t,e,r){if(e===null)return On(t,"null",Le.NULL);if(Object.prototype.hasOwnProperty.call(ky,r))return ky[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return On(t,e,r)}function Kx(t,e,r,{separator:i=", "}={}){return[...e].map(n=>Ve(t,n,r)).join(i)}function Uu(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(ky,e))return Nv(e),ky[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function xx(t){return{Check:On(t,"\u2713","green"),Cross:On(t,"\u2718","red"),Question:On(t,"?","cyan")}}function Yl(t,{label:e,value:[r,i]}){return`${Ve(t,e,Le.CODE)}: ${Ve(t,r,i)}`}var Ts;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(Ts||(Ts={}));function Cp(t,{configuration:e}){let r=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of r){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let d=g.get("pattern");typeof d!="undefined"&&s.push([o3.default.matcher(d,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===z.UNNAMED)return h;let p=n.size>0||s.length>0?(0,a3.default)(f):f;if(n.size>0){let d=n.get(p);if(typeof d!="undefined")return d!=null?d:h}if(s.length>0){for(let[d,m]of s)if(d(p))return m!=null?m:h}if(i.size>0){let d=i.get(KI(g));if(typeof d!="undefined")return d!=null?d:h}return h},a=t.reportInfo,l=t.reportWarning,c=t.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case Ts.Info:a.call(g,f,h);break;case Ts.Warning:l.call(g,f!=null?f:z.UNNAMED,h);break;case Ts.Error:c.call(g,f!=null?f:z.UNNAMED,h);break}};t.reportInfo=function(...g){return u(this,...g,Ts.Info)},t.reportWarning=function(...g){return u(this,...g,Ts.Warning)},t.reportError=function(...g){return u(this,...g,Ts.Error)}}var Zt={};it(Zt,{Method:()=>Jl,RequestError:()=>z8.RequestError,del:()=>pxe,get:()=>fxe,getNetworkSettings:()=>Z8,post:()=>iP,put:()=>hxe,request:()=>xp});var q8=ie(zy()),J8=ie(require("https")),W8=ie(require("http")),tP=ie(Nn()),rP=ie(G8()),Vy=ie(require("url"));var j8=ie(require("stream")),Y8=ie(require("string_decoder"));var nt=class extends Error{constructor(e,r,i){super(r);this.reportExtra=i;this.reportCode=e}};function Axe(t){return typeof t.reportCode!="undefined"}var Xi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),r=l,c()},o=(l=0)=>{s(r+1)},a=async function*(){for(;r{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),r}};var z8=ie(zy()),V8=new Map,_8=new Map,lxe=new W8.Agent({keepAlive:!0}),cxe=new J8.Agent({keepAlive:!0});function X8(t){let e=new Vy.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),{proxy:r}}async function uxe(t){return na(_8,t,()=>T.readFilePromise(t).then(e=>(_8.set(t,e),e)))}function gxe({statusCode:t,statusMessage:e},r){let i=Ve(r,t,Le.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Ku(r,`${i}${e?` (${e})`:""}`,n)}async function _y(t,{configuration:e,customErrorMessage:r}){var i,n;try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=r==null?void 0:r(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof q8.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${Ve(e,"httpTimeout",Le.SETTING)})`);let a=new nt(z.NETWORK_ERROR,o,l=>{s.response&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Response Code",value:jl(Le.NO_HINT,gxe(s.response,e))})}`),s.request&&(l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Method",value:jl(Le.NO_HINT,s.request.options.method)})}`),l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request URL",value:jl(Le.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Redirects",value:jl(Le.NO_HINT,Kx(e,s.request.redirects,Le.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Retry Count",value:jl(Le.NO_HINT,`${Ve(e,s.request.retryCount,Le.NUMBER)} (can be increased via ${Ve(e,"httpRetry",Le.SETTING)})`)})}`)});throw a.originalError=s,a}}function Z8(t,e){let r=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0},n=Object.keys(i),s=typeof t=="string"?new Vy.URL(t):t;for(let[o,a]of r)if(tP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Jl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Jl||(Jl={}));async function xp(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=Jl.GET}){let a=typeof t=="string"?new Vy.URL(t):t,l=Z8(a,{configuration:r});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!tP.default.isMatch(a.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?rP.default.httpOverHttp(X8(l.httpProxy)):lxe,https:l.httpsProxy?rP.default.httpsOverHttp(X8(l.httpsProxy)):cxe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=r.get("httpTimeout"),f=r.get("httpRetry"),h=r.get("enableStrictSsl"),p=l.caFilePath,{default:d}=await Promise.resolve().then(()=>ie(zy())),m=p?await uxe(p):void 0,E=d.extend(P({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:m}},u));return r.getLimit("networkConcurrency")(()=>E(a))}async function fxe(t,n){var s=n,{configuration:e,jsonResponse:r}=s,i=qr(s,["configuration","jsonResponse"]);let o=na(V8,t,()=>_y(xp(t,null,P({configuration:e},i)),{configuration:e}).then(a=>(V8.set(t,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),r?JSON.parse(o.toString()):o}async function hxe(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.PUT})),i)).body}async function iP(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.POST})),i)).body}async function pxe(t,i){var n=i,{customErrorMessage:e}=n,r=qr(n,["customErrorMessage"]);return(await _y(xp(t,null,_(P({},r),{method:Jl.DELETE})),r)).body}var Kt={};it(Kt,{PackageManager:()=>tn,detectPackageManager:()=>a9,executePackageAccessibleBinary:()=>g9,executePackageScript:()=>Uw,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>qFe,executeWorkspaceLifecycleScript:()=>u9,executeWorkspaceScript:()=>c9,getPackageAccessibleBinaries:()=>Hw,getWorkspaceAccessibleBinaries:()=>l9,hasPackageScript:()=>GFe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Vp,maybeExecuteWorkspaceLifecycleScript:()=>YFe,prepareExternalProject:()=>HFe});var Fp={};it(Fp,{getLibzipPromise:()=>$i,getLibzipSync:()=>vz});var yA=["number","number"],nP;(function(D){D[D.ZIP_ER_OK=0]="ZIP_ER_OK",D[D.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",D[D.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",D[D.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",D[D.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",D[D.ZIP_ER_READ=5]="ZIP_ER_READ",D[D.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",D[D.ZIP_ER_CRC=7]="ZIP_ER_CRC",D[D.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",D[D.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",D[D.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",D[D.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",D[D.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",D[D.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",D[D.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",D[D.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",D[D.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",D[D.ZIP_ER_EOF=17]="ZIP_ER_EOF",D[D.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",D[D.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",D[D.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",D[D.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",D[D.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",D[D.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",D[D.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",D[D.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",D[D.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",D[D.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",D[D.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",D[D.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",D[D.ZIP_ER_TELL=30]="ZIP_ER_TELL",D[D.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(nP||(nP={}));var $8=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:nP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,open:t.cwrap("zip_open","number",["string","number","number"]),openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...yA,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...yA,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...yA,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...yA,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...yA,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...yA,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...yA,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...yA,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}});var BP=null;function vz(){return BP===null&&(BP=$8(bz())),BP}async function $i(){return vz()}var jp={};it(jp,{ShellError:()=>as,execute:()=>Fw,globUtils:()=>bw});var Hp={};it(Hp,{parseResolution:()=>gw,parseShell:()=>Aw,parseSyml:()=>Ei,stringifyArgument:()=>SP,stringifyArgumentSegment:()=>xP,stringifyArithmeticExpression:()=>uw,stringifyCommand:()=>vP,stringifyCommandChain:()=>rg,stringifyCommandChainThen:()=>bP,stringifyCommandLine:()=>lw,stringifyCommandLineThen:()=>QP,stringifyEnvSegment:()=>cw,stringifyRedirectArgument:()=>Np,stringifyResolution:()=>fw,stringifyShell:()=>tg,stringifyShellLine:()=>tg,stringifySyml:()=>Qa,stringifyValueArgument:()=>ig});var kz=ie(xz());function Aw(t,e={isGlobPattern:()=>!1}){try{return(0,kz.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function tg(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:i},n)=>`${lw(r)}${i===";"?n!==t.length-1||e?";":"":" &"}`).join(" ")}function lw(t){return`${rg(t.chain)}${t.then?` ${QP(t.then)}`:""}`}function QP(t){return`${t.type} ${lw(t.line)}`}function rg(t){return`${vP(t)}${t.then?` ${bP(t.then)}`:""}`}function bP(t){return`${t.type} ${rg(t.chain)}`}function vP(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cw(e)).join(" ")} `:""}${t.args.map(e=>SP(e)).join(" ")}`;case"subshell":return`(${tg(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"group":return`{ ${tg(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cw(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cw(t){return`${t.name}=${t.args[0]?ig(t.args[0]):""}`}function SP(t){switch(t.type){case"redirection":return Np(t);case"argument":return ig(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Np(t){return`${t.subtype} ${t.args.map(e=>ig(e)).join(" ")}`}function ig(t){return t.segments.map(e=>xP(e)).join("")}function xP(t){let e=(i,n)=>n?`"${i}"`:i,r=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${tg(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue=="undefined"?`\${${t.name}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(i=>ig(i)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${uw(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function uw(t){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},r=(n,s)=>s?`( ${n} )`:n,i=n=>r(uw(n),!["number","variable"].includes(n.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${i(t.left)} ${e(t.type)} ${i(t.right)}`}}var Rz=ie(Dz());function gw(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,Rz.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fw(t){let e="";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+="/"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var Qw=ie(w5()),b5=ie(Q5()),$De=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,v5=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],HP=class{constructor(e){this.data=e}};function S5(t){return t.match($De)?t:JSON.stringify(t)}function x5(t){return typeof t=="undefined"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>x5(t[e])):!1}function GP(t,e,r){if(t===null)return`null +`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} +`;if(typeof t=="string")return`${S5(t)} +`;if(Array.isArray(t)){if(t.length===0)return`[] +`;let i=" ".repeat(e);return` +${t.map(s=>`${i}- ${GP(s,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let i,n;t instanceof HP?(i=t.data,n=!1):(i=t,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=v5.indexOf(l),g=v5.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!x5(i[l])).map((l,c)=>{let u=i[l],g=S5(l),f=GP(u,e+1,!0),h=c>0||r?s:"";return f.startsWith(` +`)?`${h}${g}:${f}`:`${h}${g}: ${f}`}).join(e===0?` +`:"")||` +`;return r?` +${a}`:`${a}`}throw new Error(`Unsupported value type (${t})`)}function Qa(t){try{let e=GP(t,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Qa.PreserveOrdering=HP;function eRe(t){return t.endsWith(` +`)||(t+=` +`),(0,b5.parse)(t)}var tRe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function rRe(t){if(tRe.test(t))return eRe(t);let e=(0,Qw.safeLoad)(t,{schema:Qw.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Ei(t){return rRe(t)}var U5=ie(jb()),H5=ie(require("os")),Kn=ie(require("stream")),G5=ie(require("util"));var as=class extends Error{constructor(e){super(e);this.name="ShellError"}};var bw={};it(bw,{fastGlobOptions:()=>D5,isBraceExpansion:()=>R5,isGlobPattern:()=>iRe,match:()=>nRe,micromatchOptions:()=>Sw});var k5=ie(gy()),P5=ie(require("fs")),vw=ie(Nn()),Sw={strictBrackets:!0},D5={onlyDirectories:!1,onlyFiles:!1};function iRe(t){if(!vw.default.scan(t,Sw).isGlob)return!1;try{vw.default.parse(t,Sw)}catch{return!1}return!0}function nRe(t,{cwd:e,baseFs:r}){return(0,k5.default)(t,_(P({},D5),{cwd:M.fromPortablePath(e),fs:SI(P5.default,new ah(r))}))}function R5(t){return vw.default.scan(t,Sw).isBrace}var F5=ie(bb()),Bo=ie(require("stream")),N5=ie(require("string_decoder")),wn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(wn||(wn={}));var sc=new Set;function jP(){}function YP(){for(let t of sc)t.kill()}function L5(t,e,r,i){return n=>{let s=n[0]instanceof Bo.Transform?"pipe":n[0],o=n[1]instanceof Bo.Transform?"pipe":n[1],a=n[2]instanceof Bo.Transform?"pipe":n[2],l=(0,F5.default)(t,e,_(P({},i),{stdio:[s,o,a]}));return sc.add(l),sc.size===1&&(process.on("SIGINT",jP),process.on("SIGTERM",YP)),n[0]instanceof Bo.Transform&&n[0].pipe(l.stdin),n[1]instanceof Bo.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof Bo.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),u.code){case"ENOENT":n[2].write(`command not found: ${t} +`),c(127);break;case"EACCES":n[2].write(`permission denied: ${t} +`),c(128);break;default:n[2].write(`uncaught error: ${u.message} +`),c(1);break}}),l.on("exit",u=>{sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),c(u!==null?u:129)})})}}}function T5(t){return e=>{let r=e[0]==="pipe"?new Bo.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}var Os=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},M5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Gp=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:i,stderr:n}){let s=new Gp(null,e);return s.stdin=r,s.stdout=i,s.stderr=n,s}pipeTo(e,r=1){let i=new Gp(this,e),n=new M5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(r&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(r.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function xw(t,e){return Gp.start(t,e)}function O5(t,e=null){let r=new Bo.PassThrough,i=new N5.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",t(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&t(e!==null?`${e} ${s}`:s)}),r}function K5(t,{prefix:e}){return{stdout:O5(r=>t.stdout.write(`${r} +`),t.stdout.isTTY?e:null),stderr:O5(r=>t.stderr.write(`${r} +`),t.stderr.isTTY?e:null)}}var sRe=(0,G5.promisify)(setTimeout);var Fi;(function(r){r[r.Readable=1]="Readable",r[r.Writable=2]="Writable"})(Fi||(Fi={}));function j5(t,e,r){let i=new Kn.PassThrough({autoDestroy:!0});switch(t){case wn.STDIN:(e&1)==1&&r.stdin.pipe(i,{end:!1}),(e&2)==2&&r.stdin instanceof Kn.Writable&&i.pipe(r.stdin,{end:!1});break;case wn.STDOUT:(e&1)==1&&r.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stdout,{end:!1});break;case wn.STDERR:(e&1)==1&&r.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stderr,{end:!1});break;default:throw new as(`Bad file descriptor: "${t}"`)}return i}function kw(t,e={}){let r=P(P({},t),e);return r.environment=P(P({},t.environment),e.environment),r.variables=P(P({},t.variables),e.variables),r}var oRe=new Map([["cd",async([t=(0,H5.homedir)(),...e],r,i)=>{let n=v.resolve(i.cwd,M.toPortablePath(t));if(!(await r.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new as(`cd: no such file or directory: ${t}`):o})).isDirectory())throw new as(`cd: not a directory: ${t}`);return i.cwd=n,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${M.fromPortablePath(r.cwd)} +`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,i)=>i.exitCode=parseInt(t!=null?t:i.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} +`),0)],["sleep",async([t],e,r)=>{if(typeof t=="undefined")throw new as("sleep: missing operand");let i=Number(t);if(Number.isNaN(i))throw new as(`sleep: invalid time interval '${t}'`);return await sRe(1e3*i,0)}],["__ysh_run_procedure",async(t,e,r)=>{let i=r.procedures[t[0]];return await xw(i,{stdin:new Os(r.stdin),stdout:new Os(r.stdout),stderr:new Os(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let i=r.stdin,n=r.stdout,s=r.stderr,o=[],a=[],l=[],c=0;for(;t[c]!=="--";){let g=t[c++],{type:f,fd:h}=JSON.parse(g),p=B=>{switch(h){case null:case 0:o.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},d=B=>{switch(h){case null:case 1:a.push(B);break;case 2:l.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=Number(t[c++]),E=c+m;for(let B=c;Be.baseFs.createReadStream(v.resolve(r.cwd,M.toPortablePath(t[B]))));break;case"<<<":p(()=>{let b=new Kn.PassThrough;return process.nextTick(()=>{b.write(`${t[B]} +`),b.end()}),b});break;case"<&":p(()=>j5(Number(t[B]),1,r));break;case">":case">>":{let b=v.resolve(r.cwd,M.toPortablePath(t[B]));d(b==="/dev/null"?new Kn.Writable({autoDestroy:!0,emitClose:!0,write(R,H,L){setImmediate(L)}}):e.baseFs.createWriteStream(b,f===">>"?{flags:"a"}:void 0))}break;case">&":d(j5(Number(t[B]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new Kn.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new Kn.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new Kn.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await xw(Yp(t.slice(c+1),e,r),{stdin:new Os(i),stdout:new Os(n),stderr:new Os(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function aRe(t,e,r){let i=[],n=new Kn.PassThrough;return n.on("data",s=>i.push(s)),await Pw(t,e,kw(r,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function Y5(t,e,r){let i=t.map(async s=>{let o=await oc(s.args,e,r);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Dw(t){return t.match(/[^ \r\n\t]+/g)||[]}async function q5(t,e,r,i,n=i){switch(t.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(t.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Dw(s);for(let a=0;a=0&&st+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)};async function qp(t,e,r){if(t.type==="number"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: "${t.value}", only integers are allowed`)}else if(t.type==="variable"){let i=[];await q5(_(P({},t),{quoted:!0}),e,r,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?qp({type:"variable",name:i.join(" ")},e,r):qp({type:"number",value:n},e,r)}else return ARe[t.type](await qp(t.left,e,r),await qp(t.right,e,r))}async function oc(t,e,r){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of t){let g=!1;switch(u.type){case"redirection":{let f=await oc(u.args,e,r);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await aRe(f.shell,e,r);if(f.quoted)o(h);else{let p=Dw(h);for(let d=0;d0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Yp(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let i=M.fromPortablePath(r.cwd),n=r.environment;typeof n.PWD!="undefined"&&(n=_(P({},n),{PWD:i}));let[s,...o]=t;if(s==="command")return L5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return T5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=r;r.stdin=l,r.stdout=c,r.stderr=u;try{return await a(o,e,r)}finally{r.stdin=g,r.stdout=f,r.stderr=h}})}function lRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,kw(r,{stdin:n}));return{stdin:n,promise:s}}}function cRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,r);return{stdin:n,promise:s}}}function J5(t,e,r,i){if(e.length===0)return t;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=P({},i.procedures),i.procedures[n]=t,Yp([...e,"__ysh_run_procedure",n],r,i)}}async function W5(t,e,r){let i=t,n=null,s=null;for(;i;){let o=i.then?P({},r):r,a;switch(i.type){case"command":{let l=await oc(i.args,e,r),c=await Y5(i.envs,e,r);a=i.envs.length?Yp(l,e,kw(o,{environment:c})):Yp(l,e,o)}break;case"subshell":{let l=await oc(i.args,e,r),c=lRe(i.subshell,e,o);a=J5(c,l,e,o)}break;case"group":{let l=await oc(i.args,e,r),c=cRe(i.group,e,o);a=J5(c,l,e,o)}break;case"envs":{let l=await Y5(i.envs,e,r);o.environment=P(P({},o.environment),l),a=Yp(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=xw(a,{stdin:new Os(o.stdin),stdout:new Os(o.stdout),stderr:new Os(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,wn.STDOUT);break;case"|&":s=s.pipeTo(a,wn.STDOUT|wn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function uRe(t,e,r,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return U5.default.hex(a)}if(i){let s=r.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=K5(r,{prefix:l});return r.backgroundJobs.push(W5(t,e,kw(r,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${l}, '${o(rg(t))}' has ended +`)})),0}return await W5(t,e,r)}async function gRe(t,e,r,{background:i=!1}={}){let n,s=a=>{n=a,r.variables["?"]=String(a)},o=async a=>{try{return await uRe(a.chain,e,r,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof as))throw l;return r.stderr.write(`${l.message} +`),1}};for(s(await o(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":n===0&&s(await o(t.then.line));break;case"||":n!==0&&s(await o(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return n}async function Pw(t,e,r){let i=r.backgroundJobs;r.backgroundJobs=[];let n=0;for(let{command:s,type:o}of t){if(n=await gRe(s,e,r,{background:o==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(n)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=i,n}function z5(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>Rw(e));case"arithmetic":return qP(t.arithmetic);case"shell":return JP(t.shell);default:return!1}}function Rw(t){switch(t.type){case"redirection":return t.args.some(e=>Rw(e));case"argument":return t.segments.some(e=>z5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function qP(t){switch(t.type){case"variable":return z5(t);case"number":return!1;default:return qP(t.left)||qP(t.right)}}function JP(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let i;switch(r.type){case"subshell":i=JP(r.subshell);break;case"command":i=r.envs.some(n=>n.args.some(s=>Rw(s)))||r.args.some(n=>Rw(n));break}if(i)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Fw(t,e=[],{baseFs:r=new Wt,builtins:i={},cwd:n=M.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=bw}={}){let g={};for(let[p,d]of Object.entries(s))typeof d!="undefined"&&(g[p]=d);let f=new Map(oRe);for(let[p,d]of Object.entries(i))f.set(p,d);o===null&&(o=new Kn.PassThrough,o.end());let h=Aw(t,u);if(!JP(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let d=p.chain;for(;d.then;)d=d.then.chain;d.type==="command"&&(d.args=d.args.concat(e.map(m=>({type:"argument",segments:[{type:"text",text:m}]}))))}return await Pw(h,{args:e,baseFs:r,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var s9=ie(ZP()),o9=ie(Wp()),cc=ie(require("stream"));var J6=ie(Or());var zp=class{supportsDescriptor(e,r){return!!(e.range.startsWith(zp.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(zp.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.getWorkspaceByCwd(e.reference.slice(zp.protocol.length));return _(P({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:gt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},Yr=zp;Yr.protocol="workspace:";var qt={};it(qt,{SemVer:()=>j6.SemVer,satisfiesWithPrereleases:()=>lc,validRange:()=>Us});var Lw=ie(Or()),j6=ie(Or()),Y6=new Map;function lc(t,e,r=!1){if(!t)return!1;let i=`${e}${r}`,n=Y6.get(i);if(typeof n=="undefined")try{n=new Lw.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Y6.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Lw.default.SemVer(t,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var q6=new Map;function Us(t){if(t.indexOf(":")!==-1)return null;let e=q6.get(t);if(typeof e!="undefined")return e;try{e=new Lw.default.Range(t)}catch{e=null}return q6.set(t,e),e}var vA=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new Wt}={}){let i=v.join(e,"package.json");return await r.existsPromise(i)?await vA.fromFile(i,{baseFs:r}):null}static async find(e,{baseFs:r}={}){let i=await vA.tryFind(e,{baseFs:r});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:r=new Wt}={}){let i=new vA;return await i.loadFile(e,{baseFs:r}),i}static fromText(e){let r=new vA;return r.loadFromText(e),r}static isManifestFieldCompatible(e,r){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,r===s.slice(1))return!1}else if(i=!1,s===r)return!0;return n&&i}loadFromText(e){let r;try{r=JSON.parse(z6(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(r),this.indent=W6(e)}async loadFile(e,{baseFs:r=new Wt}){let i=await r.readFilePromise(e,"utf8"),n;try{n=JSON.parse(z6(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=W6(i)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=In(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=en(e.main):this.main=null,typeof e.module=="string"?this.module=en(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=en(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(en(s),typeof o=="string"?en(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,en(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.bin.set(s,en(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=In(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=In(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=In(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(Yr.protocol)&&!Us(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=Yt(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=pA(s),l=this.ensureDependencyMeta(a),c=Tw(o.built,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=Tw(o.optional,{yamlCompatibilityMode:r});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=Tw(o.unplugged,{yamlCompatibilityMode:r});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=pA(s),l=this.ensurePeerDependencyMeta(a),c=Tw(o.optional,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:gw(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=en(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=en(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=en(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(en(s),typeof o=="string"?en(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,en(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,en(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(en(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=In(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l);let c=Yt(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(V6("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(V6("cpu",this.cpu)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return vA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return vA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!J6.default.valid(e.range))throw new Error(`Invalid meta field range for '${En(e)}'`);let r=St(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(r);n||this.dependenciesMeta.set(r,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${En(e)}'`);let r=St(e),i=this.peerDependenciesMeta.get(r);return i||this.peerDependenciesMeta.set(r,i={}),i}setRawField(e,r,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=r,a=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=St(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=_(P({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(St(o)),l=!1;if(r&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Ou(i).map(o=>({[St(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Ou(n).map(o=>({[St(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Ou(this.devDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Ou(this.peerDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of gn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of gn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?En(Yt(In(o),l)):o,g=P({},c);r&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...gn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[fw(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},Ze=vA;Ze.fileName="package.json",Ze.allDependencies=["dependencies","devDependencies","peerDependencies"],Ze.hardDependencies=["dependencies","devDependencies"];function W6(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function z6(t){return t.charCodeAt(0)===65279?t.slice(1):t}function en(t){return t.replace(/\\/g,"/")}function Tw(t,{yamlCompatibilityMode:e}){return e?Kv(t):typeof t=="undefined"||typeof t=="boolean"?t:null}function _6(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let i=r%2==0?"":"!",n=e.slice(r);return`${i}${t}=${n}`}function V6(t,e){return e.length===1?_6(t,e[0]):`(${e.map(r=>_6(t,r)).join(" | ")})`}var e9=ie($6()),Ow=ie(ml());var t9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r9=80,NFe=new Set([z.FETCH_NOT_CACHED,z.UNUSED_CACHE_ENTRY]),LFe=5,SA=Ow.default.GITHUB_ACTIONS?{start:t=>`::group::${t} +`,end:t=>`::endgroup:: +`}:Ow.default.TRAVIS?{start:t=>`travis_fold:start:${t} +`,end:t=>`travis_fold:end:${t} +`}:Ow.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${t} +`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r`}:null,i9=new Date,TFe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,MFe=t=>t,Kw=MFe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),OFe=TFe&&Object.keys(Kw).find(t=>{let e=Kw[t];return!(e.date&&(e.date[0]!==i9.getDate()||e.date[1]!==i9.getMonth()+1))})||"default";function n9(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let n=KI(t===null?0:t);return!r&&t===null?Ve(e,n,"grey"):n}function eD(t,{configuration:e,json:r}){let i=n9(t,{configuration:e,json:r});if(!i||t===null||t===z.UNNAMED)return i;let n=z[t],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Ku(e,i,s)}var Fe=class extends Xi{constructor({configuration:e,stdout:r,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=LFe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.forgettableLines=[];Cp(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...NFe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=r;let u=this.configuration.get("progressBarStyle")||OFe;if(!Object.prototype.hasOwnProperty.call(Kw,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Kw[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(process.stdout.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}static async start(e,r){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(z.UNNAMED,a)};try{await r(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,r){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof r!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(z.FETCH_NOT_CACHED,r)}startTimerSync(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startTimerPromise(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startCacheReport(e){let r=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{r!==null&&this.reportCacheChanges(r)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,r){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${Ve(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${r}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,r){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${r}`)}reportError(e,r){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${r}`,{truncate:!1})}reportProgress(e){let r=!1,i=Promise.resolve().then(async()=>{let s={progress:0,title:void 0};this.progress.set(e,{definition:s,lastScaledSize:-1}),this.refreshProgress(-1);for await(let{progress:o,title:a}of e)r||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{r||(r=!0,this.progress.delete(e),this.refreshProgress(1))};return _(P({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let r=Ve(this.configuration,Date.now()-this.startTime,Le.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${r}`:e;this.errorCount>0?this.reportError(z.UNNAMED,i):this.warningCount>0?this.reportWarning(z.UNNAMED,i):this.reportInfo(z.UNNAMED,i)}writeLine(e,{truncate:r}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:r})} +`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:r}={}){this.forgettableLines=[],this.writeLine(e,{truncate:r})}writeLines(e,{truncate:r}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:r})} +`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:r}){let i=this.cacheHitCount-e,n=this.cacheMissCount-r;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(z.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let r of e)r.committed=!0,r.action()}clearProgress({delta:e=0,clear:r=!1}){!this.configuration.get("enableProgressBars")||this.json||this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||r)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>r9&&(this.progressFrame=(this.progressFrame+1)%t9.length,this.progressTime=e);let r=t9[this.progressFrame];for(let i of this.progress.values()){let n=this.progressStyle.chars[0].repeat(i.lastScaledSize),s=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize),o=this.formatName(null),a=o?`${o}: `:"";this.stdout.write(`${Ve(this.configuration,"\u27A4","blueBright")} ${a}${r} ${n}${s} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},r9)}refreshProgress(e=0){let r=!1;if(this.progress.size===0)r=!0;else for(let i of this.progress.values()){let n=Math.trunc(this.progressMaxScaledSize*i.definition.progress),s=i.lastScaledSize;if(i.lastScaledSize=n,n!==s){r=!0;break}}r&&(this.clearProgress({delta:e}),this.writeProgress())}truncate(e,{truncate:r}={}){return this.configuration.get("enableProgressBars")||(r=!1),typeof r=="undefined"&&(r=this.configuration.get("preferTruncatedLines")),r&&(e=(0,e9.default)(e,0,process.stdout.columns-1)),e}formatName(e){return n9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Zr="3.1.0";var tn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(tn||(tn={}));async function ba(t,e,r,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await T.writeFilePromise(v.format({dir:t,name:e,ext:".cmd"}),n)}await T.writeFilePromise(v.join(t,e),`#!/bin/sh +exec "${r}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function a9(t){let e=await Ze.tryFind(t);if(e==null?void 0:e.packageManager){let i=Qy(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?tn.Yarn1:tn.Yarn2,reason:n};case"npm":return{packageManager:tn.Npm,reason:n};case"pnpm":return{packageManager:tn.Pnpm,reason:n}}}}let r;try{r=await T.readFilePromise(v.join(t,wt.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:tn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:tn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:T.existsSync(v.join(t,"package-lock.json"))?{packageManager:tn.Npm,reason:`found npm's "package-lock.json" lockfile`}:T.existsSync(v.join(t,"pnpm-lock.yaml"))?{packageManager:tn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Vp({project:t,locator:e,binFolder:r,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=M.fromPortablePath(r);n.BERRY_BIN_FOLDER=M.fromPortablePath(s);let o=process.env.COREPACK_ROOT?M.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([ba(r,"node",process.execPath),...Zr!==null?[ba(r,"run",process.execPath,[o,"run"]),ba(r,"yarn",process.execPath,[o]),ba(r,"yarnpkg",process.execPath,[o]),ba(r,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=M.fromPortablePath(t.configuration.startingCwd),n.PROJECT_CWD=M.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${s}${M.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${M.sep}yarn`,n.npm_node_execpath=`${s}${M.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let u=t.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=t.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=St(e),n.npm_package_version=g}let a=Zr!==null?`yarn/${Zr}`:`yarn/${mu("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),t&&await t.configuration.triggerHook(u=>u.setupScriptEnvironment,t,n,async(u,g,f)=>await ba(r,kr(u),g,f)),n}var KFe=2,UFe=(0,o9.default)(KFe);async function HFe(t,e,{configuration:r,report:i,workspace:n=null,locator:s=null}){await UFe(async()=>{await T.mktempPromise(async o=>{let a=v.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=r.getSubprocessStreams(a,{prefix:M.fromPortablePath(t),report:i}),g=s&&Eo(s)?lp(s):s,f=g?is(g):"an external project";c.write(`Packing ${f} from sources +`);let h=await a9(t),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} + +`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn + +`),p=tn.Yarn2),await T.mktempPromise(async d=>{let m=await Vp({binFolder:d}),B=new Map([[tn.Yarn1,async()=>{let R=n!==null?["workspace",n]:[],H=await to("yarn",["set","version","classic","--only-if-needed"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;await T.appendFilePromise(v.join(t,".npmignore"),`/.yarn +`),c.write(` +`);let L=await to("yarn",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(L.code!==0)return L.code;c.write(` +`);let K=await to("yarn",[...R,"pack","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return K.code!==0?K.code:0}],[tn.Yarn2,async()=>{let R=n!==null?["workspace",n]:[];m.YARN_ENABLE_INLINE_BUILDS="1";let H=v.join(t,wt.lockfile);await T.existsPromise(H)||await T.writeFilePromise(H,"");let L=await to("yarn",[...R,"pack","--install-if-needed","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return L.code!==0?L.code:0}],[tn.Npm,async()=>{if(n!==null){let A=new cc.PassThrough,V=Cu(A);A.pipe(c,{end:!1});let W=await to("npm",["--version"],{cwd:t,env:m,stdin:l,stdout:A,stderr:u,end:Pn.Never});if(A.end(),W.code!==0)return c.end(),u.end(),W.code;let X=(await V).toString().trim();if(!lc(X,">=7.x")){let F=Io(null,"npm"),D=Yt(F,X),he=Yt(F,">=7.x");throw new Error(`Workspaces aren't supported by ${Xt(r,D)}; please upgrade to ${Xt(r,he)} (npm has been detected as the primary package manager for ${Ve(r,t,Le.PATH)})`)}}let R=n!==null?["--workspace",n]:[];delete m.npm_config_user_agent;let H=await to("npm",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;let L=new cc.PassThrough,K=Cu(L);L.pipe(c);let J=await to("npm",["pack","--silent",...R],{cwd:t,env:m,stdin:l,stdout:L,stderr:u});if(J.code!==0)return J.code;let ne=(await K).toString().trim().replace(/^.*\n/s,""),q=v.resolve(t,M.toPortablePath(ne));return await T.renamePromise(q,e),0}]]).get(p);if(typeof B=="undefined")throw new Error("Assertion failed: Unsupported workflow");let b=await B();if(!(b===0||typeof b=="undefined"))throw T.detachTemp(o),new nt(z.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${b}, logs can be found here: ${Ve(r,a,Le.PATH)})`)})})})}async function GFe(t,e,{project:r}){let i=r.tryWorkspaceByLocator(t);if(i!==null)return tD(i,e);let n=r.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r.configuration,t)} not found in the project`);return await Jn.openPromise(async s=>{let o=r.configuration,a=r.configuration.getLinkers(),l={project:r,report:new Fe({stdout:new cc.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${lt(r.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new Ft(u,{baseFs:s});return(await Ze.find(Se.dot,{baseFs:g})).scripts.has(e)},{libzip:await $i()})}async function Uw(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await A9(t,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Fw(f,r,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(d=>d.wrapScriptExecution,h,n,t,e,{script:f,args:r,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{env:c,cwd:u}=await A9(t,{project:n,binFolder:l,cwd:i});return await Fw(e,r,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function jFe(t,{binFolder:e,cwd:r,lifecycleScript:i}){let n=await Vp({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await l9(t),([s,[,o]])=>ba(e,kr(s),process.execPath,[o]))),typeof r=="undefined"&&(r=v.dirname(await T.realpathPromise(v.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:n,cwd:r}}async function A9(t,{project:e,binFolder:r,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(t);if(s!==null)return jFe(s,{binFolder:r,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(t.locatorHash);if(!o)throw new Error(`Package for ${lt(e.configuration,t)} not found in the project`);return await Jn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Fe({stdout:new cc.PassThrough,configuration:l})},g=c.find(m=>m.supportsPackage(o,u));if(!g)throw new Error(`The package ${lt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Vp({project:e,locator:t,binFolder:r,lifecycleScript:n});await Promise.all(Array.from(await Hw(t,{project:e}),([m,[,E]])=>ba(r,kr(m),process.execPath,[E])));let h=await g.findPackageLocation(o,u),p=new Ft(h,{baseFs:a}),d=await Ze.find(Se.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:d,binFolder:r,env:f,cwd:i}},{libzip:await $i()})}async function c9(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o}){return await Uw(t.anchoredLocator,e,r,{cwd:i,project:t.project,stdin:n,stdout:s,stderr:o})}function tD(t,e){return t.manifest.scripts.has(e)}async function u9(t,e,{cwd:r,report:i}){let{configuration:n}=t.project,s=null;await T.mktempPromise(async o=>{let a=v.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${M.fromPortablePath(t.cwd)}") +`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:lt(n,t.anchoredLocator),header:l});i.reportInfo(z.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await c9(t,e,[],{cwd:r,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw T.detachTemp(o),new nt(z.LIFECYCLE_SCRIPT,`${(0,s9.default)(e)} script failed (exit code ${Ve(n,g,Le.NUMBER)}, logs can be found here: ${Ve(n,a,Le.PATH)}); run ${Ve(n,`yarn ${e}`,Le.CODE)} to investigate`)})}async function YFe(t,e,r){tD(t,e)&&await u9(t,e,r)}async function Hw(t,{project:e}){let r=e.configuration,i=new Map,n=e.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r,t)} not found in the project`);let s=new cc.Writable,o=r.getLinkers(),a={project:e,report:new Fe({configuration:r,stdout:s})},l=new Set([t.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${Xt(r,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return kl.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return kl.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return kl.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===kl.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,M.fromPortablePath(v.resolve(f,p))])}return i}async function l9(t){return await Hw(t.anchoredLocator,{project:t.project})}async function g9(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await Hw(t,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${lt(n.configuration,t)}`);return await T.mktempPromise(async g=>{let[,f]=u,h=await Vp({project:n,locator:t,binFolder:g});await Promise.all(Array.from(c,([d,[,m]])=>ba(h.BERRY_BIN_FOLDER,kr(d),process.execPath,[m])));let p;try{p=await to(process.execPath,[...l,f,...r],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await T.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function qFe(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await g9(t.anchoredLocator,e,r,{project:t.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Ai={};it(Ai,{convertToZip:()=>lTe,extractArchiveTo:()=>uTe,makeArchiveFromDirectory:()=>ATe});var d_=ie(require("stream")),C_=ie(ZV());var u_=ie(require("os")),g_=ie(c_()),f_=ie(require("worker_threads")),ER=class{constructor(e){this.source=e;this.pool=[];this.queue=new g_.default({concurrency:Math.max(1,(0,u_.cpus)().length)});let r=setTimeout(()=>{if(!(this.queue.size!==0||this.queue.pending!==0)){for(let i of this.pool)i.terminate();this.pool=[]}},1e3).unref();this.queue.on("idle",()=>{r.refresh()})}run(e){return this.queue.add(()=>{var i;let r=(i=this.pool.pop())!=null?i:new f_.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return r.ref(),new Promise((n,s)=>{let o=a=>{a!==0&&s(new Error(`Worker exited with code ${a}`))};r.once("message",a=>{this.pool.push(r),r.unref(),r.off("error",s),r.off("exit",o),n(a)}),r.once("error",s),r.once("exit",o),r.postMessage(e)})})}};var m_=ie(p_());async function ATe(t,{baseFs:e=new Wt,prefixPath:r=Se.root,compressionLevel:i,inMemory:n=!1}={}){let s=await $i(),o;if(n)o=new Jr(null,{libzip:s,level:i});else{let l=await T.mktempPromise(),c=v.join(l,"archive.zip");o=new Jr(c,{create:!0,libzip:s,level:i})}let a=v.resolve(Se.root,r);return await o.copyPromise(a,t,{baseFs:e,stableTime:!0,stableSort:!0}),o}var I_;async function lTe(t,e){let r=await T.mktempPromise(),i=v.join(r,"archive.zip");return I_||(I_=new ER((0,m_.getContent)())),await I_.run({tmpFile:i,tgz:t,opts:e}),new Jr(i,{libzip:await $i(),level:e.compressionLevel})}async function*cTe(t){let e=new C_.default.Parse,r=new d_.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{r.write(i)}),e.on("error",i=>{r.destroy(i)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let i of r){let n=i;yield n,n.resume()}}async function uTe(t,e,{stripComponents:r=0,prefixPath:i=Se.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=r)}for await(let a of cTe(t)){if(n(a))continue;let l=v.normalize(M.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=r)continue;let c=l.slice(r).join("/"),u=v.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.writeFileSync(u,await Cu(a),{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,mr.SAFE_TIME,mr.SAFE_TIME);break}}return e}var Hs={};it(Hs,{emitList:()=>gTe,emitTree:()=>b_,treeNodeToJson:()=>Q_,treeNodeToTreeify:()=>B_});var w_=ie(y_());function B_(t,{configuration:e}){let r={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Py(e,l,Gl.BOLD)),typeof c!="undefined"&&g.push(Ve(e,c[0],c[1])),g.length===0&&g.push(Py(e,`${a}`,Gl.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof t.children=="undefined")throw new Error("The root node must only contain children");return i(t.children,r),r}function Q_(t){let e=r=>{var s;if(typeof r.children=="undefined"){if(typeof r.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Uu(r.value[0],r.value[1])}let i=Array.isArray(r.children)?r.children.entries():Object.entries((s=r.children)!=null?s:{}),n=Array.isArray(r.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof r.value=="undefined"?n:{value:Uu(r.value[0],r.value[1]),children:n}};return e(t)}function gTe(t,{configuration:e,stdout:r,json:i}){let n=t.map(s=>({value:s}));b_({children:n},{configuration:e,stdout:r,json:i})}function b_(t,{configuration:e,stdout:r,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(t.children)?t.children.values():Object.values((o=t.children)!=null?o:{});for(let l of a)r.write(`${JSON.stringify(Q_(l))} +`);return}let s=(0,w_.asTree)(B_(t,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(s)}var v_=ie(require("crypto")),BR=ie(require("fs"));var fTe=8,Qt=class{constructor(e,{configuration:r,immutable:i=r.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,v_.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=i,this.check=n;let s=r.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=r.get("compressionLevel"),a=o!==pl?`c${o}`:"";this.cacheKey=[fTe,a].join("")}}static async find(e,{immutable:r,check:i}={}){let n=new Qt(e.get("cacheFolder"),{configuration:e,immutable:r,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Mu(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let n=hTe(r).slice(0,10);return`${Mu(e)}-${n}.zip`}getLocatorPath(e,r,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?v.resolve(this.cwd,this.getVersionFilename(e)):r===null||QR(r)!==this.cacheKey?null:v.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?v.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await T.existsPromise(this.cwd))throw new nt(z.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await T.mkdirPromise(this.cwd,{recursive:!0});let e=v.resolve(this.cwd,".gitignore");await T.changeFilePromise(e,`/.gitignore +*.flock +*.tmp +`)}(this.mirrorCwd||!this.immutable)&&await T.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=qr(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new Wt,g=()=>{let V=new Jr(null,{libzip:H}),W=v.join(Se.root,Lx(e));return V.mkdirSync(W,{recursive:!0}),V.writeJsonSync(v.join(W,wt.manifest),{name:St(e),mocked:!0}),V},f=async(V,W=null)=>{let X=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Iy(V)}`:r;if(W!==null){let F=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Iy(W)}`:r;if(X!==F)throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&X!==r){let F;switch(this.check?F="throw":QR(r)!==QR(X)?F="update":F=this.configuration.get("checksumBehavior"),F){case"ignore":return r;case"update":return X;default:case"throw":throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return X},h=async V=>{if(!s)throw new Error(`Cache check required but no loader configured for ${lt(this.configuration,e)}`);let W=await s(),X=W.getRealPath();return W.saveAndClose(),await T.chmodPromise(X,420),await f(V,X)},p=async()=>{if(c===null||!await T.existsPromise(c)){let V=await s(),W=V.getRealPath();return V.saveAndClose(),{source:"loader",path:W}}return{source:"mirror",path:c}},d=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${lt(this.configuration,e)}`);if(this.immutable)throw new nt(z.IMMUTABLE_CACHE,`Cache entry required but missing for ${lt(this.configuration,e)}`);let{path:V,source:W}=await p(),X=await f(V),F=this.getLocatorPath(e,X,o);if(!F)throw new Error("Assertion failed: Expected the cache path to be available");let D=[];W!=="mirror"&&c!==null&&D.push(async()=>{let pe=`${c}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,c)}),(!o.mirrorWriteOnly||c===null)&&D.push(async()=>{let pe=`${F}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,F)});let he=o.mirrorWriteOnly&&c!=null?c:F;return await Promise.all(D.map(pe=>pe())),[!1,he,X]},m=async()=>{let W=(async()=>{var Ne;let X=this.getLocatorPath(e,r,o),F=X!==null?await u.existsPromise(X):!1,D=!!((Ne=o.mockedPackages)==null?void 0:Ne.has(e.locatorHash))&&(!this.check||!F),he=D||F,pe=he?i:n;if(pe&&pe(),he){let Pe=null,qe=X;return D||(Pe=this.check?await h(qe):await f(qe)),[D,qe,Pe]}else return d()})();this.mutexes.set(e.locatorHash,W);try{return await W}finally{this.mutexes.delete(e.locatorHash)}};for(let V;V=this.mutexes.get(e.locatorHash);)await V;let[E,B,b]=await m();this.markedFiles.add(B);let R,H=await $i(),L=E?()=>g():()=>new Jr(B,{baseFs:u,libzip:H,readOnly:!0}),K=new oh(()=>Mv(()=>R=L(),V=>`Failed to open the cache entry for ${lt(this.configuration,e)}: ${V}`),v),J=new Xo(B,{baseFs:K,pathUtils:v}),ne=()=>{R==null||R.discardAndClose()},q=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:b;return[J,ne,q]}};function QR(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function hTe(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var F_=ie(x_()),NB=ie(ml());var N_=ie(Wp()),kR=ie(require("stream"));var k_={hooks:{reduceDependency:(t,e,r,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==St(r)||o.from&&o.from.description&&o.from.description!==r.reference||o.descriptor.fullName!==St(t)||o.descriptor.description&&o.descriptor.description!==t.range)continue;return n.bindDescriptor(Yt(t,a),e.topLevelWorkspace.anchoredLocator,s)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let i=hp(t.configuration,r);await t.configuration.triggerHook(n=>n.validateWorkspace,r,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let i of r.errors)e.reportWarning(z.INVALID_MANIFEST,i.message)}}};var vR=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));return i||null}getFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));if(!i)throw new nt(z.FETCHER_NOT_FOUND,`${lt(r.project.configuration,e)} isn't supported by any available fetcher`);return i}};var pd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,r,i)}async getSatisfying(e,r,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,r,i)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));return i||null}getResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));if(!i)throw new Error(`${Xt(r.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));return i||null}getResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));if(!i)throw new Error(`${lt(r.project.configuration,e)} isn't supported by any available resolver`);return i}};var P_=ie(Or());var Rg=/^(?!v)[a-z0-9._-]+$/i,SR=class{supportsDescriptor(e,r){return!!(Us(e.range)||Rg.test(e.range))}supportsLocator(e,r){return!!(P_.default.valid(e.reference)||Rg.test(e.reference))}shouldPersistResolution(e,r){return r.resolver.shouldPersistResolution(this.forwardLocator(e,r),r)}bindDescriptor(e,r,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),r,i)}getResolutionDependencies(e,r){return r.resolver.getResolutionDependencies(this.forwardDescriptor(e,r),r)}async getCandidates(e,r,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),r,i)}async getSatisfying(e,r,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),r,i)}async resolve(e,r){let i=await r.resolver.resolve(this.forwardLocator(e,r),r);return op(i,e)}forwardDescriptor(e,r){return Yt(e,`${r.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,r){return Vi(e,`${r.project.configuration.get("defaultProtocol")}${e.reference}`)}};var dd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n);return r.fetcher.getLocalPath(s,r)}async fetch(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n),o=await r.fetcher.fetch(s,r);return await this.ensureVirtualLink(e,o,r)}getLocatorFilename(e){return Mu(e)}async ensureVirtualLink(e,r,i){let n=r.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Pr.makeVirtualPath(s,o,n),l=new Xo(a,{baseFs:r.packageFs,pathUtils:v});return _(P({},r),{packageFs:l})}};var Fg=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Fg.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Fg.protocol)}supportsDescriptor(e,r){return Fg.isVirtualDescriptor(e)}supportsLocator(e,r){return Fg.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},FB=Fg;FB.protocol="virtual:";var xR=class{supports(e){return!!e.reference.startsWith(Yr.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let i=this.getWorkspace(e,r).cwd;return{packageFs:new Ft(i),prefixPath:Se.dot,localPath:i}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Yr.protocol.length))}};var D_=ie(require("module"));function R_(){return new Set(D_.default.builtinModules||Object.keys(process.binding("natives")))}var dTe=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),LB="yarn_",PR=".yarnrc.yml",DR="yarn.lock",CTe="********",ge;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(ge||(ge={}));var ps=Le,RR={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:ge.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:ge.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:ge.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:ge.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:ge.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:ge.ABSOLUTE_PATH,default:Rb()},cacheFolder:{description:"Folder where the cache files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:ge.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:pl},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:ge.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:ge.STRING,default:DR},installStatePath:{description:"Path of the file where the install state will be persisted",type:ge.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:ge.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:ge.STRING,default:TB()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:ge.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:ge.BOOLEAN,default:xy,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:ge.BOOLEAN,default:Mx,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:ge.BOOLEAN,default:NB.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:ge.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:ge.BOOLEAN,default:!NB.isCI&&process.stdout.isTTY&&process.stdout.columns>22,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:ge.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:ge.BOOLEAN,default:NB.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:ge.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:ge.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:ge.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:ge.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:ge.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:ge.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:ge.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:ge.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:ge.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:ge.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:ge.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:ge.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:ge.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:ge.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:ge.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:ge.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:ge.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:ge.STRING,values:Object.values(Ts),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:ge.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:ge.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:ge.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:ge.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:ge.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:ge.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:ge.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:ge.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:ge.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:ge.MAP,valueDefinition:{description:"A range",type:ge.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:ge.MAP,valueDefinition:{description:"A semver range",type:ge.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:ge.MAP,valueDefinition:{description:"The peerDependency meta",type:ge.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:ge.BOOLEAN,default:!1}}}}}}}};function NR(t,e,r,i,n){if(i.isArray||i.type===ge.ANY&&Array.isArray(r))return Array.isArray(r)?r.map((s,o)=>FR(t,`${e}[${o}]`,s,i,n)):String(r).split(/,/).map(s=>FR(t,e,s,i,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return FR(t,e,r,i,n)}function FR(t,e,r,i,n){var a;switch(i.type){case ge.ANY:return r;case ge.SHAPE:return mTe(t,e,r,i,n);case ge.MAP:return ITe(t,e,r,i,n)}if(r===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(r))return r;let o=(()=>{if(i.type===ge.BOOLEAN&&typeof r!="string")return Hh(r);if(typeof r!="string")throw new Error(`Expected value (${r}) to be a string`);let l=Ov(r,{env:process.env});switch(i.type){case ge.ABSOLUTE_PATH:return v.resolve(n,M.toPortablePath(l));case ge.LOCATOR_LOOSE:return Hl(l,!1);case ge.NUMBER:return parseInt(l);case ge.LOCATOR:return Hl(l);case ge.BOOLEAN:return Hh(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function mTe(t,e,r,i,n){if(typeof r!="object"||Array.isArray(r))throw new me(`Object configuration settings "${e}" must be an object`);let s=LR(t,i,{ignoreArrays:!0});if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=`${e}.${o}`;if(!i.properties[o])throw new me(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,NR(t,l,a,i.properties[o],n))}return s}function ITe(t,e,r,i,n){let s=new Map;if(typeof r!="object"||Array.isArray(r))throw new me(`Map configuration settings "${e}" must be an object`);if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,NR(t,c,a,u,n))}return s}function LR(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case ge.SHAPE:{if(e.isArray&&!r)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,LR(t,s));return i}break;case ge.MAP:return e.isArray&&!r?[]:new Map;case ge.ABSOLUTE_PATH:return e.default===null?null:t.projectCwd===null?v.isAbsolute(e.default)?v.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>v.resolve(t.projectCwd,i)):v.resolve(t.projectCwd,e.default);default:return e.default}}function MB(t,e,r){if(e.type===ge.SECRET&&typeof t=="string"&&r.hideSecrets)return CTe;if(e.type===ge.ABSOLUTE_PATH&&typeof t=="string"&&r.getNativePaths)return M.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let i=[];for(let n of t)i.push(MB(n,e,r));return i}if(e.type===ge.MAP&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries())i.set(n,MB(s,e.valueDefinition,r));return i}if(e.type===ge.SHAPE&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries()){let o=e.properties[n];i.set(n,MB(s,o,r))}return i}return t}function ETe(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(LB)&&(e=(0,F_.default)(e.slice(LB.length)),t[e]=r);return t}function TB(){let t=`${LB}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return PR}var KA;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(KA||(KA={}));var Ra=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,r,i){let n=new Ra(e);typeof r!="undefined"&&!(r instanceof Map)&&(n.projectCwd=r),n.importSettings(RR);let s=typeof i!="undefined"?i:r instanceof Map?r:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,r,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=ETe();delete a.rcFilename;let l=await Ra.findRcFiles(e),c=await Ra.findHomeRcFile();if(c){let E=l.find(B=>B.path===c.path);E?E.strict=!1:l.push(_(P({},c),{strict:!1}))}let u=({ignoreCwd:E,yarnPath:B,ignorePath:b,lockfileFilename:R})=>({ignoreCwd:E,yarnPath:B,ignorePath:b,lockfileFilename:R}),g=L=>{var K=L,{ignoreCwd:E,yarnPath:B,ignorePath:b,lockfileFilename:R}=K,H=qr(K,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return H},f=new Ra(e);f.importSettings(u(RR)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:E,cwd:B,data:b}of l)f.useWithSource(E,u(b),B,{strict:!1});if(s){let E=f.get("yarnPath"),B=f.get("ignorePath");if(E!==null&&!B)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await Ra.findProjectCwd(e,h);break;case 1:p=await Ra.findProjectCwd(e,null);break;case 2:T.existsSync(v.join(e,"package.json"))?p=v.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(RR));let d=new Map([["@@core",k_]]),m=E=>"default"in E?E.default:E;if(r!==null){for(let R of r.plugins.keys())d.set(R,m(r.modules.get(R)));let E=new Map;for(let R of R_())E.set(R,()=>mu(R));for(let[R,H]of r.modules)E.set(R,()=>H);let B=new Set,b=async(R,H)=>{let{factory:L,name:K}=mu(R);if(B.has(K))return;let J=new Map(E),ne=A=>{if(J.has(A))return J.get(A)();throw new me(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},q=await du(async()=>m(await L(ne)),A=>`${A} (when initializing ${K}, defined in ${H})`);E.set(K,()=>q),B.add(K),d.set(K,q)};if(a.plugins)for(let R of a.plugins.split(";")){let H=v.resolve(e,M.toPortablePath(R));await b(H,"")}for(let{path:R,cwd:H,data:L}of l)if(!!o&&!!Array.isArray(L.plugins))for(let K of L.plugins){let J=typeof K!="string"?K.path:K,ne=v.resolve(H,M.toPortablePath(J));await b(ne,R)}}for(let[E,B]of d)f.activatePlugin(E,B);f.useWithSource("",g(a),e,{strict:n});for(let{path:E,cwd:B,data:b,strict:R}of l)f.useWithSource(E,g(b),B,{strict:R!=null?R:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let r=TB(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=v.join(s,r);if(T.existsSync(o)){let a=await T.readFilePromise(o,"utf8"),l;try{l=Ei(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new me(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=v.dirname(s)}return i}static async findHomeRcFile(){let e=TB(),r=uh(),i=v.join(r,e);if(T.existsSync(i)){let n=await T.readFilePromise(i,"utf8"),s=Ei(n);return{path:i,cwd:r,data:s}}return null}static async findProjectCwd(e,r){let i=null,n=e,s=null;for(;n!==s;){if(s=n,T.existsSync(v.join(s,"package.json"))&&(i=s),r!==null){if(T.existsSync(v.join(s,r))){i=s;break}}else if(i!==null)break;n=v.dirname(s)}return i}static async updateConfiguration(e,r){let i=TB(),n=v.join(e,i),s=T.existsSync(n)?Ei(await T.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof r=="function"){try{a=r(s)}catch{a=r({})}if(a===s)return}else{a=s;for(let l of Object.keys(r)){let c=s[l],u=r[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await T.changeFilePromise(n,Qa(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let r=uh();return await Ra.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration!="undefined"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,i]of Object.entries(e))if(i!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,i),this.values.set(r,LR(this,i))}}useWithSource(e,r,i,n){try{this.use(e,r,i,n)}catch(s){throw s.message+=` (in ${Ve(this,e,Le.PATH)})`,s}}use(e,r,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(r)]){if(typeof r[o]=="undefined"||o==="plugins"||e===""&&dTe.has(o))continue;if(o==="rcFilename")throw new me(`The rcFilename settings can only be set via ${`${LB}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new me(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===ge.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=NR(this,o,r[o],l,i)}catch(u){throw u.message+=` in ${Ve(this,e,Le.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===ge.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new me(`Couldn't find a configuration settings named "${e}"`);return MB(n,s,{hideSecrets:r,getNativePaths:i})}getSubprocessStreams(e,{header:r,prefix:i,report:n}){let s,o,a=T.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${Ve(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${Ve(this,"STDERR","red")}`);s=new kR.PassThrough,s.pipe(l),s.pipe(a),o=new kR.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof r!="undefined"&&s.write(`${r} +`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let i of r.resolvers||[])e.push(new i);return new pd([new FB,new Yr,new SR,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let i of r.fetchers||[])e.push(new i);return new vR([new dd,new xR,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let i of r.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=this.get("supportedArchitectures"),r=e.get("os");r!==null&&(r=r.map(n=>n==="current"?process.platform:n));let i=e.get("cpu");return i!==null&&(i=i.map(n=>n==="current"?process.arch:n)),{os:r,cpu:i}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(i,n,{userProvided:s=!1}={})=>{if(!Us(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new Ze;o.load(n,{yamlCompatibilityMode:!0});let a=hu(e,i.identHash),l=[];a.push([i.range,l]);let c={status:ki.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(_(P({},c),{type:oi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(_(P({},c),{type:oi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(_(P({},c),{type:oi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,r);for(let[i,n]of this.get("packageExtensions"))r(pA(i,!0),aE(n),{userProvided:!0})}normalizePackage(e){let r=ap(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!lc(s,o))for(let l of a)switch(l.status===ki.Inactive&&(l.status=ki.Redundant),l.type){case oi.Dependency:typeof r.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.dependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependency:typeof r.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependencyMeta:{let c=r.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=ki.Active,na(r.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Lv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of r.peerDependenciesMeta.keys()){let o=In(s);r.peerDependencies.has(o.identHash)||r.peerDependencies.set(o.identHash,Yt(o,"*"))}for(let s of r.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=Io("types",o),l=St(a);r.peerDependencies.has(a.identHash)||r.peerDependenciesMeta.has(l)||(r.peerDependencies.set(a.identHash,Yt(a,"*")),r.peerDependenciesMeta.set(l,{optional:!0}))}return r.dependencies=new Map(gn(r.dependencies,([,s])=>En(s))),r.peerDependencies=new Map(gn(r.peerDependencies,([,s])=>En(s))),r}getLimit(e){return na(this.limits,e,()=>(0,N_.default)(this.get(e)))}async triggerHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...r)}}async triggerMultipleHooks(e,r){for(let i of r)await this.triggerHook(e,...i)}async reduceHook(e,r,...i){let n=r;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...r);if(typeof o!="undefined")return o}return null}},fe=Ra;fe.telemetry=null;var Gn;(function(r){r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE"})(Gn||(Gn={}));var Fa=class extends Xi{constructor({configuration:e,stdout:r,suggestInstall:i=!0}){super();this.errorCount=0;Cp(this,{configuration:e}),this.configuration=e,this.stdout=r,this.suggestInstall=i}static async start(e,r){let i=new this(e);try{await r(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){this.errorCount+=1,this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${r} +`)}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var t0=ie(require("crypto")),v$=ie(CX()),r0=ie(Q$()),S$=ie(Wp()),x$=ie(Or()),lF=ie(require("util")),cF=ie(require("v8")),uF=ie(require("zlib"));var iUe=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,i)=>`${r}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>by({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],oF=class{constructor(){this.resolutions=null}async setup(e,{report:r}){let i=v.join(e.cwd,e.configuration.get("lockfileFilename"));if(!T.existsSync(i))return;let n=await T.readFilePromise(i,"utf8"),s=Ei(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=gp(a);if(!l){r.reportWarning(z.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}Us(l.range)&&(l=Yt(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of iUe){let d=u.match(h);if(d){g=p(c,...d);break}}if(!g){r.reportWarning(z.YARN_IMPORT_FAILED,`${Xt(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=Tu(l.range),p=gp(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,Vi(f,g))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var aF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(By(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){let n=i.project.originalPackages.get(By(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var AF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.resolver.bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var ei=class extends Xi{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){}};var b$=ie(vx());var Dd=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=r,this.cwd=e}async setup(){this.manifest=T.existsSync(v.join(this.cwd,Ze.fileName))?await Ze.find(this.cwd):new Ze,this.relativeCwd=v.relative(this.project.cwd,this.cwd)||Se.dot;let e=this.manifest.name?this.manifest.name:Io(null,`${this.computeCandidateName()}-${zi(this.relativeCwd).substr(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=Vi(e,r),this.anchoredDescriptor=Yt(this.locator,`${Yr.protocol}${this.relativeCwd}`),this.anchoredLocator=Vi(this.locator,`${Yr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:s})=>s),n=await(0,b$.default)(i,{cwd:M.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let s of n){let o=v.resolve(this.cwd,M.toPortablePath(s));T.existsSync(v.join(o,"package.json"))&&this.workspacesCwds.add(o)}}accepts(e){var o;let r=e.indexOf(":"),i=r!==-1?e.slice(0,r+1):null,n=r!==-1?e.slice(r+1):e;if(i===Yr.protocol&&v.normalize(n)===this.relativeCwd||i===Yr.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=Us(n);return s?i===Yr.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${v.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||r.has(a)||(r.add(a),i(a))}};return i(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&up(c.anchoredLocator,n.anchoredLocator)}))&&!r.has(s)&&(r.add(s),i(s))};return i(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let i=this.project.workspacesByCwd.get(r);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=v.join(this.cwd,Ze.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} +`;await T.changeFilePromise(r,i,{automaticNewlines:!0}),this.manifest.raw=e}};var k$=5,nUe=1,sUe=/ *, */g,P$=/\/$/,oUe=32,aUe=(0,lF.promisify)(uF.default.gzip),AUe=(0,lF.promisify)(uF.default.gunzip),li;(function(r){r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build"})(li||(li={}));var gF={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},D$=t=>zi(`${nUe}`,t),Ke=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var c,u,g;if(!e.projectCwd)throw new me(`No project found in ${r}`);let i=e.projectCwd,n=r,s=null;for(;s!==e.projectCwd;){if(s=n,T.existsSync(v.join(s,wt.manifest))){i=s;break}n=v.dirname(s)}let o=new Ke(e.projectCwd,{configuration:e});(c=fe.telemetry)==null||c.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(u=fe.telemetry)==null||u.reportWorkspaceCount(o.workspaces.length),(g=fe.telemetry)==null||g.reportDependencyCount(o.workspaces.reduce((f,h)=>f+h.manifest.dependencies.size+h.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};throw new me(`The nearest package directory (${Ve(e,i,Le.PATH)}) doesn't seem to be part of the project declared in ${Ve(e,o.cwd,Le.PATH)}. + +- If the project directory is right, it might be that you forgot to list ${Ve(e,v.relative(o.cwd,i),Le.PATH)} as a workspace. +- If it isn't, it's likely because you have a yarn.lock or package.json file there, confusing the project root detection.`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(T.existsSync(e)){let n=await T.readFilePromise(e,"utf8");this.lockFileChecksum=D$(n);let s=Ei(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let r=e;e=[];for(let i of r){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let r=new Dd(e,{project:this});await r.setup();let i=this.workspacesByIdent.get(r.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${Vr(this.configuration,r.locator)}: ${M.fromPortablePath(e)} conflicts with ${M.fromPortablePath(i.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){v.isAbsolute(e)||(e=v.resolve(this.cwd,e)),e=v.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let i of this.workspaces)v.relative(i.cwd,e).startsWith("../")||r&&r.cwd.length>=i.cwd.length||(r=i);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r=="undefined"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Vr(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){let r=this.tryWorkspaceByIdent(e);return r===null||(hA(e)&&(e=Ap(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Xt(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Eo(e)&&(e=lp(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${lt(this.configuration,e)})`);return r}refreshWorkspaceDependencies(){for(let e of this.workspaces){let r=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!r)throw new Error(`Assertion failed: Expected workspace ${hp(this.configuration,e)} (${Ve(this.configuration,v.join(e.cwd,wt.manifest),Le.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(r.dependencies)}}forgetResolution(e){let r=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&r(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,i]of e.dependencies)hA(i)&&e.dependencies.set(r,Ap(i))}getDependencyMeta(e,r){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(St(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),r===null||!x$.default.valid(r))return i;for(let[a,l]of s)a!==null&&a===r&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:r=!1}={}){let i=new ei,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(r&&(await o.findPackageLocation(a,s)).replace(P$,"")!==e.replace(P$,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let r=e.resolver||this.configuration.makeResolver(),i=new oF;await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new AF(r)]:[i,r],s=new pd([new aF(r),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,d=new Set,m=[],E=async W=>{let X=await du(async()=>await s.resolve(W,a),D=>`${lt(this.configuration,W)}: ${D}`);if(!up(W,X))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${lt(this.configuration,W)} to ${lt(this.configuration,X)})`);g.set(X.locatorHash,X);let F=this.configuration.normalizePackage(X);for(let[D,he]of F.dependencies){let pe=await this.configuration.reduceHook(Pe=>Pe.reduceDependency,he,this,F,he,{resolver:s,resolveOptions:a});if(!cp(he,pe))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let Ne=s.bindDescriptor(pe,W,a);F.dependencies.set(D,Ne)}return m.push(Promise.all([...F.dependencies.values()].map(D=>H(D)))),c.set(F.locatorHash,F),F},B=async W=>{let X=f.get(W.locatorHash);if(typeof X!="undefined")return X;let F=Promise.resolve().then(()=>E(W));return f.set(W.locatorHash,F),F},b=async(W,X)=>{let F=await H(X);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,F.locatorHash),F},R=async W=>{let X=this.resolutionAliases.get(W.descriptorHash);if(typeof X!="undefined")return b(W,this.storedDescriptors.get(X));let F=s.getResolutionDependencies(W,a),D=new Map(await Promise.all(F.map(async Ne=>{let Pe=s.bindDescriptor(Ne,p,a),qe=await H(Pe);return d.add(qe.locatorHash),[Ne.descriptorHash,qe]}))),pe=(await du(async()=>await s.getCandidates(W,D,a),Ne=>`${Xt(this.configuration,W)}: ${Ne}`))[0];if(typeof pe=="undefined")throw new Error(`${Xt(this.configuration,W)}: No candidates found`);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,pe.locatorHash),B(pe)},H=W=>{let X=h.get(W.descriptorHash);if(typeof X!="undefined")return X;l.set(W.descriptorHash,W);let F=Promise.resolve().then(()=>R(W));return h.set(W.descriptorHash,F),F};for(let W of this.workspaces){let X=W.anchoredDescriptor;m.push(H(X))}for(;m.length>0;){let W=[...m];m.length=0,await Promise.all(W)}let L=new Set(this.resolutionAliases.values()),K=new Set(c.keys()),J=new Set,ne=new Map;lUe({project:this,report:e.report,accessibleLocators:J,volatileDescriptors:L,optionalBuilds:K,peerRequirements:ne,allDescriptors:l,allResolutions:u,allPackages:c});for(let W of d)K.delete(W);for(let W of L)l.delete(W),u.delete(W);let q=this.configuration.getSupportedArchitectures(),A=new Set,V=new Set;for(let W of c.values())W.conditions!=null&&(!K.has(W.locatorHash)||(Sy(W,q)||(Sy(W,{os:[process.platform],cpu:[process.arch]})&&e.report.reportWarningOnce(z.GHOST_ARCHITECTURE,`${lt(this.configuration,W)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ve(this.configuration,"supportedArchitectures",ps.SETTING)} setting`),V.add(W.locatorHash)),A.add(W.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=J,this.conditionalLocators=A,this.disabledLocators=V,this.originalPackages=g,this.optionalBuilds=K,this.peerRequirements=ne,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:r,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,cacheOptions:s},l=Array.from(new Set(gn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return is(h)}])));n===li.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Xi.progressViaCounter(l.length);r.reportProgress(u);let g=(0,S$.default)(oUe);if(await r.startCacheReport(async()=>{await Promise.all(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(Eo(h))return;let p;try{p=await o.fetch(h,a)}catch(d){d.message=`${lt(this.configuration,h)}: ${d.message}`,r.reportExceptionOnce(d),c=d;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:r,fetcher:i,mode:n}){var A,V,W;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:r},u=new Map(l.map(X=>{let F=X.makeInstaller(c),D=F.getCustomDataKey(),he=this.installersCustomData.get(D);return typeof he!="undefined"&&F.attachCustomData(he),[X,F]})),g=new Map,f=new Map,h=new Map,p=new Map(await Promise.all([...this.accessibleLocators].map(async X=>{let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");return[X,await o.fetch(F,a)]}))),d=[];for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(typeof F=="undefined")throw new Error("Assertion failed: The locator should have been registered");let D=p.get(F.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let he=[],pe=Pe=>{he.push(Pe)},Ne=this.tryWorkspaceByLocator(F);if(Ne!==null){let Pe=[],{scripts:qe}=Ne.manifest;for(let se of["preinstall","install","postinstall"])qe.has(se)&&Pe.push([Gn.SCRIPT,se]);try{for(let[se,be]of u)if(se.supportsPackage(F,c)&&(await be.installPackage(F,D,{holdFetchResult:pe})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{he.length===0?(A=D.releaseFs)==null||A.call(D):d.push(Promise.all(he).catch(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}let re=v.join(D.packageFs.getRealPath(),D.prefixPath);f.set(F.locatorHash,re),!Eo(F)&&Pe.length>0&&h.set(F.locatorHash,{directives:Pe,buildLocations:[re]})}else{let Pe=l.find(se=>se.supportsPackage(F,c));if(!Pe)throw new nt(z.LINKER_NOT_FOUND,`${lt(this.configuration,F)} isn't supported by any available linker`);let qe=u.get(Pe);if(!qe)throw new Error("Assertion failed: The installer should have been registered");let re;try{re=await qe.installPackage(F,D,{holdFetchResult:pe})}finally{he.length===0?(V=D.releaseFs)==null||V.call(D):d.push(Promise.all(he).then(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}g.set(F.locatorHash,Pe),f.set(F.locatorHash,re.packageLocation),re.buildDirective&&re.buildDirective.length>0&&re.packageLocation&&h.set(F.locatorHash,{directives:re.buildDirective,buildLocations:[re.packageLocation]})}}let m=new Map;for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");let D=this.tryWorkspaceByLocator(F)!==null,he=async(pe,Ne)=>{let Pe=f.get(F.locatorHash);if(typeof Pe=="undefined")throw new Error(`Assertion failed: The package (${lt(this.configuration,F)}) should have been registered`);let qe=[];for(let re of F.dependencies.values()){let se=this.storedResolutions.get(re.descriptorHash);if(typeof se=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,re)}, from ${lt(this.configuration,F)})should have been registered`);let be=this.storedPackages.get(se);if(typeof be=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);let ae=this.tryWorkspaceByLocator(be)===null?g.get(se):null;if(typeof ae=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);ae===pe||ae===null?f.get(be.locatorHash)!==null&&qe.push([re,be]):!D&&Pe!==null&&hu(m,se).push(Pe)}Pe!==null&&await Ne.attachInternalDependencies(F,qe)};if(D)for(let[pe,Ne]of u)pe.supportsPackage(F,c)&&await he(pe,Ne);else{let pe=g.get(F.locatorHash);if(!pe)throw new Error("Assertion failed: The linker should have been found");let Ne=u.get(pe);if(!Ne)throw new Error("Assertion failed: The installer should have been registered");await he(pe,Ne)}}for(let[X,F]of m){let D=this.storedPackages.get(X);if(!D)throw new Error("Assertion failed: The package should have been registered");let he=g.get(D.locatorHash);if(!he)throw new Error("Assertion failed: The linker should have been found");let pe=u.get(he);if(!pe)throw new Error("Assertion failed: The installer should have been registered");await pe.attachExternalDependents(D,F)}let E=new Map;for(let X of u.values()){let F=await X.finalizeInstall();for(let D of(W=F==null?void 0:F.records)!=null?W:[])h.set(D.locatorHash,{directives:D.buildDirective,buildLocations:D.buildLocations});typeof(F==null?void 0:F.customData)!="undefined"&&E.set(X.getCustomDataKey(),F.customData)}if(this.installersCustomData=E,await Promise.all(d),n===li.SkipBuild)return;let B=new Set(this.storedPackages.keys()),b=new Set(h.keys());for(let X of b)B.delete(X);let R=(0,t0.createHash)("sha512");R.update(process.versions.node),await this.configuration.triggerHook(X=>X.globalHashGeneration,this,X=>{R.update("\0"),R.update(X)});let H=R.digest("hex"),L=new Map,K=X=>{let F=L.get(X.locatorHash);if(typeof F!="undefined")return F;let D=this.storedPackages.get(X.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The package should have been registered");let he=(0,t0.createHash)("sha512");he.update(X.locatorHash),L.set(X.locatorHash,"");for(let pe of D.dependencies.values()){let Ne=this.storedResolutions.get(pe.descriptorHash);if(typeof Ne=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,pe)}) should have been registered`);let Pe=this.storedPackages.get(Ne);if(typeof Pe=="undefined")throw new Error("Assertion failed: The package should have been registered");he.update(K(Pe))}return F=he.digest("hex"),L.set(X.locatorHash,F),F},J=(X,F)=>{let D=(0,t0.createHash)("sha512");D.update(H),D.update(K(X));for(let he of F)D.update(he);return D.digest("hex")},ne=new Map,q=!1;for(;b.size>0;){let X=b.size,F=[];for(let D of b){let he=this.storedPackages.get(D);if(!he)throw new Error("Assertion failed: The package should have been registered");let pe=!0;for(let qe of he.dependencies.values()){let re=this.storedResolutions.get(qe.descriptorHash);if(!re)throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,qe)}) should have been registered`);if(b.has(re)){pe=!1;break}}if(!pe)continue;b.delete(D);let Ne=h.get(he.locatorHash);if(!Ne)throw new Error("Assertion failed: The build directive should have been registered");let Pe=J(he,Ne.buildLocations);if(this.storedBuildState.get(he.locatorHash)===Pe){ne.set(he.locatorHash,Pe);continue}q||(await this.persistInstallStateFile(),q=!0),this.storedBuildState.has(he.locatorHash)?r.reportInfo(z.MUST_REBUILD,`${lt(this.configuration,he)} must be rebuilt because its dependency tree changed`):r.reportInfo(z.MUST_BUILD,`${lt(this.configuration,he)} must be built because it never has been before or the last one failed`);for(let qe of Ne.buildLocations){if(!v.isAbsolute(qe))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${qe})`);F.push((async()=>{for(let[re,se]of Ne.directives){let be=`# This file contains the result of Yarn building a package (${is(he)}) +`;switch(re){case Gn.SCRIPT:be+=`# Script name: ${se} +`;break;case Gn.SHELLCODE:be+=`# Script code: ${se} +`;break}let ae=null;if(!await T.mktempPromise(async De=>{let $=v.join(De,"build.log"),{stdout:G,stderr:Ce}=this.configuration.getSubprocessStreams($,{header:be,prefix:lt(this.configuration,he),report:r}),ee;try{switch(re){case Gn.SCRIPT:ee=await Uw(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break;case Gn.SHELLCODE:ee=await rD(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break}}catch(Oe){Ce.write(Oe.stack),ee=1}if(G.end(),Ce.end(),ee===0)return ne.set(he.locatorHash,Pe),!0;T.detachTemp(De);let Ue=`${lt(this.configuration,he)} couldn't be built successfully (exit code ${Ve(this.configuration,ee,Le.NUMBER)}, logs can be found here: ${Ve(this.configuration,$,Le.PATH)})`;return this.optionalBuilds.has(he.locatorHash)?(r.reportInfo(z.BUILD_FAILED,Ue),ne.set(he.locatorHash,Pe),!0):(r.reportError(z.BUILD_FAILED,Ue),!1)}))return}})())}}if(await Promise.all(F),X===b.size){let D=Array.from(b).map(he=>{let pe=this.storedPackages.get(he);if(!pe)throw new Error("Assertion failed: The package should have been registered");return lt(this.configuration,pe)}).join(", ");r.reportError(z.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${D})`);break}}this.storedBuildState=ne}async install(e){var a,l;let r=this.configuration.get("nodeLinker");(a=fe.telemetry)==null||a.reportInstall(r),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=ki.Inactive;let i=v.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await T.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=Ve(this.configuration,g,Le.PACKAGE_EXTENSION);switch(g.status){case ki.Inactive:e.report.reportWarning(z.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case ki.Redundant:e.report.reportWarning(z.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=ul(n,this.generateLockfile());if(c!==n){let u=(0,v$.structuredPatch)(i,i,n,c);e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.ADDED)):f.startsWith("-")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.REMOVED)):e.report.reportInfo(null,Ve(this.configuration,f,"grey"))}throw e.report.reportSeparator(),new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===ki.Active&&((l=fe.telemetry)==null||l.reportPackageExtension(Uu(g,Le.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==li.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>Ey(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===li.UpdateLockfile){e.report.reportWarning(z.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${Ve(this.configuration,"mode=update-lockfile",Le.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>Ey(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let r={};r.__metadata={version:k$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>En(f)).sort().join(", "),c=new Ze;c.version=o.linkType===gt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof r.__metadata.cacheKey=="undefined"&&(r.__metadata.cacheKey=h),h===r.__metadata.cacheKey?u=p:u=g}r[l]=_(P({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:is(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Qa(r)}async persistLockfile(){let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r="";try{r=await T.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=ul(r,i);n!==r&&(await T.writeFilePromise(e,n),this.lockFileChecksum=D$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(gF))e.push(...o);let r=(0,r0.default)(this,e),i=cF.default.serialize(r),n=zi(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await T.mkdirPromise(v.dirname(s),{recursive:!0}),await T.writeFilePromise(s,await aUe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath");if(!T.existsSync(n)){r&&await this.applyLightResolution();return}let s=await AUe(await T.readFilePromise(n));this.installStateChecksum=zi(s);let o=cF.default.deserialize(s);e&&typeof o.installersCustomData!="undefined"&&(this.installersCustomData=o.installersCustomData),i&&Object.assign(this,(0,r0.default)(o,gF.restoreBuildState)),r&&(o.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,r0.default)(o,gF.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ei}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){let i=new Set([".gitignore"]);if(!Fb(e.cwd,this.cwd)||!await T.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await T.readdirPromise(e.cwd)){if(i.has(a))continue;let l=v.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?r.reportError(z.IMMUTABLE_CACHE,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:r.reportInfo(z.UNUSED_CACHE_ENTRY,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused - removing`),await T.removePromise(l)))}n&&s!==0&&r.reportInfo(z.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function lUe({project:t,allDescriptors:e,allResolutions:r,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,volatileDescriptors:o=new Set,peerRequirements:a=new Map,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,d=new Map,m=new Map,E=new Map(t.workspaces.map(q=>{let A=q.anchoredLocator.locatorHash,V=i.get(A);if(typeof V=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,ap(V)]})),B=()=>{let q=T.mktempSync(),A=v.join(q,"stacktrace.log"),V=String(g.length+1).length,W=g.map((X,F)=>`${`${F+1}.`.padStart(V," ")} ${is(X)} +`).join("");throw T.writeFileSync(A,W),T.detachTemp(q),new nt(z.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${M.fromPortablePath(A)}`)},b=q=>{let A=r.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let V=i.get(A);if(!V)throw new Error("Assertion failed: The package could not be found");return V},R=(q,A,V,{top:W,optional:X})=>{g.length>1e3&&B(),g.push(A);let F=H(q,A,V,{top:W,optional:X});return g.pop(),F},H=(q,A,V,{top:W,optional:X})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),X||s.delete(A.locatorHash);let F=i.get(A.locatorHash);if(!F){if(c)return;throw new Error(`Assertion failed: The package (${lt(t.configuration,A)}) should have been registered`)}let D=[],he=[],pe=[],Ne=[],Pe=[];for(let re of Array.from(F.dependencies.values())){if(F.peerDependencies.has(re.identHash)&&F.locatorHash!==W)continue;if(hA(re))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");o.delete(re.descriptorHash);let se=X;if(!se){let ee=F.dependenciesMeta.get(St(re));if(typeof ee!="undefined"){let Ue=ee.get(null);typeof Ue!="undefined"&&Ue.optional&&(se=!0)}}let be=r.get(re.descriptorHash);if(!be){if(c)continue;throw new Error(`Assertion failed: The resolution (${Xt(t.configuration,re)}) should have been registered`)}let ae=E.get(be)||i.get(be);if(!ae)throw new Error(`Assertion failed: The package (${be}, resolved from ${Xt(t.configuration,re)}) should have been registered`);if(ae.peerDependencies.size===0){R(re,ae,new Map,{top:W,optional:se});continue}let Ae=u.get(ae.locatorHash);typeof Ae=="number"&&Ae>=2&&B();let De,$,G=new Set,Ce;he.push(()=>{De=kx(re,A.locatorHash),$=Px(ae,A.locatorHash),F.dependencies.delete(re.identHash),F.dependencies.set(De.identHash,De),r.set(De.descriptorHash,$.locatorHash),e.set(De.descriptorHash,De),i.set($.locatorHash,$),D.push([ae,De,$])}),pe.push(()=>{var ee;Ce=new Map;for(let Ue of $.peerDependencies.values()){let Oe=F.dependencies.get(Ue.identHash);if(!Oe&&cp(A,Ue)&&(Oe=q),(!Oe||Oe.range==="missing:")&&$.dependencies.has(Ue.identHash)){$.peerDependencies.delete(Ue.identHash);continue}Oe||(Oe=Yt(Ue,"missing:")),$.dependencies.set(Oe.identHash,Oe),hA(Oe)&&Pl(p,Oe.descriptorHash).add($.locatorHash),f.set(Oe.identHash,Oe),Oe.range==="missing:"&&G.add(Oe.identHash),Ce.set(Ue.identHash,(ee=V.get(Ue.identHash))!=null?ee:$.locatorHash)}$.dependencies=new Map(gn($.dependencies,([Ue,Oe])=>St(Oe)))}),Ne.push(()=>{if(!i.has($.locatorHash))return;let ee=u.get(ae.locatorHash),Ue=typeof ee!="undefined"?ee+1:1;u.set(ae.locatorHash,Ue),R(De,$,Ce,{top:W,optional:se}),u.set(ae.locatorHash,Ue-1)}),Pe.push(()=>{let ee=F.dependencies.get(re.identHash);if(typeof ee=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let Ue=r.get(ee.descriptorHash);if(typeof Ue=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Pl(m,Ue).add(A.locatorHash),!!i.has($.locatorHash)){for(let Oe of $.peerDependencies.values()){let vt=Ce.get(Oe.identHash);if(typeof vt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");hu(pu(d,vt),St(Oe)).push($.locatorHash)}for(let Oe of G)$.dependencies.delete(Oe)}})}for(let re of[...he,...pe])re();let qe;do{qe=!0;for(let[re,se,be]of D){if(!i.has(be.locatorHash))continue;let ae=pu(h,re.locatorHash),Ae=zi(...[...be.dependencies.values()].map(Ce=>{let ee=Ce.range!=="missing:"?r.get(Ce.descriptorHash):"missing:";if(typeof ee=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${Xt(t.configuration,Ce)} to have been registered`);return ee===W?`${ee} (top)`:ee}),se.identHash),De=ae.get(Ae);if(typeof De=="undefined"){ae.set(Ae,se);continue}if(De===se)continue;qe=!1,i.delete(be.locatorHash),e.delete(se.descriptorHash),r.delete(se.descriptorHash),n.delete(be.locatorHash);let $=p.get(se.descriptorHash)||[],G=[F.locatorHash,...$];p.delete(se.descriptorHash);for(let Ce of G){let ee=i.get(Ce);typeof ee!="undefined"&&ee.dependencies.set(se.identHash,De)}}}while(!qe);for(let re of[...Ne,...Pe])re()};for(let q of t.workspaces){let A=q.anchoredLocator;o.delete(q.anchoredDescriptor.descriptorHash),R(q.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var L;(function(V){V[V.NotProvided=0]="NotProvided",V[V.NotCompatible=1]="NotCompatible"})(L||(L={}));let K=[];for(let[q,A]of m){let V=i.get(q);if(typeof V=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let W=d.get(q);if(typeof W!="undefined")for(let X of A){let F=i.get(X);if(typeof F!="undefined")for(let[D,he]of W){let pe=In(D);if(F.peerDependencies.has(pe.identHash))continue;let Ne=`p${zi(X,D,q).slice(0,5)}`;a.set(Ne,{subject:X,requested:pe,rootRequester:q,allRequesters:he});let Pe=V.dependencies.get(pe.identHash);if(typeof Pe!="undefined"){let qe=b(Pe),re=(ne=qe.version)!=null?ne:"0.0.0",se=new Set;for(let ae of he){let Ae=i.get(ae);if(typeof Ae=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let De=Ae.peerDependencies.get(pe.identHash);if(typeof De=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");se.add(De.range)}[...se].every(ae=>{if(ae.startsWith(Yr.protocol)){if(!t.tryWorkspaceByLocator(qe))return!1;ae=ae.slice(Yr.protocol.length),(ae==="^"||ae==="~")&&(ae="*")}return lc(re,ae)})||K.push({type:1,subject:F,requested:pe,requester:V,version:re,hash:Ne,requirementCount:he.length})}else{let qe=V.peerDependenciesMeta.get(D);(qe==null?void 0:qe.optional)||K.push({type:0,subject:F,requested:pe,requester:V,hash:Ne})}}}}let J=[q=>Rx(q.subject),q=>St(q.requested),q=>`${q.type}`];for(let q of gn(K,J))switch(q.type){case 0:l==null||l.reportWarning(z.MISSING_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} doesn't provide ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}), requested by ${Vr(t.configuration,q.requester)}`);break;case 1:{let A=q.requirementCount>1?"and some of its descendants request":"requests";l==null||l.reportWarning(z.INCOMPATIBLE_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} provides ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}) with version ${fp(t.configuration,q.version)}, which doesn't satisfy what ${Vr(t.configuration,q.requester)} ${A}`)}break}K.length>0&&(l==null||l.reportWarning(z.UNNAMED,`Some peer dependencies are incorrectly met; run ${Ve(t.configuration,"yarn explain peer-requirements ",Le.CODE)} for details, where ${Ve(t.configuration,"",Le.CODE)} is the six-letter p-prefixed code`))}var Po;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(Po||(Po={}));var Rd=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!T.existsSync(i),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue(Po.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(Po.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(Po.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(Po.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(Po.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(Po.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(Po.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(Po.DEPENDENCY_COUNT,String(e))}reportValue(e,r){Pl(this.values,e).add(r)}reportEnumerator(e,r){Pl(this.enumerators,e).add(zi(r))}reportHit(e,r="*"){let i=pu(this.hits,e),n=na(i,r,()=>0);i.set(r,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return v.join(e,"telemetry.json")}sendReport(e){var u,g,f;let r=this.getRegistryPath(),i;try{i=T.readJsonSync(r)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{T.mkdirSync(v.dirname(r),{recursive:!0}),T.writeJsonSync(r,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>iP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let d=p;d.userId=h,d.reportType="primary";for(let B of Object.keys((f=d.enumerators)!=null?f:{}))d.enumerators[B]=d.enumerators[B].length;c(d);let m=new Map,E=20;for(let[B,b]of Object.entries(d.values))b.length>0&&m.set(B,b.slice(0,E));for(;m.size>0;){let B={};B.userId=h,B.reportType="secondary",B.metrics={};for(let[b,R]of m)B.metrics[b]=R.shift(),R.length===0&&m.delete(b);c(B)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),r;try{r=T.readJsonSync(e)}catch{r={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=r.blocks=(a=r.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let d of this.hits.keys()){let m=s.hits=(c=s.hits)!=null?c:{},E=m[d]=(u=m[d])!=null?u:{};for(let[B,b]of this.hits.get(d))E[B]=((g=E[B])!=null?g:0)+b}for(let d of["values","enumerators"])for(let m of this[d].keys()){let E=s[d]=(f=s[d])!=null?f:{};E[m]=[...new Set([...(h=E[m])!=null?h:[],...(p=this[d].get(m))!=null?p:[]])]}T.mkdirSync(v.dirname(e),{recursive:!0}),T.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var fF=ie(require("child_process")),R$=ie(ml());var hF=ie(require("fs"));var Yg=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function cUe(t){let e=M.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,fF.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,fF.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function i0({binaryVersion:t,pluginConfiguration:e}){async function r(){let n=new oo({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var p,d,m,E,B;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(process.env.YARN_IGNORE_NODE!=="1"&&!qt.satisfiesWithPrereleases(s,o))throw new me(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let a=await fe.find(M.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),l=a.get("yarnPath"),c=a.get("ignorePath"),u=a.get("ignoreCwd"),g=M.toPortablePath(M.resolve(process.argv[1])),f=b=>T.readFilePromise(b).catch(()=>Buffer.of());if(!c&&!u&&await(async()=>l===g||Buffer.compare(...await Promise.all([f(l),f(g)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(l!==null&&!c)if(!T.existsSync(l))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${a.sources.get("yarnPath")}), but the specified location doesn't exist (${l}).`))),process.exitCode=1;else try{cUe(l)}catch(b){process.exitCode=b.code||1}else{c&&delete process.env.YARN_IGNORE_PATH,a.get("enableTelemetry")&&!R$.isCI&&process.stdout.isTTY&&(fe.telemetry=new Rd(a,"puba9cdc10ec5790a2cf4969dd413a47270")),(p=fe.telemetry)==null||p.reportVersion(t);for(let[L,K]of a.plugins.entries()){Yg.has((m=(d=L.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:d[1])!=null?m:"")&&((E=fe.telemetry)==null||E.reportPluginName(L));for(let J of K.commands||[])n.register(J)}let R=n.process(process.argv.slice(2));R.help||(B=fe.telemetry)==null||B.reportCommandName(R.path.join(" "));let H=R.cwd;if(typeof H!="undefined"&&!u){let L=(0,hF.realpathSync)(process.cwd()),K=(0,hF.realpathSync)(H);if(L!==K){process.chdir(H),await r();return}}await n.runExit(R,{cwd:M.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return r().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>T.rmtempPromise())}function F$(t){t.Command.Path=(...e)=>r=>{r.paths=r.paths||[],r.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])t.Command[e]=(...r)=>(i,n)=>{let s=t.Option[e](...r);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return t}var iC={};it(iC,{BaseCommand:()=>Be,WorkspaceRequiredError:()=>rt,getDynamicLibs:()=>Wie,getPluginConfiguration:()=>F0,main:()=>i0,openWorkspace:()=>rf,pluginCommands:()=>Yg});var Be=class extends ye{constructor(){super(...arguments);this.cwd=Y.String("--cwd",{hidden:!0})}};var rt=class extends me{constructor(e,r){let i=v.relative(e,r),n=v.join(e,Ze.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var dJe=ie(Or());Ss();var CJe=ie(gN()),Wie=()=>new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",vh],["semver",dJe],["typanion",lu],["yup",CJe]]);async function rf(t,e){let{project:r,workspace:i}=await Ke.find(t,e);if(!i)throw new rt(r.cwd,e);return i}var x_e=ie(Or());Ss();var k_e=ie(gN());var hL={};it(hL,{dedupeUtils:()=>zN,default:()=>Q4e,suggestUtils:()=>LN});var WAe=ie(ml());var roe=ie(aC());Ss();var LN={};it(LN,{Modifier:()=>Lo,Strategy:()=>Fr,Target:()=>vr,WorkspaceModifier:()=>af,applyModifier:()=>Zse,extractDescriptorFromPath:()=>ON,extractRangeModifier:()=>Xse,fetchDescriptorFrom:()=>MN,findProjectDescriptors:()=>toe,getModifier:()=>AC,getSuggestedDescriptors:()=>lC,makeWorkspaceDescriptor:()=>eoe,toWorkspaceModifier:()=>$se});var TN=ie(Or()),L3e="workspace:",vr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(vr||(vr={}));var Lo;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(Lo||(Lo={}));var af;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(af||(af={}));var Fr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Fr||(Fr={}));function AC(t,e){return t.exact?Lo.EXACT:t.caret?Lo.CARET:t.tilde?Lo.TILDE:e.configuration.get("defaultSemverRangePrefix")}var T3e=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function Xse(t,{project:e}){let r=t.match(T3e);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Zse(t,e){let{protocol:r,source:i,params:n,selector:s}=S.parseRange(t.range);return TN.default.valid(s)&&(s=`${e}${t.range}`),S.makeDescriptor(t,S.makeRange({protocol:r,source:i,params:n,selector:s}))}function $se(t){switch(t){case Lo.CARET:return af.CARET;case Lo.TILDE:return af.TILDE;case Lo.EXACT:return af.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function eoe(t,e){return S.makeDescriptor(t.anchoredDescriptor,`${L3e}${$se(e)}`)}async function toe(t,{project:e,target:r}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(r===vr.PEER){let o=s.manifest.peerDependencies.get(t.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(t.identHash),a=s.manifest.devDependencies.get(t.identHash);r===vr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function ON(t,{cwd:e,workspace:r}){return await M3e(async i=>{v.isAbsolute(t)||(t=v.relative(r.cwd,v.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:n}=r,s=await MN(S.makeIdent(null,"archive"),t,{project:r.project,cache:i,workspace:r});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new ei,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,r.anchoredLocator,c),g=S.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await Ze.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return S.makeDescriptor(h.name,t)})}async function lC(t,{project:e,workspace:r,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(t.range!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${S.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof r!="undefined"&&r!==null&&r.manifest[n].get(t.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Fr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${S.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Fr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await toe(t,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===r.anchoredLocator.locatorHash&&o.includes(Fr.KEEP))continue;let d=`(originally used by ${S.prettyLocator(e.configuration,p[0])}`;d+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:d})}});break;case Fr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===t.identHash&&c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Fr.PROJECT:await g(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(t);if(h===null)return;let p=eoe(h,s);c.push({descriptor:p,name:`Attach ${S.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ue.pretty(e.configuration,h.relativeCwd,ue.Type.PATH)})`})});break;case Fr.LATEST:await g(async()=>{if(t.range!=="unknown")c.push({descriptor:t,name:`Use ${S.prettyRange(e.configuration,t.range)}`,reason:"(explicit range requested)"});else if(n===vr.PEER)c.push({descriptor:S.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ue.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await MN(t,"latest",{project:e,cache:i,workspace:r,preserveModifier:!1});h&&(h=Zse(h,s),c.push({descriptor:h,name:`Use ${S.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function MN(t,e,{project:r,cache:i,workspace:n,preserveModifier:s=!0}){let o=S.makeDescriptor(t,e),a=new ei,l=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),u={project:r,fetcher:l,cache:i,checksums:r.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=_(P({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:d,source:m,params:E,selector:B}=S.parseRange(S.convertToManifestRange(p.reference));if(d===r.configuration.get("defaultProtocol")&&(d=null),TN.default.valid(B)&&s!==!1){let b=typeof s=="string"?s:o.range;B=Xse(b,{project:r})+B}return S.makeDescriptor(p,S.makeRange({protocol:d,source:m,params:E,selector:B}))}async function M3e(t){return await T.mktempPromise(async e=>{let r=fe.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Qt(e,{configuration:r,check:!1,immutable:!1}))})}var cC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=Y.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=Y.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=Y.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=Y.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=Y.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=Y.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.silent=Y.Boolean("--silent",{hidden:!0});this.packages=Y.Rest()}async execute(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=[...s?[Fr.REUSE]:[],Fr.PROJECT,...this.cached?[Fr.CACHE]:[],Fr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async m=>{let E=m.match(/^\.{0,2}\//)?await ON(m,{cwd:this.context.cwd,workspace:i}):S.parseDescriptor(m),B=O3e(i,E,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),b=await lC(E,{project:r,workspace:i,cache:n,target:B,modifier:o,strategies:a,maxResults:l});return[E,b,B]})),u=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[E,{suggestions:B,rejections:b}]of c)if(B.filter(H=>H.descriptor!==null).length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,E)} can't be resolved to a satisfying range`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,E)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),m.reportSeparator(),m.reportExceptionOnce(H)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:m},E]of c){let B,b=m.filter(K=>K.descriptor!==null),R=b[0].descriptor,H=b.every(K=>S.areDescriptorsEqual(K.descriptor,R));b.length===1||H?B=R:(g=!0,{answer:B}=await(0,roe.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:m.map(({descriptor:K,name:J,reason:ne})=>K?{name:J,hint:ne,descriptor:K}:{name:J,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result(K){return this.find(K,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let L=i.manifest[E].get(B.identHash);(typeof L=="undefined"||L.descriptorHash!==B.descriptorHash)&&(i.manifest[E].set(B.identHash,B),this.optional&&(E==="dependencies"?i.manifest.ensureDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0:E==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0)),typeof L=="undefined"?f.push([i,E,B,a]):h.push([i,E,L,B]))}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` +`),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};cC.paths=[["add"]],cC.usage=ye.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var ioe=cC;function O3e(t,e,{dev:r,peer:i,preferDev:n,optional:s}){let o=t.manifest[vr.REGULAR].has(e.identHash),a=t.manifest[vr.DEVELOPMENT].has(e.identHash),l=t.manifest[vr.PEER].has(e.identHash);if((r||i)&&o)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||n)&&s)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?vr.PEER:r||n?vr.DEVELOPMENT:o?vr.REGULAR:a?vr.DEVELOPMENT:vr.REGULAR}var uC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);if(await r.restoreInstallState(),this.name){let o=(await Kt.getPackageAccessibleBinaries(i,{project:r})).get(this.name);if(!o)throw new me(`Couldn't find a binary named "${this.name}" for package "${S.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} +`),0}return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Kt.getPackageAccessibleBinaries(i,{project:r}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:S.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${S.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};uC.paths=[["bin"]],uC.usage=ye.Usage({description:"get the path to a binary script",details:` + When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. + + When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var noe=uC;var gC=class extends Be{constructor(){super(...arguments);this.mirror=Y.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=Y.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await Qt.find(e);return(await Fe.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&r.mirrorCwd!==null,s=!this.mirror;n&&(await T.removePromise(r.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await T.removePromise(r.cwd)})).exitCode()}};gC.paths=[["cache","clean"],["cache","clear"]],gC.usage=ye.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var soe=gC;var ooe=ie(p0()),KN=ie(require("util")),fC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=Y.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(r)=="undefined")throw new me(`Couldn't find a configuration settings named "${r}"`);let s=e.getSpecial(r,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=de.convertMapsToIndexableObjects(s),a=i?(0,ooe.default)(o,i):o,l=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} +`),l.exitCode();KN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,KN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} +`)}return l.exitCode()}};fC.paths=[["config","get"]],fC.usage=ye.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. + `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var aoe=fC;var Iae=ie(qN()),Eae=ie(p0()),yae=ie(mae()),JN=ie(require("util")),pC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String();this.value=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new me("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>fe.updateHomeConfiguration(h):h=>fe.updateConfiguration(r(),h))(h=>{if(n){let p=(0,Iae.default)(h);return(0,yae.default)(p,this.name,o),p}else return _(P({},h),{[i]:o})});let c=(await fe.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=de.convertMapsToIndexableObjects(c),g=n?(0,Eae.default)(u,n):u;return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{JN.inspect.styles.name="cyan",h.reportInfo(z.UNNAMED,`Successfully set ${this.name} to ${(0,JN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};pC.paths=[["config","set"]],pC.usage=ye.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var wae=pC;var Dae=ie(qN()),Rae=ie(Ld()),Fae=ie(Pae()),dC=class extends Be{constructor(){super(...arguments);this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>fe.updateHomeConfiguration(l):l=>fe.updateConfiguration(r(),l);return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,Rae.default)(u,this.name))return l.reportWarning(z.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Dae.default)(u):P({},u);return(0,Fae.default)(g,this.name),g}),c||l.reportInfo(z.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};dC.paths=[["config","unset"]],dC.usage=ye.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var Nae=dC;var WN=ie(require("util")),CC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=Y.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(z.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=de.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(P({key:s,effective:a,source:l},o))}}else{let n=de.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,WN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,WN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};CC.paths=[["config"]],CC.usage=ye.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});var Lae=CC;Ss();var zN={};it(zN,{Strategy:()=>Oc,acceptedStrategies:()=>Hze,dedupe:()=>VN});var Tae=ie(Nn()),Oc;(function(e){e.HIGHEST="highest"})(Oc||(Oc={}));var Hze=new Set(Object.values(Oc)),Gze={highest:async(t,e,{resolver:r,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of t.storedResolutions){let c=t.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);de.getSetWithDefault(o,c.identHash).add(l)}return Array.from(t.storedDescriptors.values(),async a=>{if(e.length&&!Tae.default.isMatch(S.stringifyIdent(a),e))return null;let l=t.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=t.originalPackages.get(l);if(typeof c=="undefined"||!r.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(m=>{let E=t.originalPackages.get(m);if(typeof E=="undefined")throw new Error(`Assertion failed: The package (${m}) should have been registered`);return E.reference}),f=await r.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,d=t.originalPackages.get(p);if(typeof d=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:d}})}};async function VN(t,{strategy:e,patterns:r,cache:i,report:n}){let{configuration:s}=t,o=new ei,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:t.storedChecksums,fetcher:l,project:t,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:t,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await Gze[e](t,r,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Xi.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(E=>E.then(B=>{if(B===null)return;p++;let{descriptor:b,currentPackage:R,updatedPackage:H}=B;n.reportInfo(z.UNNAMED,`${S.prettyDescriptor(s,b)} can be deduped from ${S.prettyLocator(s,R)} to ${S.prettyLocator(s,H)}`),n.reportJson({descriptor:S.stringifyDescriptor(b),currentResolution:S.stringifyLocator(R),updatedResolution:S.stringifyLocator(H)}),t.storedResolutions.set(b.descriptorHash,H.locatorHash)}).finally(()=>h.tick())));let d;switch(p){case 0:d="No packages";break;case 1:d="One package";break;default:d=`${p} packages`}let m=ue.pretty(s,e,ue.Type.CODE);return n.reportInfo(z.UNNAMED,`${d} can be deduped using the ${m} strategy`),p})}var mC=class extends Be{constructor(){super(...arguments);this.strategy=Y.String("-s,--strategy",Oc.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:Yi(Oc)});this.check=Y.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=await Qt.find(e);await r.restoreInstallState({restoreResolutions:!1});let n=0,s=await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await VN(r,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await r.install({cache:i,report:a,mode:this.mode})})).exitCode()}};mC.paths=[["dedupe"]],mC.usage=ye.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var Mae=mC;var Y0=class extends Be{async execute(){let{plugins:e}=await fe.find(this.context.cwd,this.context.plugins),r=[];for(let o of e){let{commands:a}=o[1];if(a){let c=oo.from(a).definitions();r.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=Kae()["@yarnpkg/builder"].bundles.standard;for(let o of r){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} +`)}};Y0.paths=[["--clipanion=definitions"]];var Uae=Y0;var q0=class extends Be{async execute(){this.context.stdout.write(this.cli.usage(null))}};q0.paths=[["help"],["--help"],["-h"]];var Hae=q0;var _N=class extends Be{constructor(){super(...arguments);this.leadingArgument=Y.String();this.args=Y.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!S.tryParseIdent(this.leadingArgument)){let e=v.resolve(this.context.cwd,M.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Gae=_N;var J0=class extends Be{async execute(){this.context.stdout.write(`${Zr||""} +`)}};J0.paths=[["-v"],["--version"]];var jae=J0;var IC=class extends Be{constructor(){super(...arguments);this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState(),await Kt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:r})}};IC.paths=[["exec"]],IC.usage=ye.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var Yae=IC;Ss();var EC=class extends Be{constructor(){super(...arguments);this.hash=Y.String({required:!1,validator:fv(gv(),[hv(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState({restoreResolutions:!1}),await r.applyLightResolution(),typeof this.hash!="undefined"?await jze(this.hash,r,{stdout:this.context.stdout}):(await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>S.stringifyLocator(r.storedPackages.get(a.subject)),([,a])=>S.stringifyIdent(a.requested)];for(let[a,l]of de.sortMap(r.peerRequirements,s)){let c=r.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=r.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ue.pretty(e,a,ue.Type.CODE),h=S.prettyLocator(e,c),p=S.prettyIdent(e,l.requested),d=S.prettyIdent(e,u),m=l.allRequesters.length-1,E=`descendant${m===1?"":"s"}`,B=m>0?` and ${m} ${E}`:"",b=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${b} ${p} to ${d}${B}`)}})).exitCode()}};EC.paths=[["explain","peer-requirements"]],EC.usage=ye.Usage({description:"explain a set of peer requirements",details:` + A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. + + When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. + + When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. + + **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var qae=EC;async function jze(t,e,r){let{configuration:i}=e,n=e.peerRequirements.get(t);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Fe.start({configuration:i,stdout:r.stdout,includeFooter:!1},async o=>{var E,B;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(E=a.dependencies.get(n.requested.identHash))!=null?E:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(b=>{let R=e.storedPackages.get(b);if(typeof R=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let H=S.devirtualizeLocator(R),L=e.storedPackages.get(H.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let K=L.peerDependencies.get(n.requested.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:R,peerDependency:K}});if(g!==null){let b=f.every(({peerDependency:R})=>qt.satisfiesWithPrereleases(g.version,R.range));o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} provides ${S.prettyLocator(i,g)} with version ${S.prettyReference(i,(B=g.version)!=null?B:"")}, which ${b?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} doesn't provide ${S.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ue.mark(i),p=[];for(let{pkg:b,peerDependency:R}of de.sortMap(f,H=>S.stringifyLocator(H.pkg))){let L=(g!==null?qt.satisfiesWithPrereleases(g.version,R.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:S.stringifyLocator(b),prettyLocator:S.prettyLocator(i,b),prettyRange:S.prettyRange(i,R.range),mark:L})}let d=Math.max(...p.map(({stringifiedLocator:b})=>b.length)),m=Math.max(...p.map(({prettyRange:b})=>b.length));for(let{stringifiedLocator:b,prettyLocator:R,prettyRange:H,mark:L}of de.sortMap(p,({stringifiedLocator:K})=>K))o.reportInfo(null,`${R.padEnd(d+(R.length-b.length)," ")} \u2192 ${H.padEnd(m," ")} ${L}`);p.length>1&&(o.reportSeparator(),o.reportInfo(z.UNNAMED,`Note: these requirements start with ${S.prettyLocator(e.configuration,l)}`))})).exitCode()}var Jae=ie(Nn()),yC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=Y.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=Y.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=Y.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=Y.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=Y.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=Y.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i&&!this.all)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(b,{recursive:R})=>{let H=b.anchoredLocator.locatorHash,L=new Map,K=[H];for(;K.length>0;){let J=K.shift();if(L.has(J))continue;let ne=r.storedPackages.get(J);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(L.set(J,ne),S.isVirtualLocator(ne)&&K.push(S.devirtualizeLocator(ne).locatorHash),!(!R&&J!==H))for(let q of ne.dependencies.values()){let A=r.storedResolutions.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");K.push(A)}}return L.values()},a=({recursive:b})=>{let R=new Map;for(let H of r.workspaces)for(let L of o(H,{recursive:b}))R.set(L.locatorHash,L);return R.values()},l=({all:b,recursive:R})=>b&&R?r.storedPackages.values():b?a({recursive:R}):o(i,{recursive:R}),c=({all:b,recursive:R})=>{let H=l({all:b,recursive:R}),L=this.patterns.map(ne=>{let q=S.parseLocator(ne),A=Jae.default.makeRe(S.stringifyIdent(q)),V=S.isVirtualLocator(q),W=V?S.devirtualizeLocator(q):q;return X=>{let F=S.stringifyIdent(X);if(!A.test(F))return!1;if(q.reference==="unknown")return!0;let D=S.isVirtualLocator(X),he=D?S.devirtualizeLocator(X):X;return!(V&&D&&q.reference!==X.reference||W.reference!==he.reference)}}),K=de.sortMap([...H],ne=>S.stringifyLocator(ne));return{selection:K.filter(ne=>L.length===0||L.some(q=>q(ne))),sortedLookup:K}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new me("No package matched your request");let f=new Map;if(this.dependents)for(let b of g)for(let R of b.dependencies.values()){let H=r.storedResolutions.get(R.descriptorHash);if(typeof H=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");de.getArrayWithDefault(f,H).push(b)}let h=new Map;for(let b of g){if(!S.isVirtualLocator(b))continue;let R=S.devirtualizeLocator(b);de.getArrayWithDefault(h,R.locatorHash).push(b)}let p={},d={children:p},m=e.makeFetcher(),E={project:r,fetcher:m,cache:n,checksums:r.storedChecksums,report:new ei,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},B=[async(b,R,H)=>{var J,ne;if(!R.has("manifest"))return;let L=await m.fetch(b,E),K;try{K=await Ze.find(L.prefixPath,{baseFs:L.packageFs})}finally{(J=L.releaseFs)==null||J.call(L)}H("Manifest",{License:ue.tuple(ue.Type.NO_HINT,K.license),Homepage:ue.tuple(ue.Type.URL,(ne=K.raw.homepage)!=null?ne:null)})},async(b,R,H)=>{var A;if(!R.has("cache"))return;let L={mockedPackages:r.disabledLocators,unstablePackages:r.conditionalLocators},K=(A=r.storedChecksums.get(b.locatorHash))!=null?A:null,J=n.getLocatorPath(b,K,L),ne;if(J!==null)try{ne=T.statSync(J)}catch{}let q=typeof ne!="undefined"?[ne.size,ue.Type.SIZE]:void 0;H("Cache",{Checksum:ue.tuple(ue.Type.NO_HINT,K),Path:ue.tuple(ue.Type.PATH,J),Size:q})}];for(let b of u){let R=S.isVirtualLocator(b);if(!this.virtuals&&R)continue;let H={},L={value:[b,ue.Type.LOCATOR],children:H};if(p[S.stringifyLocator(b)]=L,this.nameOnly){delete L.children;continue}let K=h.get(b.locatorHash);typeof K!="undefined"&&(H.Instances={label:"Instances",value:ue.tuple(ue.Type.NUMBER,K.length)}),H.Version={label:"Version",value:ue.tuple(ue.Type.NO_HINT,b.version)};let J=(q,A)=>{let V={};if(H[q]=V,Array.isArray(A))V.children=A.map(W=>({value:W}));else{let W={};V.children=W;for(let[X,F]of Object.entries(A))typeof F!="undefined"&&(W[X]={label:X,value:F})}};if(!R){for(let q of B)await q(b,s,J);await e.triggerHook(q=>q.fetchPackageInfo,b,s,J)}b.bin.size>0&&!R&&J("Exported Binaries",[...b.bin.keys()].map(q=>ue.tuple(ue.Type.PATH,q)));let ne=f.get(b.locatorHash);typeof ne!="undefined"&&ne.length>0&&J("Dependents",ne.map(q=>ue.tuple(ue.Type.LOCATOR,q))),b.dependencies.size>0&&!R&&J("Dependencies",[...b.dependencies.values()].map(q=>{var W;let A=r.storedResolutions.get(q.descriptorHash),V=typeof A!="undefined"&&(W=r.storedPackages.get(A))!=null?W:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:V})})),b.peerDependencies.size>0&&R&&J("Peer dependencies",[...b.peerDependencies.values()].map(q=>{var X,F;let A=b.dependencies.get(q.identHash),V=typeof A!="undefined"&&(X=r.storedResolutions.get(A.descriptorHash))!=null?X:null,W=V!==null&&(F=r.storedPackages.get(V))!=null?F:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:W})}))}Hs.emitTree(d,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};yC.paths=[["info"]],yC.usage=ye.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var Wae=yC;var W0=ie(ml());Ss();var wC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=Y.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=Y.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=Y.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=Y.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.cacheFolder=Y.String("--cache-folder",{hidden:!0});this.frozenLockfile=Y.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=Y.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=Y.Boolean("--non-interactive",{hidden:!0});this.preferOffline=Y.Boolean("--prefer-offline",{hidden:!0});this.production=Y.Boolean("--production",{hidden:!0});this.registry=Y.String("--registry",{hidden:!0});this.silent=Y.Boolean("--silent",{hidden:!0});this.networkTimeout=Y.String("--network-timeout",{hidden:!0})}async execute(){var c;let e=await fe.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let r=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(u,{error:g})=>{let f=await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async h=>{g?h.reportError(z.DEPRECATED_CLI_SETTINGS,u):h.reportWarning(z.DEPRECATED_CLI_SETTINGS,u)});return f.hasErrors()?f.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let u=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.registry!="undefined"){let u=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(u!==null)return u}if(typeof this.preferOffline!="undefined"){let u=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.production!="undefined"){let u=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(u!==null)return u}if(typeof this.nonInteractive!="undefined"){let u=await i("The --non-interactive option is deprecated",{error:!r});if(u!==null)return u}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let u=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!W0.default.NETLIFY});if(u!==null)return u}let n=(c=this.immutable)!=null?c:e.get("enableImmutableInstalls");if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{await Yze(e,n)&&(g.reportInfo(z.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let u=e.projectCwd,g;try{g=await T.readFilePromise(v.join(u,wt.lockfile),"utf8")}catch{}if(g==null?void 0:g.includes("yarn lockfile v1")){let f=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{h.reportInfo(z.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),h.reportSeparator(),e.use("",{nodeLinker:"node-modules"},u,{overwrite:!0}),await fe.updateConfiguration(u,{nodeLinker:"node-modules"})});if(f.hasErrors())return f.exitCode()}}if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{var f;((f=fe.telemetry)==null?void 0:f.isNew)&&(g.reportInfo(z.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),g.reportInfo(z.TELEMETRY_NOTICE,`Run ${ue.pretty(e,"yarn config set --home enableTelemetry 0",ue.Type.CODE)} to disable`),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}let{project:s,workspace:o}=await Ke.find(e,this.context.cwd),a=await Qt.find(e,{immutable:this.immutableCache,check:this.checkCache});if(!o)throw new rt(s.cwd,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async u=>{await s.install({cache:a,report:u,immutable:n,mode:this.mode})})).exitCode()}};wC.paths=[["install"],ye.Default],wC.usage=ye.Usage({description:"install the project dependencies",details:` + This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: + + - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). + + - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). + + - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). + + - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. + + Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. + + If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. + + If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). + + If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. + + If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var zae=wC,qze="|||||||",Jze=">>>>>>>",Wze="=======",Vae="<<<<<<<";async function Yze(t,e){if(!t.projectCwd)return!1;let r=v.join(t.projectCwd,t.get("lockfileFilename"));if(!await T.existsPromise(r))return!1;let i=await T.readFilePromise(r,"utf8");if(!i.includes(Vae))return!1;if(e)throw new nt(z.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=zze(i),o,a;try{o=Ei(n),a=Ei(s)}catch(c){throw new nt(z.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=P(P({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await T.changeFilePromise(r,Qa(l),{automaticNewlines:!0}),!0}function zze(t){let e=[[],[]],r=t.split(/\r?\n/g),i=!1;for(;r.length>0;){let n=r.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Vae)){for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===Wze){i=!1;break}else if(i||s.startsWith(qze)){i=!0;continue}else e[0].push(s)}for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(Jze))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` +`),e[1].join(` +`)]}var BC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=Y.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=Y.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=v.resolve(this.context.cwd,M.toPortablePath(this.destination)),o=await fe.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await Ke.find(o,s);if(r.cwd===a.cwd)throw new me("Invalid destination; Can't link the project to itself");if(!l)throw new rt(a.cwd,s);let c=r.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new me("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new me("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=S.stringifyIdent(f.locator),p=this.relative?v.relative(r.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Fe.start({configuration:e,stdout:this.context.stdout},async f=>{await r.install({cache:n,report:f})})).exitCode()}};BC.paths=[["link"]],BC.usage=ye.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var _ae=BC;var QC=class extends Be{constructor(){super(...arguments);this.args=Y.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};QC.paths=[["node"]],QC.usage=ye.Usage({description:"run node with the hook already setup",details:` + This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + + The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Xae=QC;var lAe=ie(require("os"));var rAe=ie(require("os"));var Vze="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Kc(t){let e=await Zt.get(Vze,{configuration:t});return Ei(e.toString())}var bC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await Kc(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=qr(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(P({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};bC.paths=[["plugin","list"]],bC.usage=ye.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Zae=bC;var $ae=ie(Or()),vC=class extends Be{constructor(){super(...arguments);this.onlyIfNeeded=Y.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let r=()=>{if(typeof Zr=="undefined")throw new me("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=r();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await eAe(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await eAe(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.version))i=`file://${M.resolve(this.version)}`;else if(qt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(qt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(qt.validRange(this.version))i=`https://repo.yarnpkg.com/${await _ze(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new me(`Invalid version descriptor "${this.version}"`);return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,i,ps.URL)}`),a=await T.readFilePromise(M.toPortablePath(i.slice(o.length)))):(s.reportInfo(z.UNNAMED,`Retrieving ${ue.pretty(e,i,ps.PATH)}`),a=await Zt.get(i,{configuration:e})),await XN(e,null,a,{report:s})})).exitCode()}};vC.paths=[["set","version"]],vC.usage=ye.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Download the version used to invoke the command","$0 set version self"]]});var tAe=vC;async function _ze(t,e){let i=(await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(n=>qt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new me(`No matching release found for range ${ue.pretty(t,e,ue.Type.RANGE)}.`);return i[0]}async function eAe(t,e){let r=await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new me(`Tag ${ue.pretty(t,e,ue.Type.RANGE)} not found`);return r.latest[e]}async function XN(t,e,r,{report:i}){var g;e===null&&await T.mktempPromise(async f=>{let h=v.join(f,"yarn.cjs");await T.writeFilePromise(h,r);let{stdout:p}=await hr.execvp(process.execPath,[M.fromPortablePath(h),"--version"],{cwd:f,env:_(P({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!$ae.default.valid(e))throw new Error(`Invalid semver version. ${ue.pretty(t,"yarn --version",ue.Type.CODE)} returned: +${e}`)});let n=(g=t.projectCwd)!=null?g:t.startingCwd,s=v.resolve(n,".yarn/releases"),o=v.resolve(s,`yarn-${e}.cjs`),a=v.relative(t.startingCwd,o),l=v.relative(n,o),c=t.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(z.UNNAMED,`Saving the new release in ${ue.pretty(t,a,"magenta")}`),await T.removePromise(v.dirname(o)),await T.mkdirPromise(v.dirname(o),{recursive:!0}),await T.writeFilePromise(o,r,{mode:493}),u){await fe.updateConfiguration(n,{yarnPath:l});let f=await Ze.tryFind(n)||new Ze;e&&de.isTaggedYarnVersion(e)&&(f.packageManager=`yarn@${e}`);let h={};f.exportTo(h);let p=v.join(n,Ze.fileName),d=`${JSON.stringify(h,null,f.indent)} +`;await T.changeFilePromise(p,d,{automaticNewlines:!0})}}var Xze=/^[0-9]+$/;function iAe(t){return Xze.test(t)?`pull/${t}/head`:t}var Zze=({repository:t,branch:e},r)=>[["git","init",M.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin",iAe(e)],["git","reset","--hard","FETCH_HEAD"]],$ze=({branch:t})=>[["git","fetch","origin",iAe(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],e4e=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(i=>["--plugin",v.resolve(r,i)])),...e?["--no-minify"]:[],"|"]],SC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=Y.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=Y.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,rAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{await $N(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(z.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await xC(e4e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=v.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await T.readFilePromise(o);await XN(e,"sources",a,{report:s}),this.skipPlugins||await t4e(this,{project:r,report:s,target:i})})).exitCode()}};SC.paths=[["set","version","from","sources"]],SC.usage=ye.Usage({description:"build Yarn from master",details:` + This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});var nAe=SC;async function xC(t,{configuration:e,context:r,target:i}){for(let[n,...s]of t){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await hr.pipevp(n,s,{cwd:i,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${ue.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} +`);try{await hr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw r.stdout.write(a.stdout||a.stack),a}}}}async function $N(t,{configuration:e,report:r,target:i}){let n=!1;if(!t.force&&T.existsSync(v.join(i,".git"))){r.reportInfo(z.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await xC($ze(t),{configuration:e,context:t.context,target:i}),n=!0}catch(s){r.reportSeparator(),r.reportWarning(z.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo(z.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await T.removePromise(i),await T.mkdirPromise(i,{recursive:!0}),await xC(Zze(t,i),{configuration:e,context:t.context,target:i}))}async function t4e(t,{project:e,report:r,target:i}){let n=await Kc(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await ZN(o,t,{project:e,report:r,target:i})}var sAe=ie(Or()),oAe=ie(require("url")),aAe=ie(require("vm"));var kC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await Ke.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.name)){let a=v.resolve(this.context.cwd,M.toPortablePath(this.name));i.reportInfo(z.UNNAMED,`Reading ${ue.pretty(e,a,ue.Type.PATH)}`),s=v.relative(n.cwd,a),o=await T.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new oAe.URL(this.name)}catch{throw new nt(z.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=S.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!sAe.default.valid(l.reference))throw new nt(z.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=S.stringifyIdent(l),u=await Kc(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Zr!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Zr}/`))}i.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,a,"green")}`),o=await Zt.get(a,{configuration:e})}await eL(s,o,{project:n,report:i})})).exitCode()}};kC.paths=[["plugin","import"]],kC.usage=ye.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). + `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var AAe=kC;async function eL(t,e,{project:r,report:i}){let{configuration:n}=r,s={},o={exports:s};(0,aAe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=v.resolve(r.cwd,l);i.reportInfo(z.UNNAMED,`Saving the new plugin in ${ue.pretty(n,l,"magenta")}`),await T.mkdirPromise(v.dirname(c),{recursive:!0}),await T.writeFilePromise(c,e);let u={path:l,spec:t};await fe.updateConfiguration(r.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let d=typeof p!="string"?p.path:p,m=v.resolve(r.cwd,M.toPortablePath(d)),{name:E}=de.dynamicRequire(m);E!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),_(P({},g),{plugins:f})})}var r4e=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],PC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,lAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await Ke.find(e,this.context.cwd),o=S.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=S.stringifyIdent(o),l=await Kc(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await $N(this,{configuration:e,report:n,target:r}),await ZN(c,this,{project:s,report:n,target:r})})).exitCode()}};PC.paths=[["plugin","import","from","sources"]],PC.usage=ye.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var cAe=PC;async function ZN(t,{context:e,noMinify:r},{project:i,report:n,target:s}){let o=t.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(z.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await xC(r4e({pluginName:o,noMinify:r},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=v.resolve(s,`packages/${o}/bundles/${t}.js`),c=await T.readFilePromise(l);await eL(t,c,{project:i,report:n})}var DC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=S.parseIdent(s);if(!e.plugins.has(s))throw new me(`${S.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=v.resolve(r.cwd,a);T.existsSync(l)&&(n.reportInfo(z.UNNAMED,`Removing ${ue.pretty(e,a,ue.Type.PATH)}...`),await T.removePromise(l)),n.reportInfo(z.UNNAMED,"Updating the configuration..."),await fe.updateConfiguration(r.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:_(P({},c),{plugins:u})})})).exitCode()}};DC.paths=[["plugin","remove"]],DC.usage=ye.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. + `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var uAe=DC;var RC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};RC.paths=[["plugin","runtime"]],RC.usage=ye.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var gAe=RC;var FC=class extends Be{constructor(){super(...arguments);this.idents=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(S.parseIdent(a).identHash);if(await r.restoreInstallState({restoreResolutions:!1}),await r.resolveEverything({cache:n,report:new ei}),s.size>0)for(let a of r.storedPackages.values())s.has(a.identHash)&&r.storedBuildState.delete(a.locatorHash);else r.storedBuildState.clear();return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await r.install({cache:n,report:a})})).exitCode()}};FC.paths=[["rebuild"]],FC.usage=ye.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). + + By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var fAe=FC;var tL=ie(Nn());Ss();var NC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=this.all?r.workspaces:[i],o=[vr.REGULAR,vr.DEVELOPMENT,vr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,d=S.parseIdent(h);for(let m of s){let E=[...m.manifest.peerDependenciesMeta.keys()];for(let B of(0,tL.default)(E,h))m.manifest.peerDependenciesMeta.delete(B),l=!0,p=!0;for(let B of o){let b=m.manifest.getForScope(B),R=[...b.values()].map(H=>S.stringifyIdent(H));for(let H of(0,tL.default)(R,S.stringifyIdent(d))){let{identHash:L}=S.parseIdent(H),K=b.get(L);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");m.manifest[B].delete(L),c.push([m,B,K]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new me(`${u} ${ue.prettyList(e,a,ps.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Fe.start({configuration:e,stdout:this.context.stdout},async p=>{await r.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};NC.paths=[["remove"]],NC.usage=ye.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. + `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var hAe=NC;var pAe=ie(require("util")),z0=class extends Be{async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=de.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,pAe.inspect)(g,l)}`)})).exitCode()}};z0.paths=[["run"]];var dAe=z0;var LC=class extends Be{constructor(){super(...arguments);this.inspect=Y.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=Y.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=Y.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=Y.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=Y.Boolean("--silent",{hidden:!0});this.scriptName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i,locator:n}=await Ke.find(e,this.context.cwd);await r.restoreInstallState();let s=this.topLevel?r.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Kt.hasPackageScript(s,this.scriptName,{project:r}))return await Kt.executePackageScript(s,this.scriptName,this.args,{project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Kt.getPackageAccessibleBinaries(s,{project:r});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Kt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(r.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Kt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new me("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Yg)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new me(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new me(`Couldn't find a script named "${this.scriptName}".`)}}};LC.paths=[["run"]],LC.usage=ye.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. + + Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). + `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var CAe=LC;var TC=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=Y.String();this.resolution=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(await r.restoreInstallState({restoreResolutions:!1}),!i)throw new rt(r.cwd,this.context.cwd);let s=S.parseDescriptor(this.descriptor,!0),o=S.makeDescriptor(s,this.resolution);return r.storedDescriptors.set(s.descriptorHash,s),r.storedDescriptors.set(o.descriptorHash,o),r.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};TC.paths=[["set","resolution"]],TC.usage=ye.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var mAe=TC;var IAe=ie(Nn()),MC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=r.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=v.resolve(this.context.cwd,M.toPortablePath(l));if(de.isPathLike(l)){let u=await fe.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await Ke.find(u,c);if(!f)throw new rt(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(S.stringifyIdent(h.locator));if(o.size===0)throw new me("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be unlinked");o.add(S.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,IAe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};MC.paths=[["unlink"]],MC.usage=ye.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var EAe=MC;var yAe=ie(aC()),rL=ie(Nn());Ss();var uf=class extends Be{constructor(){super(...arguments);this.interactive=Y.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=[...r.storedDescriptors.values()],o=s.map(u=>S.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(S.parseDescriptor(u).range!=="unknown")throw new me("Ranges aren't allowed when using --recursive");for(let g of(0,rL.default)(o,u)){let f=S.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)r.storedDescriptors.delete(u.descriptorHash),r.storedResolutions.delete(u.descriptorHash);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{await r.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=s?[Fr.KEEP,Fr.REUSE,Fr.PROJECT,Fr.LATEST]:[Fr.PROJECT,Fr.LATEST],l=[],c=[];for(let m of this.patterns){let E=!1,B=S.parseDescriptor(m);for(let b of r.workspaces)for(let R of[vr.REGULAR,vr.DEVELOPMENT]){let L=[...b.manifest.getForScope(R).values()].map(K=>S.stringifyIdent(K));for(let K of(0,rL.default)(L,S.stringifyIdent(B))){let J=S.parseIdent(K),ne=b.manifest[R].get(J.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let q=S.makeDescriptor(J,B.range);l.push(Promise.resolve().then(async()=>[b,R,ne,await lC(q,{project:r,workspace:b,cache:n,target:R,modifier:o,strategies:a})])),E=!0}}E||c.push(m)}if(c.length>1)throw new me(`Patterns ${ue.prettyList(e,c,ps.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new me(`Pattern ${ue.prettyList(e,c,ps.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[,,E,{suggestions:B,rejections:b}]of u){let R=B.filter(H=>H.descriptor!==null);if(R.length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let L=this.cli.error(H);r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,E)} can't be resolved to a satisfying range + +${L}`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,E)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${L}`)}else R.length>1&&!s&&m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,E)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[m,E,,{suggestions:B}]of u){let b,R=B.filter(J=>J.descriptor!==null),H=R[0].descriptor,L=R.every(J=>S.areDescriptorsEqual(J.descriptor,H));R.length===1||L?b=H:(f=!0,{answer:b}=await(0,yAe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${S.prettyWorkspace(e,m)} \u276F ${E}?`,choices:B.map(({descriptor:J,name:ne,reason:q})=>J?{name:ne,hint:q,descriptor:J}:{name:ne,hint:q,disabled:!0}),onCancel:()=>process.exit(130),result(J){return this.find(J,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let K=m.manifest[E].get(b.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if(K.descriptorHash!==b.descriptorHash)m.manifest[E].set(b.identHash,b),h.push([m,E,K,b]);else{let J=e.makeResolver(),ne={project:r,resolver:J},q=J.bindDescriptor(K,m.anchoredLocator,ne);r.forgetResolution(q)}}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` +`),(await Fe.start({configuration:e,stdout:this.context.stdout},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};uf.paths=[["up"]],uf.usage=ye.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),uf.schema=[pv("recursive",Bl.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var wAe=uf;var OC=class extends Be{constructor(){super(...arguments);this.recursive=Y.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=Y.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=S.parseIdent(this.package).identHash,s=this.recursive?n4e(r,n,{configuration:e,peers:this.peers}):i4e(r,n,{configuration:e,peers:this.peers});Hs.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};OC.paths=[["why"]],OC.usage=ye.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var BAe=OC;function i4e(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.storedPackages.values(),a=>S.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=t.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=t.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=S.stringifyLocator(a);s[p]={value:[a,ue.Type.LOCATOR],children:l}}let h=S.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ue.Type.DEPENDENT]}}}return o}function n4e(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.workspaces,f=>S.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let d=t.storedResolutions.get(p.descriptorHash);if(!d)throw new Error("Assertion failed: The resolution should have been registered");let m=t.storedPackages.get(d);if(!m)throw new Error("Assertion failed: The package should have been registered");a(m)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let d=p!==null?ue.tuple(ue.Type.DEPENDENT,{locator:f,descriptor:p}):ue.tuple(ue.Type.LOCATOR,f),m={},E={value:d,children:m},B=S.stringifyLocator(f);if(h[B]=E,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&t.tryWorkspaceByLocator(f))))for(let b of f.dependencies.values()){if(!i&&f.peerDependencies.has(b.identHash))continue;let R=t.storedResolutions.get(b.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let H=t.storedPackages.get(R);if(!H)throw new Error("Assertion failed: The package should have been registered");g(H,m,b)}};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var fL={};it(fL,{default:()=>w4e,gitUtils:()=>Uc});var Uc={};it(Uc,{TreeishProtocols:()=>vn,clone:()=>cL,fetchBase:()=>jAe,fetchChangedFiles:()=>YAe,fetchChangedWorkspaces:()=>E4e,fetchRoot:()=>GAe,isGitUrl:()=>ff,lsRemote:()=>HAe,normalizeLocator:()=>AL,normalizeRepoUrl:()=>KC,resolveUrl:()=>lL,splitRepoUrl:()=>UC});var oL=ie(OAe()),gf=ie(require("querystring")),aL=ie(Or()),KAe=ie(require("url"));function UAe(){return _(P({},process.env),{GIT_SSH_COMMAND:"ssh -o BatchMode=yes"})}var I4e=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],vn;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(vn||(vn={}));function ff(t){return t?I4e.some(e=>!!t.match(e)):!1}function UC(t){t=KC(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:vn.Head,request:"HEAD"},extra:{}};let r=t.slice(0,e),i=t.slice(e+1);if(i.match(/^[a-z]+=/)){let n=gf.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(vn).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=vn.Head,a="HEAD");for(let l of Object.values(vn))delete n[l];return{repo:r,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:r,treeish:{protocol:s,request:o},extra:{}}}}function KC(t,{git:e=!1}={}){var r;if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){t=t.replace(/^git\+([^:]+):/,"$1:");let i;try{i=KAe.default.parse(t)}catch{i=null}i&&i.protocol==="ssh:"&&((r=i.path)==null?void 0:r.startsWith("/:"))&&(t=t.replace(/^ssh:\/\//,""))}return t}function AL(t){return S.makeLocator(t,KC(t.reference))}async function HAe(t,e){let r=KC(t,{git:!0});if(!Zt.getNetworkSettings(`https://${(0,oL.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let n;try{n=await hr.execvp("git",["ls-remote",r],{cwd:e.startingCwd,env:UAe(),strict:!0})}catch(l){throw l.message=`Listing the refs for ${t} failed`,l}let s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function lL(t,e){let{repo:r,treeish:{protocol:i,request:n},extra:s}=UC(t),o=await HAe(r,e),a=(c,u)=>{switch(c){case vn.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return gf.default.stringify(_(P({},s),{commit:u}))}case vn.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Semver:{let g=qt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,d])=>[aL.default.parse(p.slice(10)),d]).filter(p=>p[0]!==null)),h=aL.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return gf.default.stringify(_(P({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(vn.Commit,u))!==null||(g=l(vn.Tag,u))!==null||(g=l(vn.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${r}#${a(i,n)}`}async function cL(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:i,request:n}}=UC(t);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=KC(r,{git:!0});if(Zt.getNetworkSettings(`https://${(0,oL.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await T.mktempPromise(),a={cwd:o,env:UAe(),strict:!0};try{await hr.execvp("git",["clone","-c core.autocrlf=false",s,M.fromPortablePath(o)],a),await hr.execvp("git",["checkout",`${n}`],a)}catch(l){throw l.message=`Repository clone failed: ${l.message}`,l}return o})}async function GAe(t){let e=null,r,i=t;do r=i,await T.existsPromise(v.join(r,".git"))&&(e=r),i=v.dirname(r);while(e===null&&i!==r);return e}async function jAe(t,{baseRefs:e}){if(e.length===0)throw new me("Can't run this command with zero base refs specified.");let r=[];for(let a of e){let{code:l}=await hr.execvp("git",["merge-base",a,"HEAD"],{cwd:t});l===0&&r.push(a)}if(r.length===0)throw new me(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await hr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),n=i.trim(),{stdout:s}=await hr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:t,strict:!0}),o=s.trim();return{hash:n,title:o}}async function YAe(t,{base:e,project:r}){let i=de.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:n}=await hr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),{stdout:o}=await hr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!v.relative(r.cwd,c).match(i)):l}async function E4e({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new me("This command can only be run from within a Yarn project");let r=[v.resolve(e.cwd,e.configuration.get("cacheFolder")),v.resolve(e.cwd,e.configuration.get("installStatePath")),v.resolve(e.cwd,e.configuration.get("lockfileFilename")),v.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&r.push(o)});let i=await GAe(e.configuration.projectCwd);if(i==null)throw new me("This command can only be run on Git repositories");let n=await jAe(i,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),s=await YAe(i,{base:n.hash,project:e});return new Set(de.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?de.mapAndFilter.skip:r.some(l=>o.startsWith(l))?de.mapAndFilter.skip:a}))}var uL=class{supports(e,r){return ff(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,n=AL(e),s=new Map(r.checksums);s.set(n.locatorHash,i);let o=_(P({},r),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:S.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,r){return r.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let i=await cL(e.reference,r.project.configuration),n=UC(e.reference),s=v.join(i,"package.tgz");await Kt.prepareExternalProject(i,s,{configuration:r.project.configuration,report:r.report,workspace:n.extra.workspace,locator:e});let o=await T.readFilePromise(s);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}))}};var gL=class{supportsDescriptor(e,r){return ff(e.range)}supportsLocator(e,r){return ff(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=await lL(e.range,i.project.configuration);return[S.makeLocator(e,n)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var y4e={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:ge.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:ge.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:ge.NUMBER,default:2}},fetchers:[uL],resolvers:[gL]};var w4e=y4e;var HC=class extends Be{constructor(){super(...arguments);this.since=Y.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Uc.fetchChangedWorkspaces({ref:this.since,project:r}):r.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of Ze.hardDependencies)for(let[h,p]of l.getForScope(f)){let d=r.tryWorkspaceByDescriptor(p);d===null?r.workspacesByIdent.has(h)&&g.add(p):u.add(d)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>S.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(P({location:a.relativeCwd,name:l.name?S.stringifyIdent(l.name):null},c))}})).exitCode()}};HC.paths=[["workspaces","list"]],HC.usage=ye.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var qAe=HC;var GC=class extends Be{constructor(){super(...arguments);this.workspaceName=Y.String();this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=r.workspaces,s=new Map(n.map(a=>{let l=S.convertToIdent(a.locator);return[S.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new me(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${a.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};GC.paths=[["workspace"]],GC.usage=ye.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var JAe=GC;var B4e={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:ge.BOOLEAN,default:WAe.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:ge.STRING,values:["^","~",""],default:Lo.CARET}},commands:[soe,aoe,wae,Nae,mAe,nAe,tAe,qAe,Uae,Hae,Gae,jae,ioe,noe,Lae,Mae,Yae,qae,Wae,zae,_ae,EAe,Xae,cAe,AAe,uAe,Zae,gAe,fAe,hAe,dAe,CAe,wAe,BAe,JAe]},Q4e=B4e;var mL={};it(mL,{default:()=>v4e});var Me={optional:!0},zAe=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Me}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Me,["postcss-jsx"]:Me,["postcss-less"]:Me,["postcss-markdown"]:Me,["postcss-scss"]:Me}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Me}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Me}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Me,"vue-template-compiler":Me}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Me,"utf-8-validate":Me}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@*",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@*",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me,"vuetify-loader":Me}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Me}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Me}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Me,tinyliquid:Me,"liquid-node":Me,jade:Me,"then-jade":Me,dust:Me,"dustjs-helpers":Me,"dustjs-linkedin":Me,swig:Me,"swig-templates":Me,"razor-tmpl":Me,atpl:Me,liquor:Me,twig:Me,ejs:Me,eco:Me,jazz:Me,jqtpl:Me,hamljs:Me,hamlet:Me,whiskers:Me,"haml-coffee":Me,"hogan.js":Me,templayed:Me,handlebars:Me,underscore:Me,lodash:Me,pug:Me,"then-pug":Me,qejs:Me,walrus:Me,mustache:Me,just:Me,ect:Me,mote:Me,toffee:Me,dot:Me,"bracket-template":Me,ractive:Me,nunjucks:Me,htmling:Me,"babel-core":Me,plates:Me,"react-dom":Me,react:Me,"arc-templates":Me,vash:Me,slm:Me,marko:Me,teacup:Me,"coffee-script":Me,squirrelly:Me,twing:Me}}],["vue-loader@<=16.3.1",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@*",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@*",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@*",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@*",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Me}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Me}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Me,"webpack-command":Me}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Me}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Me}}]];var pL;function VAe(){return typeof pL=="undefined"&&(pL=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),pL}var dL;function _Ae(){return typeof dL=="undefined"&&(dL=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),dL}var CL;function XAe(){return typeof CL=="undefined"&&(CL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),CL}var ZAe=new Map([[S.makeIdent(null,"fsevents").identHash,VAe],[S.makeIdent(null,"resolve").identHash,_Ae],[S.makeIdent(null,"typescript").identHash,XAe]]),b4e={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,i]of zAe)e(S.parseDescriptor(r,!0),i)},getBuiltinPatch:async(t,e)=>{var s;let r="compat/";if(!e.startsWith(r))return;let i=S.parseIdent(e.slice(r.length)),n=(s=ZAe.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(t,e,r,i)=>typeof ZAe.get(t.identHash)=="undefined"?t:S.makeDescriptor(t,S.makeRange({protocol:"patch:",source:S.stringifyDescriptor(t),selector:`~builtin`,params:null}))}},v4e=b4e;var IL={};it(IL,{default:()=>x4e});var V0=class extends Be{constructor(){super(...arguments);this.pkg=Y.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let r=S.parseIdent(this.command),i=S.makeIdent(r.scope,`create-${r.name}`);return this.cli.run(["dlx",...e,S.stringifyIdent(i),...this.args])}};V0.paths=[["create"]];var $Ae=V0;var jC=class extends Be{constructor(){super(...arguments);this.packages=Y.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){return fe.telemetry=null,await T.mktempPromise(async e=>{var p;let r=v.join(e,`dlx-${process.pid}`);await T.mkdirPromise(r),await T.writeFilePromise(v.join(r,"package.json"),`{} +`),await T.writeFilePromise(v.join(r,"yarn.lock"),"");let i=v.join(r,".yarnrc.yml"),n=await fe.findProjectCwd(this.context.cwd,wt.lockfile),s=!(await fe.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?v.join(n,".yarnrc.yml"):null;o!==null&&T.existsSync(o)?(await T.copyFilePromise(o,i),await fe.updateConfiguration(r,d=>{let m=_(P({},d),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(d.plugins)&&(m.plugins=d.plugins.map(E=>{let B=typeof E=="string"?E:E.path,b=M.isAbsolute(B)?B:M.resolve(M.fromPortablePath(n),B);return typeof E=="string"?b:{path:b,spec:E.spec}})),m})):await T.writeFilePromise(i,`enableGlobalCache: ${s} +enableTelemetry: false +`);let a=(p=this.packages)!=null?p:[this.command],l=S.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:r,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` +`);let u=await fe.find(r,this.context.plugins),{project:g,workspace:f}=await Ke.find(u,r);if(f===null)throw new rt(g.cwd,r);await g.restoreInstallState();let h=await Kt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Kt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};jC.paths=[["dlx"]],jC.usage=ye.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var ele=jC;var S4e={commands:[$Ae,ele]},x4e=S4e;var xL={};it(xL,{default:()=>D4e,fileUtils:()=>EL});var hf=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,YC=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Nr="file:";var EL={};it(EL,{makeArchiveFromLocator:()=>_0,makeBufferFromLocator:()=>BL,makeLocator:()=>wL,makeSpec:()=>tle,parseSpec:()=>yL});function yL(t){let{params:e,selector:r}=S.parseRange(t),i=M.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?S.parseLocator(e.locator):null,path:i}}function tle({parentLocator:t,path:e,folderHash:r,protocol:i}){let n=t!==null?{locator:S.stringifyLocator(t)}:{},s=typeof r!="undefined"?{hash:r}:{};return S.makeRange({protocol:i,source:e,selector:e,params:P(P({},s),n)})}function wL(t,{parentLocator:e,path:r,folderHash:i,protocol:n}){return S.makeLocator(t,tle({parentLocator:e,path:r,folderHash:i,protocol:n}))}async function _0(t,{protocol:e,fetchOptions:r,inMemory:i=!1}){let{parentLocator:n,path:s}=S.parseFileStyleRange(t.reference,{protocol:e}),o=v.isAbsolute(s)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(n,r),a=o.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=v.join(a.prefixPath,s);return await de.releaseAfterUseAsync(async()=>await Ai.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:S.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function BL(t,{protocol:e,fetchOptions:r}){return(await _0(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var QL=class{supports(e,r){return!!e.reference.startsWith(Nr)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async fetchFromDisk(e,r){return _0(e,{protocol:Nr,fetchOptions:r})}};var k4e=2,bL=class{supportsDescriptor(e,r){return e.range.match(hf)?!0:!!e.range.startsWith(Nr)}supportsLocator(e,r){return!!e.reference.startsWith(Nr)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=yL(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await BL(S.makeLocator(e,S.makeRange({protocol:Nr,source:n,selector:n,params:{locator:S.stringifyLocator(s)}})),{protocol:Nr,fetchOptions:i.fetchOptions}),a=mn.makeHash(`${k4e}`,o).slice(0,6);return[wL(e,{parentLocator:s,path:n,folderHash:a,protocol:Nr})]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var vL=class{supports(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.join(o.prefixPath,n),c=await a.readFilePromise(l);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(c,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var SL=class{supportsDescriptor(e,r){return YC.test(e.range)?!!(e.range.startsWith(Nr)||hf.test(e.range)):!1}supportsLocator(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range;return n.startsWith(Nr)&&(n=n.slice(Nr.length)),[S.makeLocator(e,`${Nr}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var P4e={fetchers:[vL,QL],resolvers:[SL,bL]},D4e=P4e;var PL={};it(PL,{default:()=>N4e});var rle=ie(require("querystring")),ile=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function nle(t){return t?ile.some(e=>!!t.match(e)):!1}function sle(t){let e;for(let a of ile)if(e=t.match(a),e)break;if(!e)throw new Error(R4e(t));let[,r,i,n,s="master"]=e,{commit:o}=rle.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:r,username:i,reponame:n,treeish:s}}function R4e(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var kL=class{supports(e,r){return!!nle(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await T.mktempPromise(async n=>{let s=new Ft(n);await Ai.extractArchiveTo(i,s,{stripComponents:1});let o=Uc.splitRepoUrl(e.reference),a=v.join(n,"package.tgz");await Kt.prepareExternalProject(n,a,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let l=await T.readFilePromise(a);return await Ai.convertToZip(l,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:i,username:n,reponame:s,treeish:o}=sle(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var F4e={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let i=new kL;if(!i.supports(e,r))return null;try{return await i.fetch(e,r)}catch(n){return null}}}},N4e=F4e;var FL={};it(FL,{default:()=>T4e});var qC=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,JC=/^https?:/;var DL=class{supports(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(e.reference,{configuration:r.project.configuration});return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var RL=class{supportsDescriptor(e,r){return qC.test(e.range)?!!JC.test(e.range):!1}supportsLocator(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[S.convertDescriptorToLocator(e)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var L4e={fetchers:[DL],resolvers:[RL]},T4e=L4e;var ML={};it(ML,{default:()=>M5e});var Rle=ie(Dle()),TL=ie(require("util")),WC=class extends Be{constructor(){super(...arguments);this.private=Y.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=Y.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=Y.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=Y.Boolean("-2",!1,{hidden:!0});this.yes=Y.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=Y.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return r!==null?await this.executeProxy(e,r):await this.executeRegular(e)}async executeProxy(e,r){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new me("Cannot use the --install flag from within a project subdirectory");T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=v.join(this.context.cwd,e.get("lockfileFilename"));T.existsSync(i)||await T.writeFilePromise(i,"");let n=await this.cli.run(["set","version",r],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await T.mktempPromise(async o=>{let{code:a}=await hr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Kt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let r=null;try{r=(await Ke.find(e,this.context.cwd)).project}catch{r=null}T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=await Ze.tryFind(this.context.cwd)||new Ze,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:S.makeIdent(e.get("initScope"),v.basename(this.context.cwd)),i.packageManager=Zr&&de.isTaggedYarnVersion(Zr)?`yarn@${Zr}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await T.mkdirPromise(v.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),TL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,TL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} +`);let o=v.join(this.context.cwd,Ze.fileName);await T.changeFilePromise(o,`${JSON.stringify(s,null,2)} +`,{automaticNewlines:!0});let a=v.join(this.context.cwd,"README.md");if(T.existsSync(a)||await T.writeFilePromise(a,`# ${S.stringifyIdent(i.name)} +`),!r||r.cwd===this.context.cwd){let c=v.join(this.context.cwd,wt.lockfile);T.existsSync(c)||await T.writeFilePromise(c,"");let g=["/.yarn/*","!/.yarn/patches","!/.yarn/plugins","!/.yarn/releases","!/.yarn/sdks","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!/.yarn/cache","#/.pnp.*"].map(m=>`${m} +`).join(""),f=v.join(this.context.cwd,".gitignore");T.existsSync(f)||await T.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,Rle.default)(h,e.get("initEditorConfig"));let p=`root = true +`;for(let[m,E]of Object.entries(h)){p+=` +[${m}] +`;for(let[B,b]of Object.entries(E))p+=`${B.replace(/[A-Z]/g,H=>`_${H.toLowerCase()}`)} = ${b} +`}let d=v.join(this.context.cwd,".editorconfig");T.existsSync(d)||await T.writeFilePromise(d,p),T.existsSync(v.join(this.context.cwd,".git"))||await hr.execvp("git",["init"],{cwd:this.context.cwd})}}};WC.paths=[["init"]],WC.usage=ye.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var Fle=WC;var T5e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:ge.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}}},commands:[Fle]},M5e=T5e;var GL={};it(GL,{default:()=>K5e});var Ua="portal:",Ha="link:";var OL=class{supports(e,r){return!!e.reference.startsWith(Ua)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot}}};var KL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ua)}supportsLocator(e,r){return!!e.reference.startsWith(Ua)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ua.length);return[S.makeLocator(e,`${Ua}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var UL=class{supports(e,r){return!!e.reference.startsWith(Ha)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0}}};var HL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ha)}supportsLocator(e,r){return!!e.reference.startsWith(Ha)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ha.length);return[S.makeLocator(e,`${Ha}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){return _(P({},e),{version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var O5e={fetchers:[UL,OL],resolvers:[HL,KL]},K5e=O5e;var mT={};it(mT,{default:()=>Y6e});var Ga;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(Ga||(Ga={}));var jL=(t,e)=>`${t}@${e}`,Nle=(t,e)=>{let r=e.indexOf("#"),i=r>=0?e.substring(r+1):e;return jL(t,i)},qs;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(qs||(qs={}));var Tle=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||r>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:r,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=U5e(t,s),l=!1,c=0;do l=YL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=zC(a);if(YL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${u}, next tree: +${zC(a)}`);let f=Lle(a);if(f)throw new Error(`${f}, after hoisting finished: +${zC(a)}`)}return s.debugLevel>=2&&console.log(zC(a)),H5e(a)},G5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())r.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),r},j5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of t)u=g.dependencies.get(c.name),u&&r.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),r},Mle=(t,e)=>{if(e.decoupled)return e;let{name:r,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:p,hoistedTo:d}=e,m={name:r,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:new Map(p),hoistedTo:new Map(d)},E=m.dependencies.get(r);return E&&E.ident==m.ident&&m.dependencies.set(r,m),t.dependencies.set(m.name,m),m},Y5e=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let n of t.dependencies.values())t.peerNames.has(n.name)||r.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!t.peerNames.has(s)){let a=r.get(s);a||(a=[],r.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return r},qL=t=>{let e=new Set,r=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!t.peerNames.has(s)){let o=t.dependencies.get(s);o&&!e.has(o)&&r(o,n)}e.add(i)}};for(let i of t.dependencies.values())t.peerNames.has(i.name)||r(i);return e},YL=(t,e,r,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=J5e(o),l=Y5e(o,a),c=t==o?new Map:n.fastLookupPossible?G5e(e):j5e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([d,m])=>[d,m[0]])),p=new Map;do{let d=q5e(t,e,r,c,h,l,i,p,n);d.isGraphChanged&&(f=!0),d.anotherRoundNeeded&&(g=!0),u=!1;for(let[m,E]of l)E.length>1&&!o.dependencies.has(m)&&(h.delete(m),E.shift(),h.set(m,E[0]),u=!0)}while(u);for(let d of o.dependencies.values())if(!o.peerNames.has(d.name)&&!r.has(d.locator)){r.add(d.locator);let m=YL(t,[...e,d],r,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),r.delete(d.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},W5e=(t,e,r,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(m=>wi(m)).join("\u2192")}`);let h=r[r.length-1],d=!(i.ident===h.ident);if(l&&!d&&(g="- self-reference"),d&&(d=!i.isWorkspace,l&&!d&&(g="- workspace")),d&&(d=!h.isWorkspace||h.hoistedFrom.has(i.name)||e.size===1,l&&!d&&(g=h.reasons.get(i.name))),d&&(d=!t.peerNames.has(i.name),l&&!d&&(g=`- cannot shadow peer: ${wi(t.originalDependencies.get(i.name).locator)} at ${u}`)),d){let m=!1,E=n.get(i.name);if(m=!E||E.ident===i.ident,l&&!m&&(g=`- filled by: ${wi(E.locator)} at ${u}`),m)for(let B=r.length-1;B>=1;B--){let R=r[B].dependencies.get(i.name);if(R&&R.ident!==i.ident){m=!1;let H=a.get(h);H||(H=new Set,a.set(h,H)),H.add(i.name),l&&(g=`- filled by ${wi(R.locator)} at ${r.slice(0,B).map(L=>wi(L.locator)).join("\u2192")}`);break}}d=m}if(d&&(d=s.get(i.name)===i.ident,l&&!d&&(g=`- filled by: ${wi(o.get(i.name)[0])} at ${u}`)),d){let m=!0,E=new Set(i.peerNames);for(let B=r.length-1;B>=1;B--){let b=r[B];for(let R of E){if(b.peerNames.has(R)&&b.originalDependencies.has(R))continue;let H=b.dependencies.get(R);H&&t.dependencies.get(R)!==H&&(B===r.length-1?f.add(H):(f=null,m=!1,l&&(g=`- peer dependency ${wi(H.locator)} from parent ${wi(b.locator)} was not hoisted to ${u}`))),E.delete(R)}if(!m)break}d=m}if(d&&!c)for(let m of i.hoistedDependencies.values()){let E=n.get(m.name);if(!E||m.ident!==E.ident){d=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${wi(m.locator)}, available: ${wi(E==null?void 0:E.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:d?0:1,reason:g}},q5e=(t,e,r,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(m,E,B,b)=>{if(u.has(B))return;let R=[...E,B.locator],H=new Map,L=new Map;for(let q of qL(B)){let A=W5e(c,r,[c,...m,B],q,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(L.set(q,A),A.isHoistable===2)for(let V of A.dependsOn){let W=H.get(V.name)||new Set;W.add(q.name),H.set(V.name,W)}}let K=new Set,J=(q,A,V)=>{if(!K.has(q)){K.add(q),L.set(q,{isHoistable:1,reason:V});for(let W of H.get(q.name)||[])J(B.dependencies.get(W),A,l.debugLevel>=2?`- peer dependency ${wi(q.locator)} from parent ${wi(B.locator)} was not hoisted`:"")}};for(let[q,A]of L)A.isHoistable===1&&J(q,A,A.reason);for(let q of L.keys())if(!K.has(q)){f=!0;let A=o.get(B);A&&A.has(q.name)&&(g=!0),B.dependencies.delete(q.name),B.hoistedDependencies.set(q.name,q),B.reasons.delete(q.name);let V=c.dependencies.get(q.name);if(l.debugLevel>=2){let W=Array.from(E).concat([B.locator]).map(F=>wi(F)).join("\u2192"),X=c.hoistedFrom.get(q.name);X||(X=[],c.hoistedFrom.set(q.name,X)),X.push(W),B.hoistedTo.set(q.name,Array.from(e).map(F=>wi(F.locator)).join("\u2192"))}if(!V)c.ident!==q.ident&&(c.dependencies.set(q.name,q),b.add(q));else for(let W of q.references)V.references.add(W)}if(l.check){let q=Lle(t);if(q)throw new Error(`${q}, after hoisting dependencies of ${[c,...m,B].map(A=>wi(A.locator)).join("\u2192")}: +${zC(t)}`)}let ne=qL(B);for(let q of ne)if(K.has(q)){let A=L.get(q);if((n.get(q.name)===q.ident||!B.reasons.has(q.name))&&A.isHoistable!==0&&B.reasons.set(q.name,A.reason),!q.isHoistBorder&&R.indexOf(q.locator)<0){u.add(B);let W=Mle(B,q);h([...m,B],[...E,B.locator],W,d),u.delete(B)}}},p,d=new Set(qL(c));do{p=d,d=new Set;for(let m of p){if(m.locator===c.locator||m.isHoistBorder)continue;let E=Mle(c,m);h([],Array.from(r),E,d)}}while(d.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},Lle=t=>{let e=[],r=new Set,i=new Set,n=(s,o,a)=>{if(r.has(s)||(r.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>wi(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,d=`${h?` hoisted to ${h}`:""}`,m=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${m} - broken require promise for ${c.name}${d}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${m} - broken require promise: no required dependency ${c.name}${d} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(t,t.dependencies,t),e.join(` +`)},U5e=(t,e)=>{let{identName:r,name:i,reference:n,peerNames:s}=t,o={name:i,references:new Set([n]),locator:jL(r,n),ident:Nle(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,isWorkspace:!0,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[t,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:d,peerNames:m,hoistPriority:E,isWorkspace:B}=c,b=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([d]),locator:jL(p,d),ident:Nle(p,d),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(m),reasons:new Map,decoupled:!0,isHoistBorder:b?b.has(h):!1,hoistPriority:E||0,isWorkspace:B||!1,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=d=>{if(!h.has(d)){h.add(d),d.decoupled=!1;for(let m of d.dependencies.values())d.peerNames.has(m.name)||p(m)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of t.dependencies)l(c,o);return o},JL=t=>t.substring(0,t.indexOf("@",1)),H5e=t=>{let e={name:t.name,identName:JL(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),i=(n,s,o)=>{let a=r.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:JL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){r.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);r.delete(n)}};for(let n of t.dependencies.values())i(n,t,e);return e},J5e=t=>{let e=new Map,r=new Set([t]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!r.has(a);if(n(a).dependents.add(o.ident),!l){r.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||s(t,o);return e},wi=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let i=t.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(r=`v:${r}`),n.startsWith("workspace")&&(r=`w:${r}`,n=""),`${r}${n?`@${n}`:""}`}else return`${r}`},Ole=5e4,zC=t=>{let e=0,r=(n,s,o="")=>{if(e>Ole||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name.localeCompare(u.name)),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+wi(u.locator)+(g?` ${g}`:"")+(u!==n&&h.length>0?`, hoisted from: ${h.join(", ")}`:"")} +`,l+=r(u,s,`${o}${cOle?` +Tree is too large, part of the tree has been dunped +`:"")};var Js;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Js||(Js={}));var Sn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Sn||(Sn={}));var Kle="node_modules",Hc="$wsroot$";var VC=(t,e)=>{let{packageTree:r,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=z5e(t,e),o=null;if(n.length===0){let a=Tle(r,{hoistingLimits:i});o=V5e(t,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},ms=t=>`${t.name}@${t.reference}`,WL=t=>{let e=new Map;for(let[r,i]of t.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((i,n)=>{let s=i.split(v.delimiter).length,o=n.split(v.delimiter).length;return s!==o?o-s:n.localeCompare(i)});return e},Ule=(t,e)=>{let r=S.isVirtualLocator(t)?S.devirtualizeLocator(t):t,i=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e;return S.areLocatorsEqual(r,i)},zL=(t,e,r,i)=>{if(t.linkType!==Js.SOFT)return!1;let n=M.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return v.contains(i,n)===null},_5e=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=M.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=t.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=ms(f);if(l.has(p))return;l.add(p);let d=t.getPackageInformation(f);if(d){let m=h?ms(h):"";if(ms(f)!==m&&d.linkType===Js.SOFT&&!zL(d,f,t,i)){let E=Hle(d,f,t);(!a.get(E)||f.reference.startsWith("workspace:"))&&a.set(E,f)}for(let[E,B]of d.packageDependencies)B!==null&&(d.packagePeers.has(E)||c(t.getLocator(E,B),f))}};for(let f of o)c(f,null);let u=i.split(v.sep);for(let f of a.values()){let h=t.getPackageInformation(f),d=M.toPortablePath(h.packageLocation.slice(0,-1)).split(v.sep).slice(u.length),m=s;for(let E of d){let B=m.children.get(E);B||(B={children:new Map},m.children.set(E,B)),m=B}m.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=ms(h),d=n.get(p);d||(d=new Set,n.set(p,d)),d.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},z5e=(t,e)=>{let r=[],i=!1,n=new Map,s=_5e(t),o=t.getPackageInformation(t.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=t.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=M.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,isWorkspace:!0},u=new Map,g=(h,p)=>`${ms(p)}:${h}`,f=(h,p,d,m,E,B,b,R)=>{var X,F;let H=g(h,d),L=u.get(H),K=!!L;!K&&d.name===a.name&&d.reference===a.reference&&(L=c,u.set(H,c));let J=zL(p,d,t,l);if(!L){let D=p.linkType===Js.SOFT&&d.name.endsWith(Hc);L={name:h,identName:d.name,reference:d.reference,dependencies:new Set,peerNames:D?new Set:p.packagePeers,isWorkspace:D},u.set(H,L)}let ne;if(J?ne=2:E.linkType===Js.SOFT?ne=1:ne=0,L.hoistPriority=Math.max(L.hoistPriority||0,ne),R&&!J){let D=ms({name:m.identName,reference:m.reference}),he=n.get(D)||new Set;n.set(D,he),he.add(L.name)}let q=new Map(p.packageDependencies);if(e.project){let D=e.project.workspacesByCwd.get(M.toPortablePath(p.packageLocation.slice(0,-1)));if(D){let he=new Set([...Array.from(D.manifest.peerDependencies.values(),pe=>S.stringifyIdent(pe)),...Array.from(D.manifest.peerDependenciesMeta.keys())]);for(let pe of he)q.has(pe)||(q.set(pe,B.get(pe)||null),L.peerNames.add(pe))}}let A=ms({name:d.name.replace(Hc,""),reference:d.reference}),V=s.get(A);if(V)for(let D of V)q.set(`${D.name}${Hc}`,D.reference);(p!==E||p.linkType!==Js.SOFT||!e.selfReferencesByCwd||e.selfReferencesByCwd.get(b))&&m.dependencies.add(L);let W=d!==a&&p.linkType===Js.SOFT&&!d.name.endsWith(Hc)&&!J;if(!K&&!W){let D=new Map;for(let[he,pe]of q)if(pe!==null){let Ne=t.getLocator(he,pe),Pe=t.getLocator(he.replace(Hc,""),pe),qe=t.getPackageInformation(Pe);if(qe===null)throw new Error("Assertion failed: Expected the package to have been registered");let re=zL(qe,Ne,t,l);if(e.validateExternalSoftLinks&&e.project&&re){qe.packageDependencies.size>0&&(i=!0);for(let[De,$]of qe.packageDependencies)if($!==null){let G=S.parseLocator(Array.isArray($)?`${$[0]}@${$[1]}`:`${De}@${$}`);if(ms(G)!==ms(Ne)){let Ce=q.get(De);if(Ce){let ee=S.parseLocator(Array.isArray(Ce)?`${Ce[0]}@${Ce[1]}`:`${De}@${Ce}`);Ule(ee,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with parent dependency ${S.prettyLocator(e.project.configuration,ee)}`})}else{let ee=D.get(De);if(ee){let Ue=ee.target,Oe=S.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${De}@${Ue}`);Ule(Oe,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with dependency ${S.prettyLocator(e.project.configuration,Oe)} from sibling portal ${S.prettyIdent(e.project.configuration,S.parseIdent(ee.portal.name))}`})}else D.set(De,{target:G.reference,portal:Ne})}}}}let se=(X=e.hoistingLimitsByCwd)==null?void 0:X.get(b),be=re?b:v.relative(l,M.toPortablePath(qe.packageLocation))||Se.dot,ae=(F=e.hoistingLimitsByCwd)==null?void 0:F.get(be),Ae=se===Sn.DEPENDENCIES||ae===Sn.DEPENDENCIES||ae===Sn.WORKSPACES;f(ms(Ne)===ms(d)?h:he,qe,Ne,L,p,q,be,Ae)}}};return f(a.name,o,a,c,o,o.packageDependencies,Se.dot,!1),{packageTree:c,hoistingLimits:n,errors:r,preserveSymlinksRequired:i}};function Hle(t,e,r){let i=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return M.toPortablePath(i||t.packageLocation)}function X5e(t,e,r){let i=e.getLocator(t.name.replace(Hc,""),t.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return r.pnpifyFs?(o=M.toPortablePath(n.packageLocation),s=Js.SOFT):(o=Hle(n,t,e),s=n.linkType),{linkType:s,target:o}}var V5e=(t,e,r)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=X5e(u,t,r);return{locator:ms(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:kr(g),name:kr(f)}:{scope:null,name:kr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),d={name:h.identName,reference:p[0]},{name:m,scope:E}=s(h.name),B=E?[E,m]:[m],b=v.join(g,Kle),R=v.join(b,...B),H=`${f}/${d.name}`,L=n(d,f,p.slice(1)),K=!1;if(L.linkType===Js.SOFT&&r.project){let J=r.project.workspacesByCwd.get(L.target.slice(0,-1));K=!!(J&&!J.manifest.name)}if(!h.name.endsWith(Hc)&&!K){let J=i.get(R);if(J){if(J.dirList)throw new Error(`Assertion failed: ${R} cannot merge dir node with leaf node`);{let V=S.parseLocator(J.locator),W=S.parseLocator(L.locator);if(J.linkType!==L.linkType)throw new Error(`Assertion failed: ${R} cannot merge nodes with different link types ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/${S.stringifyLocator(W)}`);if(V.identHash!==W.identHash)throw new Error(`Assertion failed: ${R} cannot merge nodes with different idents ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/s${S.stringifyLocator(W)}`);L.aliases=[...L.aliases,...J.aliases,S.parseLocator(J.locator).reference]}}i.set(R,L);let ne=R.split("/"),q=ne.indexOf(Kle),A=ne.length-1;for(;q>=0&&A>q;){let V=M.toPortablePath(ne.slice(0,A).join(v.sep)),W=kr(ne[A]),X=i.get(V);if(!X)i.set(V,{dirList:new Set([W])});else if(X.dirList){if(X.dirList.has(W))break;X.dirList.add(W)}A--}}a(h,L.linkType===Js.SOFT?L.target:R,H)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var oT={};it(oT,{PnpInstaller:()=>Cf,PnpLinker:()=>jc,default:()=>m6e,getPnpPath:()=>qA,jsInstallUtils:()=>Ws,pnpUtils:()=>nT,quotePathIfNeeded:()=>uce});var lce=ie(Or()),cce=ie(require("url"));var Gle;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Gle||(Gle={}));var Ht;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(Ht||(Ht={}));var jle={[Ht.DEFAULT]:{collapsed:!1,next:{["*"]:Ht.DEFAULT}},[Ht.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:Ht.FALLBACK_EXCLUSION_LIST,packageRegistryData:Ht.PACKAGE_REGISTRY_DATA,["*"]:Ht.DEFAULT}},[Ht.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:Ht.FALLBACK_EXCLUSION_ENTRIES}},[Ht.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.FALLBACK_EXCLUSION_DATA}},[Ht.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}},[Ht.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_REGISTRY_ENTRIES}},[Ht.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_STORE_DATA}},[Ht.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_STORE_ENTRIES}},[Ht.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_INFORMATION_DATA}},[Ht.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:Ht.PACKAGE_DEPENDENCIES,["*"]:Ht.DEFAULT}},[Ht.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_DEPENDENCY}},[Ht.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}}};function Z5e(t,e,r){let i="";i+="[";for(let n=0,s=t.length;ns(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function r6e(t){let e=new Map,r=_C(t.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of r){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function i6e(t){return _C(t.fallbackPool||[],([e])=>e)}function n6e(t){let e=[];for(let[r,i]of _C(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([r,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of _C(i,([g])=>g===null?"0":`1${g}`)){let g=[];r!==null&&s!==null&&!a.has(r)&&g.push([r,s]);for(let[p,d]of _C(a.entries(),([m])=>m))g.push([p,d]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function XC(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:r6e(t),fallbackPool:i6e(t),packageRegistryData:n6e(t)}}var zle=ie(Wle());function Vle(t,e){return[t?`${t} +`:"",`/* eslint-disable */ + +`,`try { +`,` Object.freeze({}).detectStrictMode = true; +`,`} catch (error) { +`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} +`,` +`,`var __non_webpack_module__ = module; +`,` +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,e.replace(/^/gm," "),`} +`,` +`,(0,zle.default)()].join("")}function s6e(t){return JSON.stringify(t,null,2)}function o6e(t){return[`return hydrateRuntimeState(${qle(t)}, {basePath: basePath || __dirname}); +`].join("")}function a6e(t){return[`var path = require('path'); +`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(t)}); +`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); +`].join("")}function _le(t){let e=XC(t),r=o6e(e);return Vle(t.shebang,r)}function Xle(t){let e=XC(t),r=a6e(t.dataLocation),i=Vle(t.shebang,r);return{dataFile:s6e(e),loaderFile:i}}var tce=ie(require("fs")),u6e=ie(require("path")),rce=ie(require("util"));function _L(t,{basePath:e}){let r=M.toPortablePath(e),i=v.resolve(r),n=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,s=new Map,o=new Map(t.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var b;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let d=(b=p.discardFromLookup)!=null?b:!1,m={name:g,reference:h},E=s.get(p.packageLocation);E?(E.discardFromLookup=E.discardFromLookup&&d,d||(E.locator=m)):s.set(p.packageLocation,{locator:m,discardFromLookup:d});let B=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:d,get packageLocation(){return B||(B=v.join(i,p.packageLocation))}}]}))])),a=new Map(t.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(t.fallbackPool),c=t.dependencyTreeRoots,u=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var df=ie(require("module")),ece=ie($le()),ZL=ie(require("util"));var ur;(function(l){l.API_ERROR="API_ERROR",l.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",l.MISSING_DEPENDENCY="MISSING_DEPENDENCY",l.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",l.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",l.INTERNAL="INTERNAL",l.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",l.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var c6e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ui(t,e,r={}){let i=c6e.has(t)?"MODULE_NOT_FOUND":t,n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:_(P({},n),{value:i}),pnpCode:_(P({},n),{value:t}),data:_(P({},n),{value:r})})}function YA(t){return M.normalize(M.fromPortablePath(t))}function $L(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=new Set(df.Module.builtinModules||Object.keys(process.binding("natives"))),s=re=>n.has(re)||re.startsWith("node:"),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,a=/^(\/|\.{1,2}(\/|$))/,l=/\/$/,c=/^\.{0,2}\//,u={name:null,reference:null},g=[],f=new Set;if(t.enableTopLevelFallback===!0&&g.push(u),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=t.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");g.push({name:re,reference:be})}}let{ignorePattern:h,packageRegistry:p,packageLocatorsByLocations:d}=t;function m(re,se){return{fn:re,args:se,error:null,result:null}}function E(re){var De,$,G,Ce,ee,Ue;let se=(G=($=(De=process.stderr)==null?void 0:De.hasColors)==null?void 0:$.call(De))!=null?G:process.stdout.isTTY,be=(Oe,vt)=>`[${Oe}m${vt}`,ae=re.error;console.error(ae?be("31;1",`\u2716 ${(Ce=re.error)==null?void 0:Ce.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let Oe of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,ZL.inspect)(Oe,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,ZL.inspect)(re.result,{colors:se,compact:!0})}`));let Ae=(Ue=(ee=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ee.slice(2))!=null?Ue:[];if(Ae.length>0){console.error();for(let Oe of Ae)console.error(` ${be("38;5;244",Oe)}`)}console.error()}function B(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let ae=m(re,be);try{return ae.result=se(...be)}catch(Ae){throw ae.error=Ae}finally{E(ae)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(ae){let Ae=m(re,be);throw Ae.error=ae,E(Ae),ae}}}return se}function b(re){let se=W(re);if(!se)throw ui(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function R(re){if(re.name===null)return!0;for(let se of t.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let H=new Set(["default","node","require"]);function L(re,se=H){let be=D(v.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ui(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ae}=b(be),Ae=v.join(ae,wt.manifest);if(!e.fakeFs.existsSync(Ae))return null;let De=JSON.parse(e.fakeFs.readFileSync(Ae,"utf8")),$=v.contains(ae,re);if($===null)throw ui(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");c.test($)||($=`./${$}`);let G=(0,ece.resolve)(De,v.normalize($),{conditions:se,unsafe:!0});return typeof G=="string"?v.join(ae,G):null}function K(re,se,{extensions:be}){let ae;try{se.push(re),ae=e.fakeFs.statSync(re)}catch(Ae){}if(ae&&!ae.isDirectory())return e.fakeFs.realpathSync(re);if(ae&&ae.isDirectory()){let Ae;try{Ae=JSON.parse(e.fakeFs.readFileSync(v.join(re,wt.manifest),"utf8"))}catch($){}let De;if(Ae&&Ae.main&&(De=v.resolve(re,Ae.main)),De&&De!==re){let $=K(De,se,{extensions:be});if($!==null)return $}}for(let Ae=0,De=be.length;Ae{let G=JSON.stringify($.name);if(ae.has(G))return;ae.add(G);let Ce=X($);for(let ee of Ce)if(b(ee).packagePeers.has(re))Ae(ee);else{let Oe=be.get(ee.name);typeof Oe=="undefined"&&be.set(ee.name,Oe=new Set),Oe.add(ee.reference)}};Ae(se);let De=[];for(let $ of[...be.keys()].sort())for(let G of[...be.get($)].sort())De.push({name:$,reference:G});return De}function D(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(q(re)&&!se)return null;let ae=v.relative(t.basePath,re);ae.match(a)||(ae=`./${ae}`),ae.endsWith("/")||(ae=`${ae}/`);do{let Ae=d.get(ae);if(typeof Ae=="undefined"||Ae.discardFromLookup&&!be){ae=ae.substring(0,ae.lastIndexOf("/",ae.length-2)+1);continue}return Ae.locator}while(ae!=="");return null}function he(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return M.toPortablePath(e.pnpapiResolution);if(be&&s(re))return null;let ae=YA(re),Ae=se&&YA(se);if(se&&q(se)&&(!v.isAbsolute(re)||D(re)===null)){let G=ne(re,se);if(G===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${ae}" +Required by: ${Ae} +`,{request:ae,issuer:Ae});return M.toPortablePath(G)}let De,$=re.match(o);if($){if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let[,G,Ce]=$,ee=D(se);if(!ee){let yr=ne(re,se);if(yr===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${ae}" +Required by: ${Ae} +`,{request:ae,issuer:Ae});return M.toPortablePath(yr)}let Oe=b(ee).packageDependencies.get(G),vt=null;if(Oe==null&&ee.name!==null){let yr=t.fallbackExclusionList.get(ee.name);if(!yr||!yr.has(ee.reference)){for(let Qi=0,Go=g.length;QiR(Ki))?dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} +`).join("")} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr}):dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) + +${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} +`).join("")} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr})}else Oe===void 0&&(!be&&s(re)?R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${G} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${G} isn't otherwise declared in ${ee.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}):R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}));if(Oe==null){if(vt===null||dt===null)throw dt||new Error("Assertion failed: Expected an error to have been set");Oe=vt;let yr=dt.message.replace(/\n.*/g,"");dt.message=yr,!f.has(yr)&&i!==0&&(f.add(yr),process.emitWarning(dt))}let ri=Array.isArray(Oe)?{name:Oe[0],reference:Oe[1]}:{name:G,reference:Oe},ii=b(ri);if(!ii.packageLocation)throw ui(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${ri.name}@${ri.reference}${ri.name!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +`,{request:ae,issuer:Ae,dependencyLocator:Object.assign({},ri)});let an=ii.packageLocation;Ce?De=v.join(an,Ce):De=an}else if(v.isAbsolute(re))De=v.normalize(re);else{if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let G=v.resolve(se);se.match(l)?De=v.normalize(v.join(G,re)):De=v.normalize(v.join(v.dirname(G),re))}return v.normalize(De)}function pe(re,se,be=H){if(a.test(re))return se;let ae=L(se,be);return ae?v.normalize(ae):se}function Ne(re,{extensions:se=Object.keys(df.Module._extensions)}={}){let be=[],ae=K(re,be,{extensions:se});if(ae)return v.normalize(ae);{let Ae=YA(re),De=D(re);if(De){let{packageLocation:$}=b(De);if(!e.fakeFs.existsSync($)){let G=$.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${G} + +Missing package: ${De.name}@${De.reference} +Expected package location: ${YA($)} +`,{unqualifiedPath:Ae})}}throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed - none of those files can be found on the disk. + +Source path: ${Ae} +${be.map($=>`Not found: ${YA($)} +`).join("")}`,{unqualifiedPath:Ae})}}function Pe(re,se,{considerBuiltins:be,extensions:ae,conditions:Ae}={}){let De=he(re,se,{considerBuiltins:be});if(re==="pnpapi")return De;if(De===null)return null;let $=()=>se!==null?q(se):!1,G=(!be||!s(re))&&!$()?pe(re,De,Ae):De;try{return Ne(G,{extensions:ae})}catch(Ce){throw Ce.pnpCode==="QUALIFIED_PATH_RESOLUTION_FAILED"&&Object.assign(Ce.data,{request:YA(re),issuer:se&&YA(se)}),Ce}}function qe(re){let se=v.normalize(re),be=Pr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:A,topLevel:V,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of p)for(let ae of be.keys())se!==null&&ae!==null&&re.push({name:se,reference:ae});return re},getPackageInformation:re=>{let se=W(re);if(se===null)return null;let be=M.fromPortablePath(se.packageLocation);return _(P({},se),{packageLocation:be})},findPackageLocator:re=>D(M.toPortablePath(re)),resolveToUnqualified:B("resolveToUnqualified",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=he(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveUnqualified:B("resolveUnqualified",(re,se)=>M.fromPortablePath(Ne(M.toPortablePath(re),se))),resolveRequest:B("resolveRequest",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=Pe(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveVirtual:B("resolveVirtual",re=>{let se=qe(M.toPortablePath(re));return se!==null?M.fromPortablePath(se):null})}}var ESt=(0,rce.promisify)(tce.readFile);var ice=(t,e,r)=>{let i=XC(t),n=_L(i,{basePath:e}),s=M.join(e,wt.pnpCjs);return $L(n,{fakeFs:r,pnpapiResolution:s})};var tT=ie(sce());var Ws={};it(Ws,{checkAndReportManifestCompatibility:()=>oce,extractBuildScripts:()=>Z0,getExtractHint:()=>rT,hasBindingGyp:()=>iT});function oce(t,e,{configuration:r,report:i}){return S.isPackageCompatible(t,{os:[process.platform],cpu:[process.arch]})?!0:(i==null||i.reportWarningOnce(z.INCOMPATIBLE_ARCHITECTURE,`${S.prettyLocator(r,t)} The ${process.platform}-${process.arch} architecture is incompatible with this module, ${e} skipped.`),!1)}function Z0(t,e,r,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([Gn.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([Gn.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:t.linkType!==gt.HARD?(n==null||n.reportWarningOnce(z.SOFT_LINK_BUILD,`${S.prettyLocator(i,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(n==null||n.reportInfoOnce(z.BUILD_DISABLED,`${S.prettyLocator(i,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!r.built?(n==null||n.reportWarningOnce(z.DISABLED_BUILD_SCRIPTS,`${S.prettyLocator(i,t)} lists build scripts, but all build scripts have been disabled.`),[]):oce(t,"build",{configuration:i,report:n})?s:[]}var g6e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function rT(t){return t.packageFs.getExtractHint({relevantExtensions:g6e})}function iT(t){let e=v.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var nT={};it(nT,{getUnpluggedPath:()=>ZC});function ZC(t,{configuration:e}){return v.resolve(e.get("pnpUnpluggedFolder"),S.slugifyLocator(t))}var f6e=new Set([S.makeIdent(null,"nan").identHash,S.makeIdent(null,"node-gyp").identHash,S.makeIdent(null,"node-pre-gyp").identHash,S.makeIdent(null,"node-addon-api").identHash,S.makeIdent(null,"fsevents").identHash]),jc=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,r){return!(r.project.configuration.get("nodeLinker")!=="pnp"||r.project.configuration.get("pnpMode")!==this.mode)}async findPackageLocation(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})),s={name:S.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return M.toPortablePath(o.packageLocation)}async findPackageLocator(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))return null;let s=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})).findPackageLocator(M.fromPortablePath(e));return s?S.makeLocator(S.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Cf(e)}},Cf=class{constructor(e){this.opts=e;this.mode="strict";this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,r){let i=S.stringifyIdent(e),n=e.reference,s=!!this.opts.project.tryWorkspaceByLocator(e),o=S.isVirtualLocator(e),a=e.peerDependencies.size>0&&!o,l=!a&&!s,c=!a&&e.linkType!==gt.SOFT,u,g;if(l||c){let B=o?S.devirtualizeLocator(e):e;u=this.customData.store.get(B.locatorHash),typeof u=="undefined"&&(u=await h6e(r),e.linkType===gt.HARD&&this.customData.store.set(B.locatorHash,u)),u.manifest.type==="module"&&(this.isESMLoaderRequired=!0),g=this.opts.project.getDependencyMeta(B,e.version)}let f=l?Z0(e,u,g,{configuration:this.opts.project.configuration,report:this.opts.report}):[],h=c?await this.unplugPackageIfNeeded(e,u,r,g):r.packageFs;if(v.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let p=v.resolve(h.getRealPath(),r.prefixPath),d=sT(this.opts.project.cwd,p),m=new Map,E=new Set;if(o){for(let B of e.peerDependencies.values())m.set(S.stringifyIdent(B),null),E.add(S.stringifyIdent(B));if(!s){let B=S.devirtualizeLocator(e);this.virtualTemplates.set(B.locatorHash,{location:sT(this.opts.project.cwd,Pr.resolveVirtual(p)),locator:B})}}return de.getMapWithDefault(this.packageRegistry,i).set(n,{packageLocation:d,packageDependencies:m,packagePeers:E,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:p,buildDirective:f.length>0?f:null}}async attachInternalDependencies(e,r){let i=this.getPackageInformation(e);for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){for(let i of r)this.getDiskInformation(i).packageDependencies.set(S.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=qA(this.opts.project);if(T.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(z.UNNAMED,`Removing the old ${ue.pretty(this.opts.project.configuration,wt.pnpJs,ue.Type.PATH)} file. You might need to manually update existing references to reference the new ${ue.pretty(this.opts.project.configuration,wt.pnpCjs,ue.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ue.pretty(this.opts.project.configuration,"yarn sdks",ue.Type.CODE)}.`),await T.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await T.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await T.removePromise(e.cjs),await T.removePromise(this.opts.project.configuration.get("pnpDataPath")),await T.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())de.getMapWithDefault(this.packageRegistry,S.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:S.stringifyIdent(u),reference:u.reference})),n=r!=="none",s=[],o=new Map,a=de.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:S.stringifyIdent(u),reference:u.reference});return await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=qA(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(z.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await T.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=_le(e);await T.changeFilePromise(r.cjs,o,{automaticNewlines:!0,mode:493}),await T.removePromise(i)}else{let o=v.relative(v.dirname(r.cjs),i),{dataFile:a,loaderFile:l}=Xle(_(P({},e),{dataLocation:o}));await T.changeFilePromise(r.cjs,l,{automaticNewlines:!0,mode:493}),await T.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(z.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await T.changeFilePromise(r.esmLoader,(0,tT.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await T.removePromise(s);else for(let o of await T.readdirPromise(s)){let a=v.resolve(s,o);this.unpluggedPaths.has(a)||await T.removePromise(a)}}async locateNodeModules(e){let r=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=v.join(n.cwd,"node_modules");if(i&&i.test(v.relative(this.opts.project.cwd,n.cwd))||!T.existsSync(s))continue;let o=await T.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)r.push(s);else for(let l of a)r.push(v.join(s,l.name))}return r}async unplugPackageIfNeeded(e,r,i,n){return this.shouldBeUnplugged(e,r,n)?this.unplugPackage(e,i):i.packageFs}shouldBeUnplugged(e,r,i){return typeof i.unplugged!="undefined"?i.unplugged:f6e.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(Z0(e,r,i,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r){let i=ZC(e,{configuration:this.opts.project.configuration});if(this.opts.project.disabledLocators.has(e.locatorHash))return new Xo(i,{baseFs:r.packageFs,pathUtils:v});this.unpluggedPaths.add(i);let n=v.join(i,r.prefixPath,".ready");return await T.existsPromise(n)?new Ft(i):(this.opts.project.storedBuildState.delete(e.locatorHash),await T.mkdirPromise(i,{recursive:!0}),await T.copyPromise(i,Se.dot,{baseFs:r.packageFs,overwrite:!1}),await T.writeFilePromise(n,""),new Ft(i))}getPackageInformation(e){let r=S.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(r);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${S.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${S.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let r=de.getMapWithDefault(this.packageRegistry,"@@disk"),i=sT(this.opts.project.cwd,e);return de.getFactoryWithDefault(r,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1}))}};function sT(t,e){let r=v.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function h6e(t){var i;let e=(i=await Ze.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?i:new Ze,r=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())r.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:rT(t),hasBindingGyp:iT(t)}}}var ace=ie(Nn());var $C=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new me("This command can only be used if the `nodeLinker` option is set to `pnp`");await r.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=S.parseDescriptor(f),p=h.range!=="unknown"?h:S.makeDescriptor(h,"*");if(!qt.validRange(p.range))throw new me(`The range of the descriptor patterns must be a valid semver range (${S.prettyDescriptor(e,p)})`);return d=>{let m=S.stringifyIdent(d);return!ace.default.isMatch(m,S.stringifyIdent(p))||d.version&&!qt.satisfiesWithPrereleases(d.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of r.storedPackages.values())!r.tryWorkspaceByLocator(h)&&!S.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],d=(m,E)=>{if(!h.has(m.locatorHash)&&(h.add(m.locatorHash),!r.tryWorkspaceByLocator(m)&&o.some(B=>B(m))&&p.push(m),!(E>0&&!this.recursive)))for(let B of m.dependencies.values()){let b=r.storedResolutions.get(B.descriptorHash);if(!b)throw new Error("Assertion failed: The resolution should have been registered");let R=r.storedPackages.get(b);if(!R)throw new Error("Assertion failed: The package should have been registered");d(R,E+1)}};for(let m of f){let E=r.storedPackages.get(m.anchoredLocator.locatorHash);if(!E)throw new Error("Assertion failed: The package should have been registered");d(E,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(r.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new me(`Patterns ${ue.prettyList(e,s,ue.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new me(`Pattern ${ue.prettyList(e,s,ue.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=de.sortMap(c,f=>S.stringifyLocator(f)),(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let d=(h=p.version)!=null?h:"unknown",m=r.topLevelWorkspace.manifest.ensureDependencyMeta(S.makeDescriptor(p,d));m.unplugged=!0,f.reportInfo(z.UNNAMED,`Will unpack ${S.prettyLocator(e,p)} to ${ue.pretty(e,ZC(p,{configuration:e}),ue.Type.PATH)}`),f.reportJson({locator:S.stringifyLocator(p),version:d})}await r.topLevelWorkspace.persistManifest(),f.reportSeparator(),await r.install({cache:n,report:f})})).exitCode()}};$C.paths=[["unplug"]],$C.usage=ye.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var Ace=$C;var qA=t=>({cjs:v.join(t.cwd,wt.pnpCjs),cjsLegacy:v.join(t.cwd,wt.pnpJs),esmLoader:v.join(t.cwd,".pnp.loader.mjs")}),uce=t=>/\s/.test(t)?JSON.stringify(t):t;async function p6e(t,e,r){let i=qA(t),n=`--require ${uce(M.fromPortablePath(i.cjs))}`;if(T.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,cce.pathToFileURL)(M.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&lce.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(T.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function d6e(t,e){let r=qA(t);e(r.cjs),e(r.esmLoader),e(t.configuration.get("pnpDataPath")),e(t.configuration.get("pnpUnpluggedFolder"))}var C6e={hooks:{populateYarnPaths:d6e,setupScriptEnvironment:p6e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:ge.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:ge.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:ge.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:ge.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:ge.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:ge.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:ge.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:ge.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:ge.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[jc],commands:[Ace]},m6e=C6e;var Cce=ie(dce());var uT=ie(require("crypto")),mce=ie(require("fs")),Ice=1,gi="node_modules",gT=".bin",Ece=".yarn-state.yml",Bi;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Bi||(Bi={}));var fT=class{constructor(){this.installStateCache=new Map}supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="node-modules"}async findPackageLocation(e,r){let i=r.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(n===null)throw new me("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(S.stringifyLocator(e));if(!s){let a=new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=r.project.configuration.startingCwd;return s.locations.find(a=>v.contains(o,a))||s.locations[0]}async findPackageLocator(e,r){let i=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=$0(v.resolve(e),{skipPrefix:r.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return S.parseLocator(a)}makeInstaller(e){return new yce(e)}},yce=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,r){var u;let i=v.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await L6e(e,r),e.linkType===gt.HARD&&this.customData.store.set(e.locatorHash,n)),!Ws.checkAndReportManifestCompatibility(e,"link",{configuration:this.opts.project.configuration,report:this.opts.report}))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(S.stringifyIdent(e))||s.set(S.stringifyIdent(e),e.reference);let a=e;if(S.isVirtualLocator(e)){a=S.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(S.stringifyIdent(g),null),o.add(S.stringifyIdent(g))}let l={packageLocation:`${M.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=r.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,r){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),r=await hT(this.opts.project),i=this.opts.project.configuration.get("nmMode");(r===null||i!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i});let n=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=de.validateEnum(Sn,(d=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?d:h)}catch(m){let E=S.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(z.INVALID_MANIFEST,`${E}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Sn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(d=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?d:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:S.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:S.makeLocator(S.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(M.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:S.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>M.fromPortablePath(Pr.resolveVirtual(M.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=VC(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=WL(a);await T6e(r,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=S.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(wce(f))continue;let p=S.parseLocator(f),d=this.localStore.get(p.locatorHash);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(d.pkg))continue;let m=Ws.extractBuildScripts(d.pkg,d.customPackageData,d.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});m.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:m})}return c&&this.opts.report.reportWarning(z.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ue.pretty(this.opts.project.configuration,"--preserve-symlinks",ue.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function L6e(t,e){var n;let r=(n=await Ze.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new Ze,i=new Set(["preinstall","install","postinstall"]);for(let s of r.scripts.keys())i.has(s)||r.scripts.delete(s);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{extractHint:Ws.getExtractHint(e),hasBindingGyp:Ws.hasBindingGyp(e)}}}async function M6e(t,e,r,i){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,n+=`# cause your node_modules installation to become invalidated. +`,n+=` +`,n+=`__metadata: +`,n+=` version: ${Ice} +`,n+=` nmMode: ${i.value} +`;let s=Array.from(e.keys()).sort(),o=S.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let c of s){let u=e.get(c);n+=` +`,n+=`${JSON.stringify(c)}: +`,n+=` locations: +`;for(let g of u.locations){let f=v.contains(t.cwd,g);if(f===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` - ${JSON.stringify(f)} +`}if(u.aliases.length>0){n+=` aliases: +`;for(let g of u.aliases)n+=` - ${JSON.stringify(g)} +`}if(c===o&&r.size>0){n+=` bin: +`;for(let[g,f]of r){let h=v.contains(t.cwd,g);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` ${JSON.stringify(h)}: +`;for(let[p,d]of f){let m=v.relative(v.join(g,gi),d);n+=` ${JSON.stringify(p)}: ${JSON.stringify(m)} +`}}}}let a=t.cwd,l=v.join(a,gi,Ece);await T.changeFilePromise(l,n,{automaticNewlines:!0})}async function hT(t,{unrollAliases:e=!1}={}){let r=t.cwd,i=v.join(r,gi,Ece);if(!T.existsSync(i))return null;let n=Ei(await T.readFilePromise(i,"utf8"));if(n.__metadata.version>Ice)return null;let s=n.__metadata.nmMode||Bi.CLASSIC,o=new Map,a=new Map;delete n.__metadata;for(let[l,c]of Object.entries(n)){let u=c.locations.map(f=>v.join(r,f)),g=c.bin;if(g)for(let[f,h]of Object.entries(g)){let p=v.join(r,M.toPortablePath(f)),d=de.getMapWithDefault(a,p);for(let[m,E]of Object.entries(h))d.set(kr(m),M.toPortablePath([p,gi,E].join(v.delimiter)))}if(o.set(l,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:c.aliases||[]}),e&&c.aliases)for(let f of c.aliases){let{scope:h,name:p}=S.parseLocator(l),d=S.makeLocator(S.makeIdent(h,p),f),m=S.stringifyLocator(d);o.set(m,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:[]})}}return{locatorMap:o,binSymlinks:a,locationTree:Bce(o,{skipPrefix:t.cwd}),nmMode:s}}var If=async(t,e)=>{if(t.split(v.sep).indexOf(gi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop&&(await T.lstatPromise(t)).isSymbolicLink()){await T.unlinkPromise(t);return}let r=await T.readdirPromise(t,{withFileTypes:!0});for(let i of r){let n=v.join(t,kr(i.name));i.isDirectory()?(i.name!==gi||e&&e.innerLoop)&&await If(n,{innerLoop:!0,contentsOnly:!1}):await T.unlinkPromise(n)}e.contentsOnly||await T.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},Qce=4,$0=(t,{skipPrefix:e})=>{let r=v.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let i=r.split(v.sep).filter(l=>l!==""),n=i.indexOf(gi),s=i.slice(0,n).join(v.sep),o=v.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},Bce=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let i=()=>({children:new Map,linkType:gt.HARD});for(let[n,s]of t.entries()){if(s.linkType===gt.SOFT&&v.contains(e,s.target)!==null){let a=de.getFactoryWithDefault(r,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=$0(o,{skipPrefix:e}),c=de.getFactoryWithDefault(r,a,i);for(let u=0;u{let r;try{process.platform==="win32"&&(r=await T.lstatPromise(t))}catch(i){}process.platform=="win32"&&(!r||r.isDirectory())?await T.symlinkPromise(t,e,"junction"):await T.symlinkPromise(v.relative(v.dirname(e),t),e)};async function bce(t,e,r){let i=v.join(t,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));try{await T.writeFilePromise(i,r);try{await T.linkPromise(i,e)}catch(n){}}finally{await T.unlinkPromise(i)}}async function O6e({srcPath:t,dstPath:e,srcMode:r,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Bi.HARDLINKS_GLOBAL&&i&&o){let l=v.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await mn.checksumFile(l,{baseFs:T,algorithm:"sha1"})!==o){let g=v.join(i,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));await T.renamePromise(l,g);let f=await n.readFilePromise(t);await T.writeFilePromise(g,f);try{await T.linkPromise(g,l),await T.unlinkPromise(g)}catch(h){}}await T.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(t);await bce(i,l,u);try{await T.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Bi.HARDLINKS_LOCAL,await n.copyFilePromise(t,e))}}}else await n.copyFilePromise(t,e);let a=r&511;a!==420&&await T.chmodPromise(e,a)}var JA;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(JA||(JA={}));var K6e=async(t,e,{baseFs:r,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await T.mkdirPromise(t,{recursive:!0});let o=async(l=Se.dot)=>{let c=v.join(e,l),u=await r.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=v.join(l,f.name),p,d=v.join(c,f.name);if(f.isFile()){if(p={kind:JA.FILE,mode:(await r.lstatPromise(d)).mode},n.value===Bi.HARDLINKS_GLOBAL){let m=await mn.checksumFile(d,{baseFs:r,algorithm:"sha1"});p.digest=m}}else if(f.isDirectory())p={kind:JA.DIRECTORY};else if(f.isSymbolicLink())p={kind:JA.SYMLINK,symlinkTo:await r.readlinkPromise(d)};else throw new Error(`Unsupported file type (file: ${d}, mode: 0o${await r.statSync(d).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==gi){let m=await o(h);for(let[E,B]of m)g.set(E,B)}}return g},a;if(n.value===Bi.HARDLINKS_GLOBAL&&i&&s){let l=v.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await T.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await bce(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=v.join(e,l),g=v.join(t,l);c.kind===JA.DIRECTORY?await T.mkdirPromise(g,{recursive:!0}):c.kind===JA.FILE?await O6e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:r,globalHardlinksStore:i}):c.kind===JA.SYMLINK&&await pT(v.resolve(v.dirname(g),c.symlinkTo),g)}};function U6e(t,e){let r=new Map([...t]),i=new Map([...e]);for(let[n,s]of t){let o=v.join(n,gi);if(!T.existsSync(o)){s.children.delete(gi);for(let a of i.keys())v.contains(o,a)!==null&&i.delete(a)}}return{locationTree:r,binSymlinks:i}}function wce(t){let e=S.parseDescriptor(t);return S.isVirtualDescriptor(e)&&(e=S.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function H6e(t,e,r,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of t){let c=wce(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=v.join(l[0],f);f!==""&&T.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=v.contains(r,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let d=v.join(a,M.toPortablePath(p));u.set(kr(h),d)}for(let[h,p]of c.children){let d=v.join(a,h),m=o(d,d,p);m.size>0&&s.set(a,new Map([...s.get(a)||new Map,...m]))}}else for(let[f,h]of c.children){let p=o(v.join(a,f),l,h);for(let[d,m]of p)u.set(d,m)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var vce=(t,e)=>{if(!t||!e)return t===e;let r=S.parseLocator(t);S.isVirtualLocator(r)&&(r=S.devirtualizeLocator(r));let i=S.parseLocator(e);return S.isVirtualLocator(i)&&(i=S.devirtualizeLocator(i)),S.areLocatorsEqual(r,i)};function dT(t){return v.join(t.get("globalFolder"),"store")}async function T6e(t,e,{baseFs:r,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=v.join(i.cwd,gi),{locationTree:l,binSymlinks:c}=U6e(t.locationTree,t.binSymlinks),u=Bce(e,{skipPrefix:i.cwd}),g=[],f=async({srcDir:L,dstDir:K,linkType:J,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})=>{let V=(async()=>{try{J===gt.SOFT?(await T.mkdirPromise(v.dirname(K),{recursive:!0}),await pT(v.resolve(L),K)):await K6e(K,L,{baseFs:r,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})}catch(W){throw W.message=`While persisting ${L} -> ${K} ${W.message}`,W}finally{B.tick()}})().then(()=>g.splice(g.indexOf(V),1));g.push(V),g.length>Qce&&await Promise.race(g)},h=async(L,K,J)=>{let ne=(async()=>{let q=async(A,V,W)=>{try{W.innerLoop||await T.mkdirPromise(V,{recursive:!0});let X=await T.readdirPromise(A,{withFileTypes:!0});for(let F of X){if(!W.innerLoop&&F.name===gT)continue;let D=v.join(A,F.name),he=v.join(V,F.name);F.isDirectory()?(F.name!==gi||W&&W.innerLoop)&&(await T.mkdirPromise(he,{recursive:!0}),await q(D,he,_(P({},W),{innerLoop:!0}))):H.value===Bi.HARDLINKS_LOCAL||H.value===Bi.HARDLINKS_GLOBAL?await T.linkPromise(D,he):await T.copyFilePromise(D,he,mce.default.constants.COPYFILE_FICLONE)}}catch(X){throw W.innerLoop||(X.message=`While cloning ${A} -> ${V} ${X.message}`),X}finally{W.innerLoop||B.tick()}};await q(L,K,J)})().then(()=>g.splice(g.indexOf(ne),1));g.push(ne),g.length>Qce&&await Promise.race(g)},p=async(L,K,J)=>{if(!J)K.children.has(gi)&&await If(v.join(L,gi),{contentsOnly:!1}),await If(L,{contentsOnly:L===a});else for(let[ne,q]of K.children){let A=J.children.get(ne);await p(v.join(L,ne),q,A)}};for(let[L,K]of l){let J=u.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await p(v.join(L,ne),q,A)}}let d=async(L,K,J)=>{if(!J)K.children.has(gi)&&await If(v.join(L,gi),{contentsOnly:!0}),await If(L,{contentsOnly:K.linkType===gt.HARD});else{vce(K.locator,J.locator)||await If(L,{contentsOnly:K.linkType===gt.HARD});for(let[ne,q]of K.children){let A=J.children.get(ne);await d(v.join(L,ne),q,A)}}};for(let[L,K]of u){let J=l.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await d(v.join(L,ne),q,A)}}let m=new Map,E=[];for(let[L,{locations:K}]of t.locatorMap.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=u.get(ne),V=ne;if(A){for(let W of q)if(V=v.join(V,W),A=A.children.get(W),!A)break;if(A){let W=vce(A.locator,L),X=e.get(A.locator),F=X.target,D=V,he=X.linkType;if(W)m.has(F)||m.set(F,D);else if(F!==D){let pe=S.parseLocator(A.locator);S.isVirtualLocator(pe)&&(pe=S.devirtualizeLocator(pe)),E.push({srcDir:F,dstDir:D,linkType:he,realLocatorHash:pe.locatorHash})}}}}for(let[L,{locations:K}]of e.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=l.get(ne),V=u.get(ne),W=ne,X=e.get(L),F=S.parseLocator(L);S.isVirtualLocator(F)&&(F=S.devirtualizeLocator(F));let D=F.locatorHash,he=X.target,pe=J;if(he===pe)continue;let Ne=X.linkType;for(let Pe of q)V=V.children.get(Pe);if(!A)E.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});else for(let Pe of q)if(W=v.join(W,Pe),A=A.children.get(Pe),!A){E.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});break}}let B=Xi.progressViaCounter(E.length),b=n.reportProgress(B),R=i.configuration.get("nmMode"),H={value:R};try{let L=H.value===Bi.HARDLINKS_GLOBAL?`${dT(i.configuration)}/v1`:null;if(L&&!await T.existsPromise(L)){await T.mkdirpPromise(L);for(let J=0;J<256;J++)await T.mkdirPromise(v.join(L,J.toString(16).padStart(2,"0")))}for(let J of E)(J.linkType===gt.SOFT||!m.has(J.srcDir))&&(m.set(J.srcDir,J.dstDir),await f(_(P({},J),{globalHardlinksStore:L,nmMode:H,packageChecksum:o.get(J.realLocatorHash)||null})));await Promise.all(g),g.length=0;for(let J of E){let ne=m.get(J.srcDir);J.linkType!==gt.SOFT&&J.dstDir!==ne&&await h(ne,J.dstDir,{nmMode:H})}await Promise.all(g),await T.mkdirPromise(a,{recursive:!0});let K=await H6e(e,u,i.cwd,{loadManifest:s});await G6e(c,K,i.cwd),await M6e(i,e,K,H),R==Bi.HARDLINKS_GLOBAL&&H.value==Bi.HARDLINKS_LOCAL&&n.reportWarningOnce(z.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{b.stop()}}async function G6e(t,e,r){for(let i of t.keys()){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=v.join(i,gi,gT);await T.removePromise(n)}}for(let[i,n]of e){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=v.join(i,gi,gT),o=t.get(i)||new Map;await T.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await T.removePromise(v.join(s,a)),process.platform==="win32"&&await T.removePromise(v.join(s,kr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=v.join(s,a);c!==l&&(process.platform==="win32"?await(0,Cce.default)(M.fromPortablePath(l),M.fromPortablePath(u),{createPwshFile:!1}):(await T.removePromise(u),await pT(l,u),v.contains(r,await T.realpathPromise(l))!==null&&await T.chmodPromise(l,493)))}}}var CT=class extends jc{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new Sce(e)}},Sce=class extends Cf{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let r=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),i=ice(e,this.opts.project.cwd,r),{tree:n,errors:s}=VC(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=S.parseLocator(g.locator),h=S.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=v.join(this.opts.project.cwd,wt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=v.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=v.join(g,h),d=n.get(p);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in d)a(`${u}/${h}`,d);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var j6e={hooks:{cleanGlobalArtifacts:async t=>{let e=dT(t);await T.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:ge.STRING,values:[Sn.WORKSPACES,Sn.DEPENDENCIES,Sn.NONE],default:Sn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:ge.STRING,values:[Bi.CLASSIC,Bi.HARDLINKS_LOCAL,Bi.HARDLINKS_GLOBAL],default:Bi.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:ge.BOOLEAN,default:!0}},linkers:[fT,CT]},Y6e=j6e;var yM={};it(yM,{default:()=>ZVe,npmConfigUtils:()=>gr,npmHttpUtils:()=>Lt,npmPublishUtils:()=>Rf});var Rce=ie(Or());var ir="npm:";var Lt={};it(Lt,{AuthType:()=>jn,customPackageError:()=>W6e,del:()=>_6e,get:()=>zs,getIdentUrl:()=>zA,handleInvalidAuthenticationError:()=>WA,post:()=>z6e,put:()=>V6e});var Pce=ie(aC()),Dce=ie(require("url"));var gr={};it(gr,{RegistryType:()=>ja,getAuditRegistry:()=>q6e,getAuthConfiguration:()=>ET,getDefaultRegistry:()=>eQ,getPublishRegistry:()=>xce,getRegistryConfiguration:()=>kce,getScopeConfiguration:()=>IT,getScopeRegistry:()=>Ya,normalizeRegistry:()=>To});var ja;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(ja||(ja={}));function To(t){return t.replace(/\/$/,"")}function q6e(t,{configuration:e}){let r=e.get(ja.AUDIT_REGISTRY);return r!==null?To(r):xce(t,{configuration:e})}function xce(t,{configuration:e}){var r;return((r=t.publishConfig)==null?void 0:r.registry)?To(t.publishConfig.registry):t.name?Ya(t.name.scope,{configuration:e,type:ja.PUBLISH_REGISTRY}):eQ({configuration:e,type:ja.PUBLISH_REGISTRY})}function Ya(t,{configuration:e,type:r=ja.FETCH_REGISTRY}){let i=IT(t,{configuration:e});if(i===null)return eQ({configuration:e,type:r});let n=i.get(r);return n===null?eQ({configuration:e,type:r}):To(n)}function eQ({configuration:t,type:e=ja.FETCH_REGISTRY}){let r=t.get(e);return To(r!==null?r:t.get(ja.FETCH_REGISTRY))}function kce(t,{configuration:e}){let r=e.get("npmRegistries"),i=To(t),n=r.get(i);if(typeof n!="undefined")return n;let s=r.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function IT(t,{configuration:e}){if(t===null)return null;let i=e.get("npmScopes").get(t);return i||null}function ET(t,{configuration:e,ident:r}){let i=r&&IT(r.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:kce(t,{configuration:e})||e}var jn;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(jn||(jn={}));async function WA(t,{attemptedAs:e,registry:r,headers:i,configuration:n}){var s,o;if(((s=t.originalError)==null?void 0:s.name)==="HTTPError"&&((o=t.originalError)==null?void 0:o.response.statusCode)===401)throw new nt(z.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await J6e(r,i,{configuration:n})}`:`attempted as ${e}`})`)}function W6e(t){var e;return((e=t.response)==null?void 0:e.statusCode)===404?"Package not found":null}function zA(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function zs(t,a){var l=a,{configuration:e,headers:r,ident:i,authType:n,registry:s}=l,o=qr(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=Ya(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await tQ(s,{authType:n,configuration:e,ident:i});c&&(r=_(P({},r),{authorization:c}));try{return await Zt.get(t.charAt(0)==="/"?`${s}${t}`:t,P({configuration:e,headers:r},o))}catch(u){throw await WA(u,{registry:s,configuration:e,headers:r}),u}}async function z6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.post(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.post(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function V6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.put(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.put(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function _6e(t,l){var c=l,{attemptedAs:e,configuration:r,headers:i,ident:n,authType:s=3,registry:o}=c,a=qr(c,["attemptedAs","configuration","headers","ident","authType","registry"]);if(n&&typeof o=="undefined"&&(o=Ya(n.scope,{configuration:r})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let u=await tQ(o,{authType:s,configuration:r,ident:n});u&&(i=_(P({},i),{authorization:u}));try{return await Zt.del(o+t,P({configuration:r,headers:i},a))}catch(g){if(!wT(g))throw await WA(g,{attemptedAs:e,registry:o,configuration:r,headers:i}),g;let f=await yT(),h=P(P({},i),BT(f));try{return await Zt.del(`${o}${t}`,P({configuration:r,headers:h},a))}catch(p){throw await WA(p,{attemptedAs:e,registry:o,configuration:r,headers:i}),p}}}async function tQ(t,{authType:e=2,configuration:r,ident:i}){let n=ET(t,{configuration:r,ident:i}),s=X6e(n,e);if(!s)return null;let o=await r.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new nt(z.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function X6e(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function J6e(t,e,{configuration:r}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await Zt.get(new Dce.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function yT(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:t}=await(0,Pce.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return t}function wT(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function BT(t){return{["npm-otp"]:t}}var QT=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i,params:n}=S.parseRange(e.reference);return!(!Rce.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let{params:i}=S.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await zs(i.__archiveUrl,{configuration:r.project.configuration,ident:e});return await Ai.convertToZip(n,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var bT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!S.tryParseDescriptor(e.range.slice(ir.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){let i=S.parseDescriptor(e.range.slice(ir.length),!0);return r.resolver.getResolutionDependencies(i,r)}async getCandidates(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return await i.resolver.getCandidates(n,r,i)}async getSatisfying(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return i.resolver.getSatisfying(n,r,i)}resolve(e,r){throw new Error("Unreachable")}};var vT=ie(Or()),Fce=ie(require("url"));var Vs=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let i=new Fce.URL(e.reference);return!(!vT.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i;try{i=await zs(Vs.getLocatorUrl(e),{configuration:r.project.configuration,ident:e})}catch(n){i=await zs(Vs.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:r.project.configuration,ident:e})}return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:i}){let n=Ya(e.scope,{configuration:i}),s=Vs.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===n+s||r===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=vT.default.clean(e.reference.slice(ir.length));if(r===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${zA(e)}/-/${e.name}-${r}.tgz`}};var ST=ie(Or());var rQ=S.makeIdent(null,"node-gyp"),Z6e=/\b(node-gyp|prebuild-install)\b/,xT=class{supportsDescriptor(e,r){return e.range.startsWith(ir)?!!qt.validRange(e.range.slice(ir.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i}=S.parseRange(e.reference);return!!ST.default.valid(i)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);let s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=de.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new qt.SemVer(c);if(n.test(u))return u}catch{}return de.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=S.makeLocator(e,`${ir}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Vs.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:S.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);return de.mapAndFilter(r,s=>{try{let{selector:o}=S.parseRange(s,{requireProtocol:ir}),a=new qt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return de.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>S.makeLocator(e,s))}async resolve(e,r){let{selector:i}=S.parseRange(e.reference),n=ST.default.clean(i);if(n===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await zs(zA(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new Ze;if(o.load(s.versions[n]),!o.dependencies.has(rQ.identHash)&&!o.peerDependencies.has(rQ.identHash)){for(let a of o.scripts.values())if(a.match(Z6e)){o.dependencies.set(rQ.identHash,S.makeDescriptor(rQ,"latest")),r.report.reportWarningOnce(z.NODE_GYP_INJECTED,`${S.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}return typeof o.raw.deprecated=="string"&&r.report.reportWarningOnce(z.DEPRECATED_PACKAGE,`${S.prettyLocator(r.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),_(P({},e),{version:n,languageName:"node",linkType:gt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var kT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!Rg.test(e.range.slice(ir.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(ir.length),s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=S.makeLocator(e,`${ir}${a}`),c=s.versions[a].dist.tarball;return Vs.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[S.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Unreachable")}};var Rf={};it(Rf,{getGitHead:()=>_Ve,makePublishBody:()=>VVe});var CM={};it(CM,{default:()=>DVe,packUtils:()=>za});var za={};it(za,{genPackList:()=>QQ,genPackStream:()=>dM,genPackageManifest:()=>age,hasPackScripts:()=>hM,prepareForPack:()=>pM});var fM=ie(Nn()),sge=ie(nge()),oge=ie(require("zlib")),EVe=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],yVe=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function hM(t){return!!(Kt.hasWorkspaceScript(t,"prepack")||Kt.hasWorkspaceScript(t,"postpack"))}async function pM(t,{report:e},r){await Kt.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let i=v.join(t.cwd,Ze.fileName);await T.existsPromise(i)&&await t.manifest.loadFile(i,{baseFs:T}),await r()}finally{await Kt.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function dM(t,e){var s,o;typeof e=="undefined"&&(e=await QQ(t));let r=new Set;for(let a of(o=(s=t.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)r.add(v.normalize(a));for(let a of t.manifest.bin.values())r.add(v.normalize(a));let i=sge.default.pack();process.nextTick(async()=>{for(let a of e){let l=v.normalize(a),c=v.resolve(t.cwd,l),u=v.join("package",l),g=await T.lstatPromise(c),f={name:u,mtime:new Date(mr.SAFE_TIME*1e3)},h=r.has(l)?493:420,p,d,m=new Promise((B,b)=>{p=B,d=b}),E=B=>{B?d(B):p()};if(g.isFile()){let B;l==="package.json"?B=Buffer.from(JSON.stringify(await age(t),null,2)):B=await T.readFilePromise(c),i.entry(_(P({},f),{mode:h,type:"file"}),B,E)}else g.isSymbolicLink()?i.entry(_(P({},f),{mode:h,type:"symlink",linkname:await T.readlinkPromise(c)}),E):E(new Error(`Unsupported file type ${g.mode} for ${M.fromPortablePath(l)}`));await m}i.finalize()});let n=(0,oge.createGzip)();return i.pipe(n),n}async function age(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function QQ(t){var g,f,h,p,d,m,E,B;let e=t.project,r=e.configuration,i={accept:[],reject:[]};for(let b of yVe)i.reject.push(b);for(let b of EVe)i.accept.push(b);i.reject.push(r.get("rcFilename"));let n=b=>{if(b===null||!b.startsWith(`${t.cwd}/`))return;let R=v.relative(t.cwd,b),H=v.resolve(Se.root,R);i.reject.push(H)};n(v.resolve(e.cwd,r.get("lockfileFilename"))),n(r.get("cacheFolder")),n(r.get("globalFolder")),n(r.get("installStatePath")),n(r.get("virtualFolder")),n(r.get("yarnPath")),await r.triggerHook(b=>b.populateYarnPaths,e,b=>{n(b)});for(let b of e.workspaces){let R=v.relative(t.cwd,b.cwd);R!==""&&!R.match(/^(\.\.)?\//)&&i.reject.push(`/${R}`)}let s={accept:[],reject:[]},o=(f=(g=t.manifest.publishConfig)==null?void 0:g.main)!=null?f:t.manifest.main,a=(p=(h=t.manifest.publishConfig)==null?void 0:h.module)!=null?p:t.manifest.module,l=(m=(d=t.manifest.publishConfig)==null?void 0:d.browser)!=null?m:t.manifest.browser,c=(B=(E=t.manifest.publishConfig)==null?void 0:E.bin)!=null?B:t.manifest.bin;o!=null&&s.accept.push(v.resolve(Se.root,o)),a!=null&&s.accept.push(v.resolve(Se.root,a)),typeof l=="string"&&s.accept.push(v.resolve(Se.root,l));for(let b of c.values())s.accept.push(v.resolve(Se.root,b));if(l instanceof Map)for(let[b,R]of l.entries())s.accept.push(v.resolve(Se.root,b)),typeof R=="string"&&s.accept.push(v.resolve(Se.root,R));let u=t.manifest.files!==null;if(u){s.reject.push("/*");for(let b of t.manifest.files)Age(s.accept,b,{cwd:Se.root})}return await wVe(t.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function wVe(t,{hasExplicitFileList:e,globalList:r,ignoreList:i}){let n=[],s=new Zo(t),o=[[Se.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!cge(a,{globalList:r,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Se.root)for(let d of u)g=g||d===".gitignore",f=f||d===".npmignore";let h=f?await lge(s,a,".npmignore"):g?await lge(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;cge(a,{globalList:r,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let d of u)o.push([v.resolve(a,d),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(v.relative(Se.root,a))}return n.sort()}async function lge(t,e,r){let i={accept:[],reject:[]},n=await t.readFilePromise(v.join(e,r),"utf8");for(let s of n.split(/\n/g))Age(i.reject,s,{cwd:e});return i}function BVe(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=v.resolve(e,t)),r&&(t=`!${t}`),t}function Age(t,e,{cwd:r}){let i=e.trim();i===""||i[0]==="#"||t.push(BVe(i,{cwd:r}))}function cge(t,{globalList:e,ignoreLists:r}){if(bQ(t,e.accept))return!1;if(bQ(t,e.reject))return!0;if(r!==null)for(let i of r){if(bQ(t,i.accept))return!1;if(bQ(t,i.reject))return!0}return!1}function bQ(t,e){let r=e,i=[];for(let n=0;n{await pM(i,{report:l},async()=>{l.reportJson({base:M.fromPortablePath(i.cwd)});let c=await QQ(i);for(let u of c)l.reportInfo(null,M.fromPortablePath(u)),l.reportJson({location:M.fromPortablePath(u)});if(!this.dryRun){let u=await dM(i,c),g=T.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(z.UNNAMED,`Package archive generated in ${ue.pretty(e,s,ue.Type.PATH)}`),l.reportJson({output:M.fromPortablePath(s)}))})).exitCode()}};fm.paths=[["pack"]],fm.usage=ye.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var gge=fm;function QVe(t,{workspace:e}){let r=t.replace("%s",bVe(e)).replace("%v",vVe(e));return M.toPortablePath(r)}function bVe(t){return t.manifest.name!==null?S.slugifyIdent(t.manifest.name):"package"}function vVe(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var SVe=["dependencies","devDependencies","peerDependencies"],xVe="workspace:",kVe=(t,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of SVe)for(let o of t.manifest.getForScope(s).values()){let a=r.tryWorkspaceByDescriptor(o),l=S.parseRange(o.range);if(l.protocol===xVe)if(a===null){if(r.tryWorkspaceByIdent(o)===null)throw new nt(z.WORKSPACE_NOT_FOUND,`${S.prettyDescriptor(r.configuration,o)}: No local workspace found for this range`)}else{let c;S.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector,e[s][S.stringifyIdent(o)]=c}}},PVe={hooks:{beforeWorkspacePacking:kVe},commands:[gge]},DVe=PVe;var yge=ie(require("crypto")),wge=ie(Ege()),Bge=ie(require("url"));async function VVe(t,e,{access:r,tag:i,registry:n,gitHead:s}){let o=t.project.configuration,a=t.manifest.name,l=t.manifest.version,c=S.stringifyIdent(a),u=(0,yge.createHash)("sha1").update(e).digest("hex"),g=wge.default.fromData(e).toString();typeof r=="undefined"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?r=o.get("npmPublishAccess"):a.scope?r="restricted":r="public");let f=await za.genPackageManifest(t),h=`${c}-${l}.tgz`,p=new Bge.URL(`${To(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:r,["dist-tags"]:{[i]:l},versions:{[l]:_(P({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function _Ve(t){try{let{stdout:e}=await hr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}var wM={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:ge.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:ge.SECRET,default:null}},Qge={npmAuditRegistry:{description:"Registry to query for audit reports",type:ge.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:ge.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.STRING,default:"https://registry.yarnpkg.com"}},XVe={configuration:_(P(P({},wM),Qge),{npmScopes:{description:"Settings per package scope",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:P(P({},wM),Qge)}},npmRegistries:{description:"Settings per registry",type:ge.MAP,normalizeKeys:To,valueDefinition:{description:"",type:ge.SHAPE,properties:P({},wM)}}}),fetchers:[QT,Vs],resolvers:[bT,xT,kT]},ZVe=XVe;var vM={};it(vM,{default:()=>a_e});Ss();var Ho;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ho||(Ho={}));var Xs;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(Xs||(Xs={}));var vQ=[Xs.Info,Xs.Low,Xs.Moderate,Xs.High,Xs.Critical];function bge(t,e){let r=[],i=new Set,n=o=>{i.has(o)||(i.add(o),r.push(o))};for(let o of e)n(o);let s=new Set;for(;r.length>0;){let o=r.shift(),a=t.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=t.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function $Ve(t,e){return new Set([...t].filter(r=>!e.has(r)))}function e_e(t,e,{all:r}){let i=r?t.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=bge(t,l),g=bge(t,c);return $Ve(g,u)}function vge(t){let e={};for(let r of t)e[S.stringifyIdent(r)]=S.parseRange(r.range).selector;return e}function Sge(t){if(typeof t=="undefined")return new Set;let e=vQ.indexOf(t),r=vQ.slice(e);return new Set(r)}function t_e(t,e){let r=Sge(e),i={};for(let n of r)i[n]=t[n];return i}function xge(t,e){var i;let r=t_e(t,e);for(let n of Object.keys(r))if((i=r[n])!=null?i:0>0)return!0;return!1}function kge(t,e){var s;let r={},i={children:r},n=Object.values(t.advisories);if(e!=null){let o=Sge(e);n=n.filter(a=>o.has(a.severity))}for(let o of de.sortMap(n,a=>a.module_name))r[o.module_name]={label:o.module_name,value:ue.tuple(ue.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ue.tuple(ue.Type.NO_HINT,o.title)},URL:{label:"URL",value:ue.tuple(ue.Type.URL,o.url)},Severity:{label:"Severity",value:ue.tuple(ue.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ue.tuple(ue.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ue.tuple(ue.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ue.tuple(ue.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ue.tuple(ue.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function Pge(t,e,{all:r,environment:i}){let n=r?t.workspaces:[e],s=[Ho.All,Ho.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ho.All,Ho.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return vge([...o,...l].filter(c=>S.parseRange(c.range).protocol===null))}function Dge(t,e,{all:r}){var s;let i=e_e(t,e,{all:r}),n={};for(let o of t.storedPackages.values())n[S.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:vge(o.dependencies.values()),dev:i.has(S.convertLocatorToDescriptor(o).descriptorHash)};return n}var dm=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=Y.String("--environment",Ho.All,{description:"Which environments to cover",validator:Yi(Ho)});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=Y.String("--severity",Xs.Info,{description:"Minimal severity requested for packages to be displayed",validator:Yi(Xs)})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=Pge(r,i,{all:this.all,environment:this.environment}),s=Dge(r,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=gr.getAuditRegistry(i.manifest,{configuration:e}),l,c=await Fa.start({configuration:e,stdout:this.context.stdout},async()=>{l=await Lt.post("/-/npm/v1/security/audits/quick",o,{authType:Lt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=xge(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(Hs.emitTree(kge(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(z.EXCEPTION,"No audit suggestions")})).exitCode()}};dm.paths=[["npm","audit"]],dm.usage=ye.Usage({description:"perform a vulnerability audit against the installed packages",details:` + This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). + + For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${vQ.map(e=>`\`${e}\``).join(", ")}. + + If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. + `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var Rge=dm;var BM=ie(Or()),QM=ie(require("util")),Cm=class extends Be{constructor(){super(...arguments);this.fields=Y.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let b=r.topLevelWorkspace;if(!b.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(b.cwd,wt.manifest))}`);c=S.makeDescriptor(b.manifest.name,"unknown")}else c=S.parseDescriptor(l);let u=Lt.getIdentUrl(c),g=bM(await Lt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:Lt.customPackageError})),f=Object.keys(g.versions).sort(BM.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],d=qt.validRange(c.range);if(d){let b=BM.default.maxSatisfying(f,d);b!==null?p=b:(a.reportWarning(z.UNNAMED,`Unmet range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else c.range!=="unknown"&&(a.reportWarning(z.UNNAMED,`Invalid range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let m=g.versions[p],E=_(P(P({},g),m),{version:p,versions:f}),B;if(i!==null){B={};for(let b of i){let R=E[b];if(typeof R!="undefined")B[b]=R;else{a.reportWarning(z.EXCEPTION,`The '${b}' field doesn't exist inside ${S.prettyIdent(e,c)}'s informations`),s=!0;continue}}}else this.json||(delete E.dist,delete E.readme,delete E.users),B=E;a.reportJson(B),this.json||n.push(B)}});QM.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,QM.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} +`);return o.exitCode()}};Cm.paths=[["npm","info"]],Cm.usage=ye.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command will fetch information about a package from the npm registry, and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package informations.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react 16.12.0","yarn npm info react@16.12.0"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var Fge=Cm;function bM(t){if(Array.isArray(t)){let e=[];for(let r of t)r=bM(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let i=bM(t[r]);i&&(e[r]=i)}return e}else return t||null}var Nge=ie(aC()),mm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await i_e({registry:r,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await Lt.put(o,s,{attemptedAs:s.name,configuration:e,registry:r,jsonResponse:!0,authType:Lt.AuthType.NO_AUTH});return await r_e(r,a.token,{configuration:e,scope:this.scope}),n.reportInfo(z.UNNAMED,"Successfully logged in")})).exitCode()}};mm.paths=[["npm","login"]],mm.usage=ye.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var Lge=mm;async function SQ({scope:t,publish:e,configuration:r,cwd:i}){return t&&e?gr.getScopeRegistry(t,{configuration:r,type:gr.RegistryType.PUBLISH_REGISTRY}):t?gr.getScopeRegistry(t,{configuration:r}):e?gr.getPublishRegistry((await rf(r,i)).manifest,{configuration:r}):gr.getDefaultRegistry({configuration:r})}async function r_e(t,e,{configuration:r,scope:i}){let n=o=>a=>{let l=de.isIndexableObject(a)?a:{},c=l[o],u=de.isIndexableObject(c)?c:{};return _(P({},l),{[o]:_(P({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(t)};return await fe.updateHomeConfiguration(s)}async function i_e({registry:t,report:e,stdin:r,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(z.UNNAMED,`Logging in to ${t}`);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(z.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,Nge.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Ff=new Set(["npmAuthIdent","npmAuthToken"]),Im=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=Y.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=async()=>{var l;let n=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await fe.find(this.context.cwd,this.context.plugins),o=S.makeIdent((l=this.scope)!=null?l:null,"pkg");return!gr.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await n_e(),n.reportInfo(z.UNNAMED,"Successfully logged out from everything")),this.scope){await Tge("npmScopes",this.scope),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(z.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish});await Tge("npmRegistries",s),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(z.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};Im.paths=[["npm","logout"]],Im.usage=ye.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Mge=Im;function s_e(t,e){let r=t[e];if(!de.isIndexableObject(r))return!1;let i=new Set(Object.keys(r));if([...Ff].every(s=>!i.has(s)))return!1;for(let s of Ff)i.delete(s);if(i.size===0)return t[e]=void 0,!0;let n=P({},r);for(let s of Ff)delete n[s];return t[e]=n,!0}async function n_e(){let t=e=>{let r=!1,i=de.isIndexableObject(e)?P({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,r=!0);for(let n of Object.keys(i))s_e(i,n)&&(r=!0);if(Object.keys(i).length!==0)return r?i:e};return await fe.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function Tge(t,e){return await fe.updateHomeConfiguration({[t]:r=>{let i=de.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(i,e))return r;let n=i[e],s=de.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Ff].every(l=>!o.has(l)))return r;for(let l of Ff)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:_(P({},i),{[e]:void 0});let a={};for(let l of Ff)a[l]=void 0;return _(P({},i),{[e]:P(P({},s),a)})}})}var Em=class extends Be{constructor(){super(...arguments);this.access=Y.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=Y.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=Y.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);if(i.manifest.private)throw new me("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new me("Workspaces must have valid names and versions to be published on an external registry");await r.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=gr.getPublishRegistry(i.manifest,{configuration:e});return(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await Lt.get(Lt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(z.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Kt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await za.prepareForPack(i,{report:l},async()=>{let g=await za.genPackList(i);for(let m of g)l.reportInfo(null,m);let f=await za.genPackStream(i,g),h=await de.bufferStream(f),p=await Rf.getGitHead(i.cwd),d=await Rf.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await Lt.put(Lt.getIdentUrl(n),d,{configuration:e,registry:o,ident:n,jsonResponse:!0})}),l.reportInfo(z.UNNAMED,"Package archive published")})).exitCode()}};Em.paths=[["npm","publish"]],Em.usage=ye.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var Oge=Em;var Uge=ie(Or());var ym=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=S.parseIdent(this.package);else{if(!i)throw new rt(r.cwd,this.context.cwd);if(!i.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(i.cwd,wt.manifest))}`);n=i.manifest.name}let s=await wm(n,e),a={children:de.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ue.tuple(ue.Type.RESOLUTION,{descriptor:S.makeDescriptor(n,l),locator:S.makeLocator(n,c)})}))};return Hs.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};ym.paths=[["npm","tag","list"]],ym.usage=ye.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Kge=ym;async function wm(t,e){let r=`/-/package${Lt.getIdentUrl(t)}/dist-tags`;return Lt.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:Lt.customPackageError})}var Bm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseDescriptor(this.package,!0),s=n.range;if(!Uge.default.valid(s))throw new me(`The range ${ue.pretty(e,n.range,ue.Type.RANGE)} must be a valid semver version`);let o=gr.getPublishRegistry(i.manifest,{configuration:e}),a=ue.pretty(e,n,ue.Type.IDENT),l=ue.pretty(e,s,ue.Type.RANGE),c=ue.pretty(e,this.tag,ue.Type.CODE);return(await Fe.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await wm(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(z.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(z.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};Bm.paths=[["npm","tag","add"]],Bm.usage=ye.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. + `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var Hge=Bm;var Qm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){if(this.tag==="latest")throw new me("The 'latest' tag cannot be removed.");let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseIdent(this.package),s=gr.getPublishRegistry(i.manifest,{configuration:e}),o=ue.pretty(e,this.tag,ue.Type.CODE),a=ue.pretty(e,n,ue.Type.IDENT),l=await wm(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new me(`${o} is not a tag of package ${a}`);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(z.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};Qm.paths=[["npm","tag","remove"]],Qm.usage=ye.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var Gge=Qm;var bm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r;return this.scope&&this.publish?r=gr.getScopeRegistry(this.scope,{configuration:e,type:gr.RegistryType.PUBLISH_REGISTRY}):this.scope?r=gr.getScopeRegistry(this.scope,{configuration:e}):this.publish?r=gr.getPublishRegistry((await rf(e,this.context.cwd)).manifest,{configuration:e}):r=gr.getDefaultRegistry({configuration:e}),(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await Lt.get("/-/whoami",{configuration:e,registry:r,authType:Lt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?S.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(z.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(z.UNNAMED,s.username)})).exitCode()}};bm.paths=[["npm","whoami"]],bm.usage=ye.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var jge=bm;var o_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:ge.STRING,default:null}},commands:[Rge,Fge,Lge,Mge,Oge,Hge,Kge,Gge,jge]},a_e=o_e;var NM={};it(NM,{default:()=>B_e,patchUtils:()=>SM});var SM={};it(SM,{applyPatchFile:()=>PQ,diffFolders:()=>DM,extractPackageToDisk:()=>PM,extractPatchFlags:()=>Xge,isParentRequired:()=>kM,loadPatchFiles:()=>km,makeDescriptor:()=>E_e,makeLocator:()=>xM,parseDescriptor:()=>Sm,parseLocator:()=>xm,parsePatchFile:()=>kQ});var vm=class extends Error{constructor(e,r){super(`Cannot apply hunk #${e+1}`);this.hunk=r}};var A_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function Nf(t){return v.relative(Se.root,v.resolve(Se.root,M.toPortablePath(t)))}function l_e(t){let e=t.trim().match(A_e);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var c_e=420,u_e=493,Lr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Lr||(Lr={}));var Yge=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),g_e=t=>({header:l_e(t),parts:[]}),f_e={["@"]:"header",["-"]:Lr.Deletion,["+"]:Lr.Insertion,[" "]:Lr.Context,["\\"]:"pragma",undefined:Lr.Context};function p_e(t){let e=[],r=Yge(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),r.hunks.push(n),n=null)}function a(){o(),e.push(r),r=Yge()}for(let l=0;l0?"patch":"mode change",B=null;switch(E){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:Nf(u),toPath:Nf(g)}),B=g}break;case"file deletion":{let b=n||p;if(!b)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(l),hash:f})}break;case"file creation":{let b=s||d;if(!b)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(c),hash:h})}break;case"patch":case"mode change":B=d||s;break;default:de.assertNever(E);break}B&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:Nf(B),oldMode:xQ(o),newMode:xQ(a)}),B&&m&&m.length&&e.push({type:"patch",semverExclusivity:i,path:Nf(B),hunks:m,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function xQ(t){let e=parseInt(t,8)&511;if(e!==c_e&&e!==u_e)throw new Error(`Unexpected file mode string: ${t}`);return e}function kQ(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),d_e(p_e(e))}function h_e(t){let e=0,r=0;for(let{type:i,lines:n}of t.parts)switch(i){case Lr.Context:r+=n.length,e+=n.length;break;case Lr.Deletion:e+=n.length;break;case Lr.Insertion:r+=n.length;break;default:de.assertNever(i);break}if(e!==t.header.original.length||r!==t.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(t.header.original.length)} ${i(t.header.patched.length)} @@, got @@ ${i(e)} ${i(r)} @@)`)}}async function Lf(t,e,r){let i=await t.lstatPromise(e),n=await r();if(typeof n!="undefined"&&(e=n),t.lutimesPromise)await t.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await t.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function PQ(t,{baseFs:e=new Wt,dryRun:r=!1,version:i=null}={}){for(let n of t)if(!(n.semverExclusivity!==null&&i!==null&&!qt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(r){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Lf(e,v.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(r){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Lf(e,v.dirname(n.fromPath),async()=>{await Lf(e,v.dirname(n.toPath),async()=>{await Lf(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` +`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(v.dirname(n.path),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,mr.SAFE_TIME,mr.SAFE_TIME)}break;case"patch":await Lf(e,n.path,async()=>{await C_e(n,{baseFs:e,dryRun:r})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(qge(n.newMode)!==qge(o))continue;await Lf(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:de.assertNever(n);break}}function qge(t){return(t&64)>0}function Jge(t){return t.replace(/\s+$/,"")}function m_e(t,e){return Jge(t)===Jge(e)}async function C_e({hunks:t,path:e},{baseFs:r,dryRun:i=!1}){let n=await r.statSync(e).mode,o=(await r.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of t){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),d=Math.max(h,p),m=0,E=0,B=null;for(;m<=d;){if(m<=h&&(E=f-m,B=Wge(g,o,E),B!==null)){m=-m;break}if(m<=p&&(E=f+m,B=Wge(g,o,E),B!==null))break;m+=1}if(B===null)throw new vm(t.indexOf(g),g);a.push(B),l+=m,c=E+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:de.assertNever(f);break}await r.writeFilePromise(e,o.join(` +`),{mode:n})}function Wge(t,e,r){let i=[];for(let n of t.parts)switch(n.type){case Lr.Context:case Lr.Deletion:{for(let s of n.lines){let o=e[r];if(o==null||!m_e(o,s))return null;r+=1}n.type===Lr.Deletion&&(i.push({type:"splice",index:r-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Lr.Insertion:i.push({type:"splice",index:r,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:de.assertNever(n.type);break}return i}var I_e=/^builtin<([^>]+)>$/;function zge(t,e){let{source:r,selector:i,params:n}=S.parseRange(t);if(r===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>M.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?S.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(r);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function Sm(t){let i=zge(t.range,S.parseDescriptor),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceDescriptor:e})}function xm(t){let i=zge(t.reference,S.parseLocator),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceLocator:e})}function Vge({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:i,patchHash:n},s){let o=t!==null?{locator:S.stringifyLocator(t)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return S.makeRange({protocol:"patch:",source:s(e),selector:r.join("&"),params:P(P(P({},a),l),o)})}function E_e(t,{parentLocator:e,sourceDescriptor:r,patchPaths:i}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,patchPaths:i},S.stringifyDescriptor))}function xM(t,{parentLocator:e,sourcePackage:r,patchPaths:i,patchHash:n}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:i,patchHash:n},S.stringifyLocator))}function _ge({onAbsolute:t,onRelative:e,onBuiltin:r},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(I_e);return s!==null?r(s[1]):v.isAbsolute(i)?t(i):e(i)}function Xge(t){let e=t.startsWith("~");return e&&(t=t.slice(1)),{optional:e}}function kM(t){return _ge({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},t)}async function km(t,e,r){let i=t!==null?await r.fetcher.fetch(t,r):null,n=i&&i.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await de.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Xge(o),l=await _ge({onAbsolute:async()=>await T.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(v.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await r.project.configuration.firstHook(u=>u.getBuiltinPatch,r.project,c)},o);return _(P({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` +`));return s}async function PM(t,{cache:e,project:r}){let i=r.storedPackages.get(t.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=r.storedChecksums,s=new ei,o=r.configuration.makeFetcher(),a=await o.fetch(t,{cache:e,project:r,fetcher:o,checksums:n,report:s}),l=await T.mktempPromise(),c=v.join(l,"source"),u=v.join(l,"user"),g=v.join(l,".yarn-patch.json");return await Promise.all([T.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),T.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),T.writeJsonPromise(g,{locator:S.stringifyLocator(t),version:i.version})]),T.detachTemp(l),u}async function DM(t,e){let r=M.fromPortablePath(t).replace(/\\/g,"/"),i=M.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--text",r,i],{cwd:M.toPortablePath(process.cwd()),env:_(P({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${s}`);let o=r.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${de.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${de.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(de.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(de.escapeRegExp(`${i}/`),"g"),"")}function Zge(t,{configuration:e,report:r}){for(let i of t.parts)for(let n of i.lines)switch(i.type){case Lr.Context:r.reportInfo(null,` ${ue.pretty(e,n,"grey")}`);break;case Lr.Deletion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`- ${ue.pretty(e,n,ue.Type.REMOVED)}`);break;case Lr.Insertion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`+ ${ue.pretty(e,n,ue.Type.ADDED)}`);break;default:de.assertNever(i.type)}}var RM=class{supports(e,r){return!!e.reference.startsWith("patch:")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async patchPackage(e,r){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=xm(e),a=await km(i,o,r),l=await T.mktempPromise(),c=v.join(l,"current.zip"),u=await r.fetcher.fetch(n,r),g=S.getIdentVendorPath(e),f=await $i(),h=new Jr(c,{libzip:f,create:!0,level:r.project.configuration.get("compressionLevel")});await de.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:d}of a){if(p===null)continue;let m=new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")}),E=new Ft(v.resolve(Se.root,g),{baseFs:m});try{await PQ(kQ(p),{baseFs:E,version:s})}catch(B){if(!(B instanceof vm))throw B;let b=r.project.configuration.get("enableInlineHunks"),R=!b&&!d?" (set enableInlineHunks for details)":"",H=`${S.prettyLocator(r.project.configuration,e)}: ${B.message}${R}`,L=K=>{!b||Zge(B.hunk,{configuration:r.project.configuration,report:K})};if(m.discardAndClose(),d){r.report.reportWarningOnce(z.PATCH_HUNK_FAILED,H,{reportExtra:L});continue}else throw new nt(z.PATCH_HUNK_FAILED,H,L)}m.saveAndClose()}return new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")})}};var y_e=3,FM=class{supportsDescriptor(e,r){return!!e.range.startsWith("patch:")}supportsLocator(e,r){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){let{patchPaths:n}=Sm(e);return n.every(s=>!kM(s))?e:S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:i}=Sm(e);return[i]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=Sm(e),a=await km(n,o,i.fetchOptions),l=r.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=mn.makeHash(`${y_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[xM(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){let{sourceLocator:i}=xm(e),n=await r.resolver.resolve(i,r);return P(P({},n),e)}};var Pm=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=v.resolve(this.context.cwd,M.toPortablePath(this.patchFolder)),s=v.join(n,"../source"),o=v.join(n,"../.yarn-patch.json");if(!T.existsSync(s))throw new me("The argument folder didn't get created by 'yarn patch'");let a=await DM(s,n),l=await T.readJsonPromise(o),c=S.parseLocator(l.locator,!0);if(!r.storedPackages.has(c.locatorHash))throw new me("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=v.join(u,S.slugifyLocator(c));await T.mkdirPromise(u,{recursive:!0}),await T.writeFilePromise(g,a);let f=v.relative(r.cwd,g);r.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:S.stringifyIdent(c),description:l.version}},reference:`patch:${S.stringifyLocator(c)}#${f}`}),await r.persist()}};Pm.paths=[["patch-commit"]],Pm.usage=ye.Usage({description:"generate a patch out of a directory",details:"\n This will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n Only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var $ge=Pm;var Dm=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=S.parseLocator(this.package);if(s.reference==="unknown"){let o=de.mapAndFilter([...r.storedPackages.values()],a=>a.identHash!==s.identHash?de.mapAndFilter.skip:S.isVirtualLocator(a)?de.mapAndFilter.skip:a);if(o.length===0)throw new me("No package found in the project for the given locator");if(o.length>1)throw new me(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${o.map(a=>` +- ${S.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!r.storedPackages.has(s.locatorHash))throw new me("No package found in the project for the given locator");await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await PM(s,{cache:n,project:r});o.reportJson({locator:S.stringifyLocator(s),path:M.fromPortablePath(a)}),o.reportInfo(z.UNNAMED,`Package ${S.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(z.UNNAMED,`You can now edit the following folder: ${ue.pretty(e,M.fromPortablePath(a),"magenta")}`),o.reportInfo(z.UNNAMED,`Once you are done run ${ue.pretty(e,`yarn patch-commit ${process.platform==="win32"?'"':""}${M.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};Dm.paths=[["patch"]],Dm.usage=ye.Usage({description:"prepare a package for patching",details:'\n This command will cause a package to be extracted in a temporary directory (under a folder named "patch-workdir"). This folder will be editable at will; running `yarn patch` inside it will then cause Yarn to generate a patchfile and register it into your top-level manifest (cf the `patch:` protocol).\n '});var efe=Dm;var w_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:ge.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[$ge,efe],fetchers:[RM],resolvers:[FM]},B_e=w_e;var TM={};it(TM,{default:()=>S_e});var tfe=ie(Wp()),LM=class{supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="pnpm"}async findPackageLocation(e,r){return nfe(e,{project:r.project})}async findPackageLocator(e,r){let i=ife(),n=r.project.installersCustomData.get(i);if(!n)throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=v.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new rfe(e)}},rfe=class{constructor(e){this.opts=e;this.asyncActions=new afe;this.packageLocations=new Map;this.customData={locatorByPath:new Map}}getCustomDataKey(){return ife()}attachCustomData(e){this.customData=e}async installPackage(e,r,i){switch(e.linkType){case gt.SOFT:return this.installPackageSoft(e,r,i);case gt.HARD:return this.installPackageHard(e,r,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,i){let n=v.resolve(r.packageFs.getRealPath(),r.prefixPath);return this.packageLocations.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,r,i){var u;let n=nfe(e,{project:this.opts.project});this.customData.locatorByPath.set(n,S.stringifyLocator(e)),this.packageLocations.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await T.mkdirPromise(n,{recursive:!0}),await T.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1})}));let o=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e,a={manifest:(u=await Ze.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?u:new Ze,misc:{hasBindingGyp:Ws.hasBindingGyp(r)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ws.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,r){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!ofe(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.packageLocations.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(e)})`);let s=v.join(n,wt.nodeModules);r.length>0&&await T.mkdirpPromise(s);let o=await Q_e(s),a=[];for(let[l,c]of r){let u=c;ofe(c,{project:this.opts.project})||(this.opts.report.reportWarning(z.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=S.devirtualizeLocator(c));let g=this.packageLocations.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(c)})`);let f=S.stringifyIdent(l),h=v.join(s,f),p=v.relative(v.dirname(h),g),d=o.get(f);o.delete(f),a.push(Promise.resolve().then(async()=>{if(d){if(d.isSymbolicLink()&&await T.readlinkPromise(h)===p)return;await T.removePromise(h)}await T.mkdirpPromise(v.dirname(h)),process.platform=="win32"?await T.symlinkPromise(g,h,"junction"):await T.symlinkPromise(p,h)}))}for(let l of o.keys())a.push(T.removePromise(v.join(s,l)));await Promise.all(a)}))}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=sfe(this.opts.project),r=new Set;for(let s of this.packageLocations.values())r.add(v.basename(s));let i;try{i=await T.readdirPromise(e)}catch{i=[]}let n=[];for(let s of i)r.has(s)||n.push(T.removePromise(v.join(e,s)));await Promise.all(n),await this.asyncActions.wait()}};function ife(){return JSON.stringify({name:"PnpmInstaller",version:1})}function sfe(t){return v.join(t.cwd,wt.nodeModules,".store")}function nfe(t,{project:e}){let r=S.slugifyLocator(t);return v.join(sfe(e),r)}function ofe(t,{project:e}){return!S.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Q_e(t){let e=new Map,r=[];try{r=await T.readdirPromise(t,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of r)if(!i.name.startsWith("."))if(i.name.startsWith("@"))for(let n of await T.readdirPromise(v.join(t,i.name),{withFileTypes:!0}))e.set(`${i.name}/${n.name}`,n);else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}function b_e(){let t,e;return{promise:new Promise((i,n)=>{t=i,e=n}),resolve:t,reject:e}}var afe=class{constructor(){this.deferred=new Map;this.promises=new Map;this.limit=(0,tfe.default)(10)}set(e,r){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=b_e());let n=this.limit(()=>r());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,r){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>r(i))}async wait(){await Promise.all(this.promises.values())}};var v_e={linkers:[LM]},S_e=v_e;var F0=()=>({modules:new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",F$(vh)],["semver",x_e],["typanion",lu],["yup",k_e],["@yarnpkg/plugin-essentials",hL],["@yarnpkg/plugin-compat",mL],["@yarnpkg/plugin-dlx",IL],["@yarnpkg/plugin-file",xL],["@yarnpkg/plugin-git",fL],["@yarnpkg/plugin-github",PL],["@yarnpkg/plugin-http",FL],["@yarnpkg/plugin-init",ML],["@yarnpkg/plugin-link",GL],["@yarnpkg/plugin-nm",mT],["@yarnpkg/plugin-npm",yM],["@yarnpkg/plugin-npm-cli",vM],["@yarnpkg/plugin-pack",CM],["@yarnpkg/plugin-patch",NM],["@yarnpkg/plugin-pnp",oT],["@yarnpkg/plugin-pnpm",TM]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});i0({binaryVersion:Zr||"",pluginConfiguration:F0()});})(); +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 000000000..d8116da51 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,4 @@ +cacheFolder: "./.yarn/cache" +nodeLinker: node-modules +yarnPath: .yarn/releases/yarn-3.1.0.cjs +enableImmutableInstalls: true diff --git a/Dockerfile b/Dockerfile index a40b4df9f..7c74a478d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,53 +1,34 @@ # Build stage -FROM --platform=linux/amd64 eclipse-temurin:11-jdk as builder +FROM --platform=$BUILDPLATFORM eclipse-temurin:17-jdk as builder -# Install cURL... -RUN apt-get update && \ - apt-get install --no-install-recommends -yq curl && \ - curl -sL https://deb.nodesource.com/setup_14.x | bash - && \ -# ...then install NodeJS - apt-get install --no-install-recommends -yq nodejs build-essential && \ - npm install -g npm && \ - npm install -g yarn && \ -# ...then install everything needed for Headless Chrome to work - apt-get install --no-install-recommends -yq \ - ca-certificates fonts-liberation libappindicator3-1 libasound2 \ - libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ - libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 \ - libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 \ - libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 \ - libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libxshmfence1 \ - lsb-release \ - wget xdg-utils && \ -# ...and clean up the dependencies - apt autoremove && \ - rm -rf /var/lib/apt/lists/* +# Install NodeJS and Yarn +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash \ + && apt-get update && apt-get install -y \ + nodejs \ + && rm -rf /var/lib/apt/lists/* \ + && npm install -g yarn -# installing the node and java packages before adding the src directory -# will allow us to re-use these image layers when only the souce code changes -WORKDIR /app +## installing the node and java packages before adding the src directory +## will allow us to re-use these image layers when only the souce code changes +WORKDIR /code -ENV GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.project.prod=true" +ENV GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.project.prod=true -Dorg.gradle.vfs.watch=false" -COPY package.json yarn.lock /app/ +COPY package.json yarn.lock .yarnrc.yml /code/ +COPY .yarn /code/.yarn RUN yarn install --network-timeout 1000000 -COPY gradlew /app/ -COPY gradle/wrapper gradle/wrapper -RUN ./gradlew --version - COPY gradle gradle -COPY build.gradle gradle.properties settings.gradle /app/ +COPY gradlew build.gradle gradle.properties settings.gradle /code/ COPY radar-auth/build.gradle radar-auth/ -COPY radar-auth/deprecated-auth0/build.gradle radar-auth/deprecated-auth0/ COPY oauth-client-util/build.gradle oauth-client-util/ -RUN ./gradlew downloadDependencies :radar-auth:shadowJar +RUN ./gradlew downloadDependencies # now we copy our application source code and build it COPY angular.json proxy.conf.json tsconfig.app.json \ - tsconfig.spec.json tsconfig.json tslint.json /app/ + tsconfig.spec.json tsconfig.json tslint.json /code/ COPY webpack webpack COPY radar-auth radar-auth @@ -55,15 +36,15 @@ COPY src src RUN ./gradlew -s bootWar # Run stage -FROM eclipse-temurin:11-jre +FROM eclipse-temurin:17-jre ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \ JHIPSTER_SLEEP=0 \ JAVA_OPTS="" # Add the war and changelogs files from build stage -COPY --from=builder /app/build/libs/*.war /app.war -COPY --from=builder /app/src/main/docker/etc /mp-includes +COPY --from=builder /code/build/libs/*.war /app.war +COPY --from=builder /code/src/main/docker/etc /mp-includes EXPOSE 8080 5701/udp CMD echo "The application will start in ${JHIPSTER_SLEEP}s..." && \ diff --git a/README.md b/README.md index 71400563e..66110b03c 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,8 @@ [![Latest release](https://img.shields.io/github/v/release/RADAR-base/ManagementPortal)](https://github.com/RADAR-base/ManagementPortal/releases/latest) [![Build Status](https://github.com/RADAR-base/ManagementPortal/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/RADAR-base/ManagementPortal/actions/workflows/main.yml?query=branch%3Amaster) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/d6945ebd1eba4a3fbb55882cda33655e)](https://www.codacy.com/app/RADAR-base/ManagementPortal?utm_source=github.com&utm_medium=referral&utm_content=RADAR-base/ManagementPortal&utm_campaign=Badge_Grade) -[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/d6945ebd1eba4a3fbb55882cda33655e)](https://www.codacy.com/app/RADAR-base/ManagementPortal?utm_source=github.com&utm_medium=referral&utm_content=RADAR-base/ManagementPortal&utm_campaign=Badge_Coverage) -ManagementPortal is an application which is used to manage pilot studies for [RADAR-base](http://www.radar-base.org/). +Management Portal is an application which is used to manage clinical studies for [RADAR-base](https://www.radar-base.org/) platform. ## Table of contents @@ -31,16 +29,17 @@ ManagementPortal is an application which is used to manage pilot studies for [RA The following are the prerequisites to run ManagementPortal from source on your machine: -- Java 11 -- Node.js (v15 or later is recommended) -- Yarn (v1.19.0 or later is recommended) +- Java 17 +- Node.js (v16 or later is recommended) +- Yarn (3.1.0 or later is recommended) ## Quickstart -Management Portal can be easily run either by running from source or by using the provided `docker-compose` file. +Management Portal can be easily run either by running from source or by using the provided `docker-compose` file. For documentation on how to run ManagementPortal in production, please see [RADAR-Kubernetes][]. + ### Using Docker-Compose -The quickest way to get ManagementPortal up and running in production mode is by using the included +The quickest way to get Management Portal up and running in production mode is by using the included docker-compose files. 1. Make sure [Docker][] and [Docker-Compose][] are installed on your system. 2. Generate a key pair for signing JWT tokens as follows: @@ -66,11 +65,11 @@ You must install and configure the following dependencies on your machine to run **Make sure the key password and store password are the same!** This is a requirement for Spring Security. 4. **Profile configurations :** ManagementPortal can be run with either `development` or `production` profile. The table below lists the -main differences between the profiles are mentioned in the table below. Configure the application using the property file at `src/main/resources/config/application-.yml`.Read more about configurations [here](#configuration) +main differences between the profiles. Configure the application using the property file at `src/main/resources/config/application-.yml`.Read more about configurations [here](#configuration) 5. Run ManagementPortal by running `./gradlew bootRun -Pprod` or `./gradlew bootRun -Pdev`. Development mode will start an in memory database and ManagementPortal. -6. You can login to the application using `admin:admin`. Please don't forgot to change the password of `admin`, if you are using the application on production environment. +6. You can log in to the application using `admin:admin`. Please don't forgot to change the password of `admin`, if you are using the application on production environment. | | Development | Production | @@ -82,7 +81,7 @@ memory database and ManagementPortal. -The docker image can be pulled by running `docker pull radarbase/management-portal`. +The docker image can be pulled by running `docker pull radarbase/management-portal:latest`. ## Configuration @@ -100,30 +99,30 @@ in the [application.yml](src/main/resources/config/application.yml) and [Spring external configuration](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html) for other options on overriding the default configuration. -| Variable | Default value | Description | -|------------------------------------------------------------|-----------------------------------------------------|--------------------------------------------------------------------------------------------------------| -| `SPRING_DATASOURCE_URL` | `jdbc:postgresql://localhost:5432/managementportal` | URL for the database to be used | -| `SPRING_DATASOURCE_USERNAME` | `` | Username to access the database | -| `SPRING_DATASOURCE_PASSWORD` | `` | Password to access the database | -| `SPRING_APPLICATION_JSON` | None | Generic environment variable for overriding all types of application settings | -| `MANAGEMENTPORTAL_MAIL_FROM` | None, you need to override this | Email address that will be set in the From email header. | -| `MANAGEMENTPORTAL_FRONTEND_CLIENT_SECRET` | None, you need to override this | OAuth client secret for the frontend | -| `MANAGEMENTPORTAL_FRONTEND_ACCESS_TOKEN_VALIDITY_SECONDS` | `14400` | Frontend access token validity period in seconds | -| `MANAGEMENTPORTAL_FRONTEND_REFRESH_TOKEN_VALIDITY_SECONDS` | `259200` | Frontend refresh token validity period in seconds | -| `MANAGEMENTPORTAL_OAUTH_CLIENTS_FILE` | `/mp-includes/config/oauth_client_details.csv` | Location of the OAuth clients file | -| `MANAGEMENTPORTAL_OAUTH_KEY_STORE_PASSWORD` | `radarbase` | Password for the JWT keystore | -| `MANAGEMENTPORTAL_OAUTH_SIGNING_KEY_ALIAS` | `radarbase-managementportal-ec` | Alias in the keystore of the keypair to use for signing | -| `MANAGEMENTPORTAL_OAUTH_ENABLE_PUBLIC_KEY_VERIFIERS` | `false` | Whether to use additional verifiers using public-keys and deprecated verifier implementation. If you set this to `true`, also set `RADAR_IS_CONFIG_LOCATION` and provide yaml file with public keys. Read more at radar-auth documentation. | -| `MANAGEMENTPORTAL_CATALOGUE_SERVER_ENABLE_AUTO_IMPORT` | `false` | Whether to enable or disable auto import of sources from the catalogue server | -| `MANAGEMENTPORTAL_CATALOGUE_SERVER_SERVER_URL` | None | URL to the catalogue server | -| `MANAGEMENTPORTAL_COMMON_BASE_URL` | None | Resolvable baseUrl of the hosted platform | -| `MANAGEMENTPORTAL_COMMON_MANAGEMENT_PORTAL_BASE_URL` | None | Resolvable baseUrl of this managementportal instance | -| `MANAGEMENTPORTAL_COMMON_PRIVACY_POLICY_URL` | None | Resolvable URL to the common privacy policy url | -| `MANAGEMENTPORTAL_COMMON_ADMIN_PASSWORD` | None | Admin password | -| `MANAGEMENTPORTAL_COMMON_ACTIVATION_KEY_TIMEOUT_IN_SECONDS` | 86400 | Account activation/reset timeout in seconds | -| `RADAR_IS_CONFIG_LOCATION` | `radar-is.yml` from class path | Location of additional public-key configuration file. | -| `JHIPSTER_SLEEP` | `10` | Time in seconds that the application should wait at bootup. Used to allow the database to become ready | -| `JAVA_OPTS` | `-Xmx512m` | Options to pass on the JVM | +| Variable | Default value | Description | +|-------------------------------------------------------------|-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `SPRING_DATASOURCE_URL` | `jdbc:postgresql://localhost:5432/managementportal` | URL for the database to be used | +| `SPRING_DATASOURCE_USERNAME` | `` | Username to access the database | +| `SPRING_DATASOURCE_PASSWORD` | `` | Password to access the database | +| `SPRING_APPLICATION_JSON` | None | Generic environment variable for overriding all types of application settings | +| `MANAGEMENTPORTAL_MAIL_FROM` | None, you need to override this | Email address that will be set in the From email header. | +| `MANAGEMENTPORTAL_FRONTEND_CLIENT_SECRET` | None, you need to override this | OAuth client secret for the frontend | +| `MANAGEMENTPORTAL_FRONTEND_ACCESS_TOKEN_VALIDITY_SECONDS` | `14400` | Frontend access token validity period in seconds | +| `MANAGEMENTPORTAL_FRONTEND_REFRESH_TOKEN_VALIDITY_SECONDS` | `259200` | Frontend refresh token validity period in seconds | +| `MANAGEMENTPORTAL_OAUTH_CLIENTS_FILE` | `/mp-includes/config/oauth_client_details.csv` | Location of the OAuth clients file | +| `MANAGEMENTPORTAL_OAUTH_KEY_STORE_PASSWORD` | `radarbase` | Password for the JWT keystore | +| `MANAGEMENTPORTAL_OAUTH_SIGNING_KEY_ALIAS` | `radarbase-managementportal-ec` | Alias in the keystore of the keypair to use for signing | +| `MANAGEMENTPORTAL_OAUTH_ENABLE_PUBLIC_KEY_VERIFIERS` | `false` | Whether to use additional verifiers using public-keys and deprecated verifier implementation. If you set this to `true`, also set `RADAR_IS_CONFIG_LOCATION` and provide yaml file with public keys. Read more at radar-auth documentation. | +| `MANAGEMENTPORTAL_CATALOGUE_SERVER_ENABLE_AUTO_IMPORT` | `false` | Whether to enable or disable auto import of sources from the catalogue server | +| `MANAGEMENTPORTAL_CATALOGUE_SERVER_SERVER_URL` | None | URL to the catalogue server | +| `MANAGEMENTPORTAL_COMMON_BASE_URL` | None | Resolvable baseUrl of the hosted platform | +| `MANAGEMENTPORTAL_COMMON_MANAGEMENT_PORTAL_BASE_URL` | None | Resolvable baseUrl of this managementportal instance | +| `MANAGEMENTPORTAL_COMMON_PRIVACY_POLICY_URL` | None | Resolvable URL to the common privacy policy url | +| `MANAGEMENTPORTAL_COMMON_ADMIN_PASSWORD` | None | Admin password | +| `MANAGEMENTPORTAL_COMMON_ACTIVATION_KEY_TIMEOUT_IN_SECONDS` | 86400 | Account activation/reset timeout in seconds | +| `RADAR_IS_CONFIG_LOCATION` | `radar-is.yml` from class path | Location of additional public-key configuration file. | +| `JHIPSTER_SLEEP` | `10` | Time in seconds that the application should wait at bootup. Used to allow the database to become ready | +| `JAVA_OPTS` | `-Xmx512m` | Options to pass on the JVM | Lists cannot directly be encoded by environment variables in this version of Spring. So for example the OAuth checking key aliases need to be encoded using the `SPRING_APPLICATION_JSON` variable. For setting two aliases, set it to `{"managementportal":{"oauth":{"checkingKeyAliases":["one","two"]}}}`, for example. If this list is not set, the signing key will also be used as the checking key. @@ -189,7 +188,7 @@ username your OAuth client id, and leaving the password empty: ```json { "access_token": "...", - "refresh_token": "...", + "refresh_token": "..." } ``` Now the app can use the refresh token flow as shown above. @@ -226,39 +225,13 @@ auto-refreshes when files change on your hard drive. ./gradlew yarn start -Then open to start the interface and sign in with admin/admin. +Then open to start the interface and sign in with admin/admin. [Yarn][] is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by specifying a newer version in [package.json](package.json). You can also run `yarn update` and `yarn install` to manage dependencies. Add the `help` flag on any command to see how you can use it. For example, `yarn help update`. -The `yarn run` command will list all of the scripts available to run for this project. - -### Managing dependencies - -For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command: - - yarn add --exact leaflet - -To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command: - - yarn add --dev --exact @types/leaflet - -Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them: - -Edit [src/main/webapp/app/vendor.ts](src/main/webapp/app/vendor.ts) file: -~~~ -import 'leaflet/dist/leaflet.js'; -~~~ - -Edit [src/main/webapp/content/css/vendor.css](src/main/webapp/content/css/vendor.css) file: -~~~ -@import '~leaflet/dist/leaflet.css'; -~~~ - -Note: there are still few other things remaining to do for Leaflet that we won't detail here. - -For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. +The `yarn run` command will list all the scripts available to run for this project. ### Using angular-cli @@ -290,7 +263,6 @@ To ensure everything worked, run: Then navigate to [http://localhost:8080](http://localhost:8080) in your browser. -Refer to [Using JHipster in production][] for more details. ## Testing @@ -304,7 +276,7 @@ Unit tests are run by [Karma][] and written with [Jasmine][]. They're located in yarn test -UI end-to-end tests are powered by [Protractor][], which is built on top of WebDriverJS. They're located in [src/test/javascript/e2e](src/test/javascript/e2e) +UI end-to-end tests are powered by [Cypress][], which is built on top of WebDriverJS. They're located in [src/test/javascript/e2e](src/test/javascript/e2e) and can be run by starting Spring Boot in one terminal (`./gradlew bootRun`) and running the tests (`yarn run e2e`) in a second one. ### Other tests @@ -341,13 +313,12 @@ Then run: For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`yo jhipster:docker-compose`), which is able to generate docker configurations for one or several JHipster applications. ## Documentation -Visit our [Github pages](https://radar-base.github.io/ManagementPortal) site to find links to the -Javadoc and API docs. +Please find the links for some of the documentation per category/component * [management-portal-javadoc](https://radar-base.github.io/ManagementPortal/management-portal-javadoc/) * [oauth-client-util-javadoc](https://radar-base.github.io/ManagementPortal/oauth-client-util-javadoc/) * [radar-auth-javadoc](https://radar-base.github.io/ManagementPortal/radar-auth-javadoc/) * [managementportal-client-javadoc](https://radar-base.github.io/ManagementPortal/managementportal-client-javadoc/) -* [apidoc](https://radar-base.github.io/ManagementPortal/apidoc/swagger.json) +* [Swagger 2.0 apidoc](https://radar-base.github.io/ManagementPortal/apidoc/swagger.json) The pages site is published from the `gh-pages` branch, which has its own history. If you want to contribute to the documentation, it is probably more convenient to clone a separate copy of this @@ -363,31 +334,30 @@ This project provides a Gradle task to generate an [OpenAPI] specification from ``` ManagementPortal needs to be running and be accessible at `http://localhost:8080` for this task to work. -The resulting file can be imported into the [Swagger editor], or used with [Swagger codegen] to generate client libraries. +The resulting file can be imported into the [Swagger editor][], or used with [Swagger codegen][] to generate client libraries. -[JHipster Homepage and latest documentation]: https://jhipster.github.io -[JHipster 4.3.0 archive]: https://jhipster.github.io/documentation-archive/v4.3.0 +[JHipster Homepage and latest documentation]: https://www.jhipster.tech -[Using JHipster in development]: https://jhipster.github.io/documentation-archive/v4.3.0/development/ -[Using Docker and Docker-Compose]: https://jhipster.github.io/documentation-archive/v4.3.0/docker-compose -[Using JHipster in production]: https://jhipster.github.io/documentation-archive/v4.3.0/production/ -[Running tests page]: https://jhipster.github.io/documentation-archive/v4.3.0/running-tests/ -[Setting up Continuous Integration]: https://jhipster.github.io/documentation-archive/v4.3.0/setting-up-ci/ +[RADAR-Kubernetes]: https://github.com/RADAR-base/RADAR-Kubernetes +[Using Docker and Docker-Compose]: https://www.jhipster.tech/docker-compose/ +[Running tests page]: https://www.jhipster.tech/running-tests/ +[Setting up Continuous Integration]: https://www.jhipster.tech/setting-up-ci/ -[Gatling]: http://gatling.io/ +[Gatling]: https://gatling.io/ [Node.js]: https://nodejs.org/ [Yarn]: https://yarnpkg.org/ [Webpack]: https://webpack.github.io/ [Angular CLI]: https://cli.angular.io/ [BrowserSync]: http://www.browsersync.io/ -[Karma]: http://karma-runner.github.io/ -[Jasmine]: http://jasmine.github.io/2.0/introduction.html +[Karma]: https://karma-runner.github.io/ +[Jasmine]: https://jasmine.github.io +[Cypress]: https://www.cypress.io [Protractor]: https://angular.github.io/protractor/ [Leaflet]: http://leafletjs.com/ [DefinitelyTyped]: http://definitelytyped.org/ [Docker]: https://docs.docker.com/ [Docker-Compose]: https://docs.docker.com/compose/ [OpenAPI]: https://www.openapis.org/ -[Swagger editor]: http://editor.swagger.io/ +[Swagger editor]: https://editor.swagger.io/ [Swagger codegen]: https://swagger.io/swagger-codegen/ [OAuth2 spec]: https://tools.ietf.org/html/rfc6749#section-9 diff --git a/angular.json b/angular.json index 9957667bf..3620fd8de 100644 --- a/angular.json +++ b/angular.json @@ -37,6 +37,9 @@ "styles": [ "src/main/webapp/content/scss/global.scss" ], + "allowedCommonJsDependencies": [ + "qrcode" + ], "scripts": [] }, "configurations": { @@ -146,4 +149,4 @@ "cli": { "defaultCollection": "@angular-eslint/schematics" } -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index 6ef1b47f1..78bd4e811 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,6 @@ import java.util.concurrent.TimeUnit buildscript { repositories { mavenCentral() - jcenter() } dependencies { @@ -13,26 +12,23 @@ buildscript { } plugins { + id 'application' id 'org.springframework.boot' version "${spring_boot_version}" - id "com.moowork.node" version "1.2.0" - id "io.spring.dependency-management" version "1.0.10.RELEASE" - id 'de.undercouch.download' version '4.1.1' apply false - id "io.github.gradle-nexus.publish-plugin" version "1.0.0" + id "com.github.node-gradle.node" version "3.5.0" + id "io.spring.dependency-management" version "1.1.0" + id 'de.undercouch.download' version '5.3.0' apply false + id "io.github.gradle-nexus.publish-plugin" version "1.1.0" + id("com.github.ben-manes.versions") version "0.43.0" } apply plugin: 'org.springframework.boot' apply plugin: 'war' -apply plugin: 'com.moowork.node' +apply plugin: 'com.github.node-gradle.node' apply plugin: 'io.spring.dependency-management' -repositories { - mavenCentral() - jcenter() -} - allprojects { group 'org.radarbase' - version '0.8.2' // project version + version '2.0.0' // project version // The comment on the previous line is only there to identify the project version line easily // with a sed command, to auto-update the version number with the prepare-release-branch.sh @@ -46,7 +42,11 @@ allprojects { ext.githubRepoName = 'RADAR-base/ManagementPortal' ext.githubUrl = 'https://github.com/RADAR-base/ManagementPortal' ext.issueUrl = "https://github.com/$githubRepoName/issues" - ext.website = 'http://radar-base.org' + ext.website = 'https://radar-base.org' + + repositories { + mavenCentral() + } idea { module { @@ -61,8 +61,8 @@ allprojects { } } -sourceCompatibility = JavaVersion.VERSION_11 -targetCompatibility = JavaVersion.VERSION_11 +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 description = 'MangementPortal application to manage studies and participants' @@ -72,21 +72,31 @@ configurations { compile.exclude module: "spring-boot-starter-tomcat" } +application { + mainClass.set('org.radarbase.management.ManagementPortalApp') + applicationDefaultJvmArgs = [ + '--add-modules', 'java.se', + '--add-exports', 'java.base/jdk.internal.ref=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.nio=ALL-UNNAMED', + '--add-opens', 'java.base/sun.nio.ch=ALL-UNNAMED', + '--add-opens', 'java.management/sun.management=ALL-UNNAMED', + '--add-opens', 'jdk.management/com.sun.management.internal=ALL-UNNAMED', + ] +} bootWar { - mainClassName = 'org.radarbase.management.ManagementPortalApp' launchScript() } springBoot { - mainClassName = 'org.radarbase.management.ManagementPortalApp' buildInfo() } if (OperatingSystem.current().isWindows()) { task pathingJar(type: Jar) { dependsOn configurations.runtime - appendix = 'pathing' + archiveAppendix.set('pathing') doFirst { manifest { @@ -111,18 +121,21 @@ if (OperatingSystem.current().isWindows()) { } test { + jvmArgs = [ + '--add-modules', 'java.se', + '--add-exports', 'java.base/jdk.internal.ref=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.nio=ALL-UNNAMED', + '--add-opens', 'java.base/sun.nio.ch=ALL-UNNAMED', + '--add-opens', 'java.management/sun.management=ALL-UNNAMED', + '--add-opens', 'jdk.management/com.sun.management.internal=ALL-UNNAMED', + ] testLogging { exceptionFormat = 'full' } useJUnitPlatform() } -task testReport(type: TestReport) { - destinationDir = file("$buildDir/reports/tests") - reportOn test -} - - apply from: 'gradle/liquibase.gradle' apply from: 'gradle/gatling.gradle' apply from: 'gradle/mapstruct.gradle' @@ -136,97 +149,63 @@ if (project.hasProperty('prod')) { apply from: 'gradle/profile_dev.gradle' } -if (project.hasProperty('graphite')) { - apply from: 'gradle/graphite.gradle' -} - //ext.moduleDescription = 'Management Portal application' ext.findbugAnnotationVersion = '3.0.2' dependencies { - - implementation("io.github.jhipster:jhipster:${jhipster_server_version}") { - exclude group: "org.springframework.boot", module: "spring-boot-autoconfigure" - } - implementation "io.dropwizard.metrics:metrics-core:${dropwizard_metrics_version}" - implementation "io.dropwizard.metrics:metrics-jcache:${dropwizard_metrics_version}" - implementation "io.dropwizard.metrics:metrics-jvm:${dropwizard_metrics_version}" - implementation "io.dropwizard.metrics:metrics-servlet:${dropwizard_metrics_version}" - implementation "io.dropwizard.metrics:metrics-json:${dropwizard_metrics_version}" - implementation "io.dropwizard.metrics:metrics-servlets:${dropwizard_metrics_version}" - implementation("net.logstash.logback:logstash-logback-encoder:${logstash_logback_encoder_version}") { - exclude(group: 'ch.qos.logback') - } - implementation "com.fasterxml.jackson.datatype:jackson-datatype-json-org:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.datatype:jackson-datatype-hppc:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-csv:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.core:jackson-annotations:${jackson_dataformat_version}" - implementation "com.fasterxml.jackson.core:jackson-databind:${jackson_version}" - implementation("com.ryantenney.metrics:metrics-spring:${metrics_spring_version}") - implementation "com.hazelcast:hazelcast" - implementation "com.hazelcast:hazelcast-hibernate52:${hazelcast_hibernate52_version}" - implementation "com.hazelcast:hazelcast-spring" - implementation "javax.cache:cache-api" - implementation "org.hibernate:hibernate-core:${hibernate_version}" - implementation("com.zaxxer:HikariCP:${hikaricp_version}") - implementation "org.apache.commons:commons-lang3:${commons_lang_version}" - implementation "commons-io:commons-io:${commons_io_version}" - implementation "javax.transaction:javax.transaction-api" - implementation group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1' + implementation("tech.jhipster:jhipster-framework:${jhipster_server_version}") + implementation("tech.jhipster:jhipster-dependencies:${jhipster_server_version}") + implementation("io.micrometer:micrometer-core") + runtimeOnly "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" + implementation "com.fasterxml.jackson.datatype:jackson-datatype-hibernate5" + implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-csv" + implementation "com.fasterxml.jackson.core:jackson-annotations" + implementation "com.fasterxml.jackson.core:jackson-databind" + implementation "com.hazelcast:hazelcast:${hazelcast_version}" + implementation "com.hazelcast:hazelcast-spring:${hazelcast_version}" + runtimeOnly "com.hazelcast:hazelcast-hibernate53" + runtimeOnly("com.zaxxer:HikariCP:${hikaricp_version}") implementation group: 'com.google.code.findbugs', name: 'jsr305', version: findbugAnnotationVersion - implementation "org.hibernate:hibernate-envers:${hibernate_version}" - implementation "org.hibernate:hibernate-validator:6.2.0.Final" implementation("org.liquibase:liquibase-core:${liquibase_version}") - implementation "com.mattbertolini:liquibase-slf4j:${liquibase_slf4j_version}" + runtimeOnly "com.mattbertolini:liquibase-slf4j:${liquibase_slf4j_version}" implementation "org.springframework.boot:spring-boot-starter-actuator" implementation "org.springframework.boot:spring-boot-autoconfigure" - implementation "org.springframework.boot:spring-boot-loader-tools" implementation "org.springframework.boot:spring-boot-starter-mail" - implementation "org.springframework.boot:spring-boot-starter-logging" - implementation "org.springframework.boot:spring-boot-starter-aop" - implementation ("org.springframework.boot:spring-boot-starter-data-jpa") { + runtimeOnly "org.springframework.boot:spring-boot-starter-logging" + runtimeOnly ("org.springframework.boot:spring-boot-starter-data-jpa") { exclude group: 'org.hibernate', module: 'hibernate-entitymanager' } - implementation "org.springframework.boot:spring-boot-starter-security" - implementation("org.springframework.cloud:spring-cloud-starter-netflix-zuul") { - exclude group: "org.springframework.boot", module: "spring-boot-autoconfigure" - } - implementation "org.springframework.cloud:spring-cloud-context" - implementation "org.springframework.cloud:spring-cloud-commons" + implementation "org.hibernate:hibernate-core" + implementation "org.hibernate:hibernate-envers" + implementation 'org.hibernate:hibernate-validator:8.0.0.Final' + + runtimeOnly "org.postgresql:postgresql:${postgresql_version}" + runtimeOnly "org.hsqldb:hsqldb:${hsqldb_version}" + + runtimeOnly "org.springframework.boot:spring-boot-starter-security" + implementation "org.springframework.security:spring-security-data" + implementation("org.springframework.boot:spring-boot-starter-web") { exclude module: 'spring-boot-starter-tomcat' } implementation "org.springframework.boot:spring-boot-starter-undertow" implementation "org.springframework.boot:spring-boot-starter-thymeleaf" implementation("org.springframework:spring-context-support") - implementation("org.springframework:spring-jdbc") - implementation "org.springframework.security:spring-security-config" - implementation "org.springframework.security:spring-security-data" - implementation ("org.springframework.security:spring-security-web") { - exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' - } - implementation "org.springframework.cloud:spring-cloud-starter-security" - implementation("org.springframework.cloud:spring-cloud-starter-oauth2") { - exclude group: "org.springframework.boot", module: "spring-boot-autoconfigure" - exclude group: "org.springframework.security.oauth", module: "spring-security-oauth2" - } - implementation("org.springframework.security.oauth:spring-security-oauth2:2.3.5.RELEASE") - implementation("io.springfox:springfox-swagger2:${springfox_version}") { - exclude module: 'mapstruct' - } - implementation "io.springfox:springfox-bean-validators:${springfox_version}" - implementation "org.postgresql:postgresql:${postgresql_version}" - implementation "com.h2database:h2" - implementation project(path: ':radar-auth', configuration: 'shadow') - implementation "org.springframework.data:spring-data-envers:${spring_data_envers_version}" + implementation("org.springframework.session:spring-session-hazelcast") + + implementation('org.springframework.security.oauth:spring-security-oauth2:2.5.2.RELEASE') + implementation('org.springframework.security:spring-security-web:5.7.5') + implementation "org.springdoc:springdoc-openapi-ui:${springdoc_version}" + runtimeOnly("javax.inject:javax.inject:1") + implementation project(':radar-auth') + implementation "org.springframework.data:spring-data-envers" + runtimeOnly("jakarta.xml.bind:jakarta.xml.bind-api:${javax_xml_bind_version}") runtimeOnly("org.glassfish.jaxb:jaxb-core:${javax_jaxb_core_version}") runtimeOnly("org.glassfish.jaxb:jaxb-runtime:${javax_jaxb_runtime_version}") runtimeOnly("javax.activation:activation:${javax_activation}") + runtimeOnly 'org.javassist:javassist:3.29.2-GA' - testImplementation "org.awaitility:awaitility:${awaitility_version}" testImplementation "com.jayway.jsonpath:json-path" testImplementation ("org.springframework.boot:spring-boot-starter-test") { exclude group: "com.vaadin.external.google", module:"android-json" @@ -237,7 +216,7 @@ dependencies { testImplementation "org.springframework.boot:spring-boot-test" testImplementation "org.assertj:assertj-core:${assertj_version}" testImplementation "org.junit.jupiter:junit-jupiter-api" - testImplementation "org.mockito:mockito-core" + testImplementation "org.mockito:mockito-core:$mockito_version" testImplementation "com.mattbertolini:liquibase-slf4j:${liquibase_slf4j_version}" testImplementation "org.hamcrest:hamcrest-library" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine" @@ -247,7 +226,11 @@ dependencies { dependencyManagement { imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR9" + mavenBom "com.fasterxml.jackson:jackson-bom:$jackson_version" + mavenBom "org.springframework:spring-framework-bom:$spring_framework_version" + mavenBom "org.springframework.boot:spring-boot-dependencies:$spring_boot_version" + mavenBom "org.springframework.data:spring-data-bom:$spring_data_version" + mavenBom "org.springframework.session:spring-session-bom:$spring_session_version" } } @@ -260,7 +243,7 @@ task cleanResources(type: Delete) { } wrapper { - gradleVersion '6.7.1' + gradleVersion '8.0.2' } task stage(dependsOn: 'bootWar') { @@ -276,15 +259,6 @@ task ghPagesOpenApiSpec(type: Copy) { into file("$rootDir/public/apidoc") } -if (project.hasProperty('nodeInstall')) { - node { - version = "${node_version}" - npmVersion = "${npm_version}" - yarnVersion = "${yarn_version}" - download = true - } -} - compileJava.dependsOn processResources processResources.dependsOn cleanResources, bootBuildInfo bootBuildInfo.mustRunAfter cleanResources @@ -333,9 +307,6 @@ class TimingsListener implements TaskExecutionListener, BuildListener { } } - @Override - void buildStarted(Gradle gradle) {} - @Override void projectsEvaluated(Gradle gradle) {} @@ -349,3 +320,14 @@ if (project.hasProperty('dev')) { gradle.addListener new TimingsListener() } +def isNonStable = { String version -> + def stableKeyword = ["RELEASE", "FINAL", "GA"].any { version.toUpperCase().contains(it) } + def regex = /^[0-9,.v-]+(-r)?$/ + return !stableKeyword && !(version ==~ regex) +} + +tasks.named("dependencyUpdates").configure { + rejectVersionIf { + isNonStable(it.candidate.version) + } +} diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 2f47a7c21..d2528c77b 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -27,6 +27,11 @@ + + + + + @@ -39,10 +44,6 @@ - - - - @@ -51,9 +52,7 @@ - - - + @@ -206,14 +205,16 @@ - - + - + + + + + - diff --git a/config/pmd/ruleset.xml b/config/pmd/ruleset.xml index 9c77e849c..5d0490655 100644 --- a/config/pmd/ruleset.xml +++ b/config/pmd/ruleset.xml @@ -42,6 +42,7 @@ + @@ -58,12 +59,13 @@ - + + @@ -72,7 +74,7 @@ - + diff --git a/config/pmd/test_ruleset.xml b/config/pmd/test_ruleset.xml index 8e6114085..76502b9df 100644 --- a/config/pmd/test_ruleset.xml +++ b/config/pmd/test_ruleset.xml @@ -56,7 +56,7 @@ - + @@ -67,6 +67,7 @@ + @@ -75,7 +76,7 @@ - + diff --git a/cypress.json b/cypress.json index c5360df20..eaba6b9c8 100644 --- a/cypress.json +++ b/cypress.json @@ -1,9 +1,10 @@ { "integrationFolder": "src/test/javascript/e2e/cypress/integration", "supportFile": false, - "videosFolder": "src/test/javascript/e2e/cypress/videos", + "video": false, + "experimentalSessionSupport": true, "screenshotsFolder": "src/test/javascript/e2e/cypress/screenshots", "pluginsFile": false, "fixturesFolder": false, "baseUrl": "http://localhost:9000" -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index 46d79f5d6..3f077e311 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,39 +1,31 @@ rootProject.name=management-portal profile=dev -assertj_version=3.6.2 -awaitility_version=2.0.0 -commons_lang_version=3.7 -commons_io_version=2.6 -# Overridden to get metrics-jcache -dropwizard_metrics_version=3.2.2 -logstash_logback_encoder_version=4.9 -javax_transaction_version=3.9.1 -jaxb_version=2.3.4 -json_path_version=0.9.1 -jhipster_server_version=1.1.2 -hazelcast_hibernate52_version=1.2 -hibernate_version=5.2.12.Final -hikaricp_version=3.4.5 -liquibase_slf4j_version=4.0.0 -liquibase_version=4.3.0 -metrics_spring_version=3.1.3 -node_version=6.10.0 -npm_version=4.3.0 -prometheus_simpleclient_version=0.0.20 -postgresql_version=42.2.14 -springfox_version=2.6.1 -spring_boot_version=2.3.7.RELEASE -gatling_version=3.3.1 -mapstruct_version=1.3.1.Final -undertow_version=1.4.10.Final -yarn_version=0.21.3 -spring_data_envers_version=2.0.4.RELEASE -jackson_version=2.9.10 -jackson_dataformat_version=2.9.10 +assertj_version=3.23.1 +jhipster_server_version=7.9.3 +hazelcast_version=5.2.0 +hikaricp_version=5.0.1 +liquibase_slf4j_version=4.1.0 +liquibase_version=4.17.2 +postgresql_version=42.5.0 +springdoc_version=1.6.12 +spring_boot_version=2.7.9 +spring_framework_version=5.3.23 +spring_data_version=2021.2.5 +spring_session_version=2021.2.0 +gatling_version=3.8.4 +mapstruct_version=1.5.3.Final +jackson_version=2.14.0 javax_xml_bind_version=2.3.3 javax_jaxb_core_version=2.3.0.1 javax_jaxb_runtime_version=2.3.4 javax_activation=1.1.1 +mockito_version=4.8.1 +slf4j_version=2.0.3 +logback_version=1.4.4 +oauth_jwt_version=4.2.1 +junit_version=5.9.1 +okhttp_version=4.10.0 +hsqldb_version=2.7.1 kotlin.code.style=official org.gradle.vfs.watch=true @@ -53,7 +45,7 @@ org.gradle.vfs.watch=true ## Default value: -Xmx1024m -XX:MaxPermSize=256m ## un comment the below line to override the daemon defaults -org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 ## When configured, Gradle will run in incubating parallel mode. ## This option should only be used with decoupled projects. More details, visit diff --git a/gradle/gatling.gradle b/gradle/gatling.gradle index 9c3a49e93..371bec29c 100644 --- a/gradle/gatling.gradle +++ b/gradle/gatling.gradle @@ -12,21 +12,21 @@ sourceSets { } dependencies { - gatlingCompile "io.gatling.highcharts:gatling-charts-highcharts:${gatling_version}" + gatlingImplementation "io.gatling.highcharts:gatling-charts-highcharts:${gatling_version}" } //noinspection GroovyAssignabilityCheck tasks.withType(ScalaCompile) { - scalaClasspath = scalaRuntime.inferScalaClasspath(configurations.gatlingCompile) + scalaClasspath = scalaRuntime.inferScalaClasspath(configurations.gatlingCompileClasspath) } task manifestJar(type: Jar) { - from configurations.gatlingCompile + from configurations.gatlingRuntimeClasspath archiveFileName.set 'gatlingBooter.jar' doFirst { manifest { // uri is just needed for Windows-compatibility - attributes 'Class-Path': configurations.gatlingCompile.files.collect{ project.uri(it) }.join(' ') + attributes 'Class-Path': configurations.gatlingCompileClasspath.files.collect{ project.uri(it) }.join(' ') } } } @@ -49,17 +49,14 @@ tasks.addRule("Pattern: gatlingRun") { String taskName -> final def sourceSet = sourceSets.gatling classpath sourceSet.output + files(manifestJar.archiveFile) + files("${gatlingSrc}/resources") - main = "io.gatling.app.Gatling" + mainClass.set("io.gatling.app.Gatling") environment GATLING_HOME:'' def className = taskName - 'gatlingRun' - args '-df', "${gatlingSrc}/data" args '-rf', "${project.buildDir.absolutePath}/reports/gatling" - args '-bdf', "${gatlingSrc}/bodies" args '-sf', gatlingSimulations - args '-m' args '-s', className } } diff --git a/gradle/graphite.gradle b/gradle/graphite.gradle deleted file mode 100644 index 975b5493e..000000000 --- a/gradle/graphite.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - implementation "io.dropwizard.metrics:metrics-graphite" -} diff --git a/gradle/liquibase.gradle b/gradle/liquibase.gradle index 777795037..0d16cec86 100644 --- a/gradle/liquibase.gradle +++ b/gradle/liquibase.gradle @@ -11,7 +11,7 @@ dependencies { if (OperatingSystem.current().isWindows()) { task pathingLiquibaseJar(type: Jar) { dependsOn configurations.liquibase - appendix = 'pathingLiquibase' + archiveAppendix.set('pathingLiquibase') doFirst { manifest { @@ -36,7 +36,7 @@ task liquibaseDiffChangelog(dependsOn: compileJava, type: JavaExec) { classpath sourceSets.main.runtimeClasspath classpath configurations.liquibase } - main = "liquibase.integration.commandline.Main" + mainClass.set('liquibase.integration.commandline.Main') args "--changeLogFile=src/main/resources/config/liquibase/changelog/" + buildTimestamp() +"_changelog.xml" args "--referenceUrl=hibernate:spring:org.radarbase.management.domain?dialect=org.hibernate.dialect.PostgreSQLDialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" @@ -53,8 +53,6 @@ task liquibaseDiffChangelog(dependsOn: compileJava, type: JavaExec) { args "--excludeObjects=oauth_access_token, oauth_approvals, oauth_client_details, oauth_client_token, oauth_code, oauth_refresh_token" } -def buildTimestamp() { - def date = new Date() - def formattedDate = date.format('yyyyMMddHHmmss') - return formattedDate +static def buildTimestamp() { + return new Date().format('yyyyMMddHHmmss') } diff --git a/gradle/mapstruct.gradle b/gradle/mapstruct.gradle index 01437dacf..b267a55f5 100644 --- a/gradle/mapstruct.gradle +++ b/gradle/mapstruct.gradle @@ -1,5 +1,5 @@ dependencies { - implementation group: 'org.mapstruct', name: 'mapstruct-jdk8', version: mapstruct_version + implementation group: 'org.mapstruct', name: 'mapstruct', version: mapstruct_version annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: mapstruct_version } diff --git a/gradle/openapi.gradle b/gradle/openapi.gradle index 0f7e88515..e9edeb934 100644 --- a/gradle/openapi.gradle +++ b/gradle/openapi.gradle @@ -2,12 +2,12 @@ apply plugin: 'de.undercouch.download' task generateOpenApiSpec(type: Download) { description = "Fetch the OpenAPI spec from the Swagger endpoint. The application needs to be running at http://localhost:8080/." - src 'http://localhost:8080/v2/api-docs' + src 'http://localhost:8080/api-docs' dest file('build/swagger-spec/swagger.json') } task generateOpenApiSpecProd(type: Download) { description = "Fetch the OpenAPI spec from the Swagger endpoint. The application needs to be running at http://localhost:8080/." - src 'http://localhost:8080/managementportal/v2/api-docs' + src 'http://localhost:8080/managementportal/api-docs' dest file('build/swagger-spec/swagger.json') } diff --git a/gradle/profile_dev.gradle b/gradle/profile_dev.gradle index 508a864ff..d10e3d7d2 100644 --- a/gradle/profile_dev.gradle +++ b/gradle/profile_dev.gradle @@ -1,19 +1,20 @@ apply plugin: 'org.springframework.boot' -apply plugin: 'com.moowork.node' +apply plugin: 'com.github.node-gradle.node' -ext.logbackLoglevel = 'DEBUG' +ext.logbackLoglevel = 'TRACE' dependencies { implementation "org.springframework.boot:spring-boot-devtools" } -def profiles = 'dev' +def profiles = 'dev,api-docs' if (project.hasProperty('no-liquibase')) { profiles += ',no-liquibase' } bootRun { args = [] + systemProperty "spring.profiles.active", profiles } task webpackBuildDev(type: YarnTask) { @@ -35,7 +36,7 @@ processResources { it.replace('#spring.profiles.active#', profiles) } filter { - it.replace('#project.version#', version) + it.replace('#project.version#', project.version) } } } diff --git a/gradle/profile_prod.gradle b/gradle/profile_prod.gradle index 5f33f41be..870e76f8b 100644 --- a/gradle/profile_prod.gradle +++ b/gradle/profile_prod.gradle @@ -1,5 +1,5 @@ apply plugin: 'org.springframework.boot' -apply plugin: 'com.moowork.node' +apply plugin: 'com.github.node-gradle.node' ext.logbackLoglevel = 'INFO' @@ -9,12 +9,13 @@ if (project.hasProperty('no-liquibase')) { profiles += ',no-liquibase' } -if (project.hasProperty('swagger')) { - profiles += ',swagger' +if (project.hasProperty('api-docs')) { + profiles += ',api-docs' } bootRun { args = [] + systemProperty "spring.profiles.active", profiles } task webpack(type: YarnTask, dependsOn: 'yarn_install') { diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle index b8d3fc344..e2db4e754 100644 --- a/gradle/publishing.gradle +++ b/gradle/publishing.gradle @@ -6,11 +6,7 @@ apply from: "$rootDir/gradle/artifacts.gradle" publishing { publications { mavenJar(MavenPublication) { publication -> - if (project.hasProperty("isShadowed") && isShadowed) { - project.shadow.component(publication) - } else { - from components.java - } + from components.java artifact sourcesJar artifact javadocJar @@ -71,5 +67,5 @@ signing { } tasks.withType(Sign).configureEach { - onlyIf { gradle.taskGraph.hasTask("${project.path}:publish") } + onlyIf { gradle.taskGraph.hasTask(project.tasks["publish"]) } } diff --git a/gradle/style.gradle b/gradle/style.gradle index 5808f1d2a..b00e0ac32 100644 --- a/gradle/style.gradle +++ b/gradle/style.gradle @@ -1,17 +1,8 @@ apply plugin: 'checkstyle' apply plugin: 'pmd' -apply plugin: 'jacoco' - -configurations { - codacy -} - -dependencies { - codacy group: 'com.codacy', name: 'codacy-coverage-reporter', version: codacyVersion -} checkstyle { - toolVersion = '8.7' + toolVersion = '9.2' ignoreFailures = false maxWarnings = 0 @@ -19,7 +10,7 @@ checkstyle { } pmd { - toolVersion = '6.12.0' + toolVersion = '6.41.0' ignoreFailures = false consoleOutput = true @@ -31,18 +22,3 @@ pmd { pmdTest { ruleSetFiles = rootProject.files("config/pmd/test_ruleset.xml") } - -jacocoTestReport { - reports { - xml.enabled true - csv.enabled false - html.enabled true - } - dependsOn test -} - -task sendCoverageToCodacy(type: JavaExec, dependsOn: jacocoTestReport) { - main = 'com.codacy.CodacyCoverageReporter' - classpath = configurations.codacy - args = ['report', '-l', 'Java', '-r', "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"] -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c02..ccebba771 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 966055ef8..bdc9a83b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -org.gradle.parallel=true diff --git a/gradlew b/gradlew index 4f906e0c8..79a61d421 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd32c..93e3f59f1 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/managementportal-client/build.gradle b/managementportal-client/build.gradle index ecaa47d3c..4079955ff 100644 --- a/managementportal-client/build.gradle +++ b/managementportal-client/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + /* * Copyright (c) 2020. The Hyve * @@ -7,8 +9,8 @@ * See the file LICENSE in the root of this repository. */ plugins { - id 'org.jetbrains.kotlin.jvm' version "1.5.30" - id 'org.jetbrains.dokka' version "1.5.0" + id 'org.jetbrains.kotlin.jvm' version "1.7.20" + id 'org.jetbrains.dokka' version "1.7.20" id 'maven-publish' } @@ -17,44 +19,33 @@ targetCompatibility = JavaVersion.VERSION_11 description = "Kotlin ManagementPortal client" -repositories { - mavenCentral() -} - -ext { - jacksonModuleVersion = "2.12.5" - okhttpVersion = "4.9.1" - junitVersion = "5.7.2" -} - dependencies { - api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30") - implementation("org.jetbrains.kotlin:kotlin-reflect:1.5.30") + api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20") + implementation("org.jetbrains.kotlin:kotlin-reflect:1.7.20") api(project(":oauth-client-util")) - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttpVersion + implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp_version - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonModuleVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonModuleVersion") - runtimeOnly("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonModuleVersion") + implementation(platform("com.fasterxml.jackson:jackson-bom:$jackson_version")) + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + runtimeOnly("com.fasterxml.jackson.datatype:jackson-datatype-jdk8") - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junitVersion + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.27.2' - testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.12.4' + testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito_version testImplementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2' - testRuntimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.32' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitVersion - testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonModuleVersion") - - dokkaHtmlPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.5.0") + testRuntimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junit_version + testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin") } -compileKotlin { +tasks.withType(KotlinCompile) { kotlinOptions { jvmTarget = "11" - apiVersion = "1.5" - languageVersion = "1.5" + apiVersion = "1.6" + languageVersion = "1.6" } } @@ -70,7 +61,6 @@ test { useJUnitPlatform() } -ext.isShadowed = false ext.projectLanguage = "kotlin" ext.publishToMavenCentral = true diff --git a/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPClient.kt b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPClient.kt index 77ffa60bc..8f5e2c5af 100644 --- a/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPClient.kt +++ b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPClient.kt @@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectReader import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.jsonMapper import com.fasterxml.jackson.module.kotlin.kotlinModule import okhttp3.HttpUrl @@ -48,7 +49,7 @@ class MPClient( serializationInclusion(JsonInclude.Include.NON_NULL) addModule(JavaTimeModule()) addModule(kotlinModule { - nullIsSameAsDefault(true) + enable(KotlinFeature.NullIsSameAsDefault) }) configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) @@ -61,6 +62,7 @@ class MPClient( .readTimeout(30, TimeUnit.SECONDS) .build() + private val organizationListReader: ObjectReader by lazy { this.objectMapper.readerForListOf(MPOrganization::class.java) } private val projectListReader: ObjectReader by lazy { this.objectMapper.readerForListOf(MPProject::class.java) } private val subjectListReader: ObjectReader by lazy { this.objectMapper.readerForListOf(MPSubject::class.java) } private val clientListReader: ObjectReader by lazy { this.objectMapper.readerForListOf(MPOAuthClient::class.java) } @@ -78,13 +80,26 @@ class MPClient( val validToken: OAuth2AccessTokenDetails get() = oauth2Client.validToken + /** Request list of organizations from ManagementPortal */ + fun requestOrganizations( + page: Int = 0, + size: Int = Int.MAX_VALUE, + ): List = request( + reader = organizationListReader, + urlBuilder = { + addPathSegments("api/organizations") + addQueryParameter("page", page.toString()) + addQueryParameter("size", size.toString()) + } + ) + /** Request list of projects from ManagementPortal. */ fun requestProjects( page: Int = 0, size: Int = Int.MAX_VALUE, ): List = request( - projectListReader, - { + reader = projectListReader, + urlBuilder = { addPathSegments("api/projects") addQueryParameter("page", page.toString()) addQueryParameter("size", size.toString()) @@ -99,8 +114,8 @@ class MPClient( page: Int = 0, size: Int = Int.MAX_VALUE, ): List = request>( - subjectListReader, - { + reader = subjectListReader, + urlBuilder = { addPathSegments("api/projects/$projectId/subjects") addQueryParameter("page", page.toString()) addQueryParameter("size", size.toString()) @@ -114,8 +129,8 @@ class MPClient( page: Int = 0, size: Int = Int.MAX_VALUE, ): List = request( - clientListReader, - { + reader = clientListReader, + urlBuilder = { addPathSegments("api/oauth-clients") addQueryParameter("page", page.toString()) addQueryParameter("size", size.toString()) diff --git a/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPOrganization.kt b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPOrganization.kt new file mode 100644 index 000000000..8adadce28 --- /dev/null +++ b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPOrganization.kt @@ -0,0 +1,14 @@ +package org.radarbase.management.client + +import com.fasterxml.jackson.annotation.JsonProperty + +/** ManagementPortal Project DTO. */ +data class MPOrganization( + /** Organization id, a name that identifies it uniquely. */ + @JsonProperty("name") val id: String, + /** Where a project is organized. */ + val location: String? = null, + /** Project description. */ + val description: String? = null, + val projects: List = emptyList(), +) diff --git a/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPProject.kt b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPProject.kt index 986f593cd..064891568 100644 --- a/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPProject.kt +++ b/managementportal-client/src/main/kotlin/org/radarbase/management/client/MPProject.kt @@ -12,7 +12,7 @@ data class MPProject( /** Where a project is organized. */ val location: String? = null, /** Organization that organizes the project. */ - val organization: String? = null, + val organization: MPOrganization? = null, /** Project description. */ val description: String? = null, /** Any other attributes. */ diff --git a/managementportal-client/src/test/kotlin/org/radarbase/management/client/MPClientTest.kt b/managementportal-client/src/test/kotlin/org/radarbase/management/client/MPClientTest.kt index d3fa47599..e16677649 100644 --- a/managementportal-client/src/test/kotlin/org/radarbase/management/client/MPClientTest.kt +++ b/managementportal-client/src/test/kotlin/org/radarbase/management/client/MPClientTest.kt @@ -145,7 +145,7 @@ class MPClientTest { "projectName": "p2", "humanReadableProjectName": "P2", "description": "d2", - "organization": "Mixed", + "organization": {"id": 1, "name": "Mixed"}, "location": "here", "startDate": "2021-06-07T02:02:00Z", "projectStatus": "ONGOING", @@ -184,7 +184,7 @@ class MPClientTest { id = "p2", name = "P2", description = "d2", - organization = "Mixed", + organization = MPOrganization(id = "Mixed"), location = "here", startDate = ZonedDateTime.of(2021, 6, 7, 2, 2, 0, 0, ZoneId.of("UTC")), projectStatus = "ONGOING", diff --git a/oauth-client-util/build.gradle b/oauth-client-util/build.gradle index 51c2daa73..5a3390cc4 100644 --- a/oauth-client-util/build.gradle +++ b/oauth-client-util/build.gradle @@ -1,28 +1,20 @@ -ext.jacksonVersion = '2.11.3' -ext.jacksonYamlVersion = '2.11.3' -ext.okhttpVersion = '4.9.1' -ext.junitVersion ='5.7.2' - sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 description = 'This library can be used by client applications that want to use the client_credentials OAuth2 flow. It will manage getting the token and renewing it when necessary.' -repositories { - mavenCentral() -} - dependencies { - implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttpVersion - implementation group: 'com.fasterxml.jackson.core' , name: 'jackson-databind' , version: jacksonVersion - implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonYamlVersion + implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp_version + implementation(platform("com.fasterxml.jackson:jackson-bom:$jackson_version")) + implementation group: 'com.fasterxml.jackson.core' , name: 'jackson-databind' + implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml' - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junitVersion + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.27.2' - testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.25.1' - testImplementation 'org.glassfish.jersey.core:jersey-common:2.28' - testRuntimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.26' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitVersion + testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito_version + testImplementation 'org.glassfish.jersey.core:jersey-common:3.1.0' + testRuntimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junit_version } test { @@ -37,7 +29,6 @@ task ghPagesJavadoc(type: Copy, dependsOn: javadoc) { into file("$rootDir/public/oauth-client-util-javadoc") } -ext.isShadowed = false ext.projectLanguage = "java" apply from: '../gradle/style.gradle' diff --git a/oauth-client-util/src/main/java/org/radarbase/oauth/OAuth2Client.java b/oauth-client-util/src/main/java/org/radarbase/oauth/OAuth2Client.java index 568255539..f9bc5aa7d 100644 --- a/oauth-client-util/src/main/java/org/radarbase/oauth/OAuth2Client.java +++ b/oauth-client-util/src/main/java/org/radarbase/oauth/OAuth2Client.java @@ -14,7 +14,6 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import okhttp3.ResponseBody; import org.radarbase.exception.TokenException; /** @@ -131,12 +130,11 @@ public OAuth2AccessTokenDetails refreshToken() throws TokenException { // make the client execute the POST request try (Response response = httpClient.newCall(request).execute()) { if (response.isSuccessful()) { - ResponseBody responseBody = response.body(); - if (responseBody == null) { + if (response.body() == null) { throw new TokenException("No response from server"); } OAuth2AccessTokenDetails localToken = OAuth2AccessTokenDetails.getObject( - responseBody.string()); + response.body().string()); synchronized (this) { token = localToken; diff --git a/oauth-client-util/src/test/java/org/radarbase/oauth/unit/OAuth2ClientTest.java b/oauth-client-util/src/test/java/org/radarbase/oauth/unit/OAuth2ClientTest.java index 9b847b7e9..7f9cbd34b 100644 --- a/oauth-client-util/src/test/java/org/radarbase/oauth/unit/OAuth2ClientTest.java +++ b/oauth-client-util/src/test/java/org/radarbase/oauth/unit/OAuth2ClientTest.java @@ -13,7 +13,7 @@ import org.radarbase.oauth.OAuth2AccessTokenDetails; import org.radarbase.oauth.OAuth2Client; -import javax.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.HttpHeaders; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; diff --git a/package.json b/package.json index f42288ef8..8aafcdc32 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,40 @@ { "name": "management-portal", - "version": "0.8.2", + "version": "2.0", "description": "Description for ManagementPortal", "private": true, "cacheDirectories": [ "node_modules" ], "dependencies": { - "@angular/animations": "~12.2.0", - "@angular/common": "~12.2.0", - "@angular/compiler": "~12.2.0", - "@angular/core": "~12.2.0", - "@angular/forms": "~12.2.0", - "@angular/localize": "~12.2.0", - "@angular/platform-browser": "~12.2.0", - "@angular/platform-browser-dynamic": "~12.2.0", - "@angular/router": "~12.2.0", + "@angular/animations": "^12.2.12", + "@angular/common": "^12.2.12", + "@angular/core": "^12.2.12", + "@angular/forms": "^12.2.12", + "@angular/localize": "^12.2.12", + "@angular/platform-browser": "^12.2.12", + "@angular/platform-browser-dynamic": "^12.2.12", + "@angular/router": "^12.2.12", "@ng-bootstrap/ng-bootstrap": "^10.0.0", "@ngx-translate/core": "13.0.0", "@ngx-translate/http-loader": "6.0.0", - "angularx-qrcode": "^11.0.0", - "bootstrap": "4.6.0", - "core-js": "2.4.1", + "bootstrap": "^4.6.1", "font-awesome": "4.7.0", "jquery": "3.5.0", "material-design-icons": "^3.0.1", + "ng-qrcode": "^5.2.0", "ngx-cookie-service": "^12.0.3", "ngx-webstorage": "^8.0.0", - "popper.js": "^1.16.1", "rxjs": "~6.6.0", - "swagger-ui": "2.2.10", "tslib": "^2.3.0", "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-builders/custom-webpack": "^12.1.0", - "@angular-devkit/build-angular": "~12.2.1", - "@angular/cli": "~12.2.1", - "@angular/compiler-cli": "~12.2.0", + "@angular-builders/custom-webpack": "^12.1.3", + "@angular-devkit/build-angular": "^12.2.12", + "@angular/cli": "^12.2.12", + "@angular/compiler": "^12.2.12", + "@angular/compiler-cli": "^12.2.12", "@cypress/schematic": "1.5.0", "@types/jasmine": "~3.8.0", "@types/node": "^12.11.1", @@ -51,7 +48,6 @@ "karma-notify-reporter": "^1.3.0", "lodash.merge": "^4.6.2", "merge-json-webpack-plugin": "^6.0.0", - "puppeteer": "^10.2.0", "rimraf": "2.6.1", "typescript": "~4.3.5", "wait-port": "^0.2.9" @@ -59,12 +55,15 @@ "engines": { "node": ">=14.14.0" }, + "resolutions": { + "ansi-regex": "5.0.1" + }, "scripts": { "lint": "ng lint", "lint:fix": "ng lint --fix=true", "cleanup": "rimraf build/", "start": "ng serve", - "build:prod": "yarn test && ng build --base-href /managementportal/", + "build:prod": "ng build --base-href /managementportal/ --configuration production", "build:dev": "ng build --configuration development", "test": "ng test --no-watch --no-progress --browsers=ChromeHeadlessCI", "test:watch": "ng test --watch --browsers=Chrome", @@ -72,5 +71,6 @@ "e2e-prod": "yarn run wait-for-managementportal-prod && ng e2e --configuration production", "wait-for-managementportal": "wait-port -t 240000 http://localhost:8080/management/health", "wait-for-managementportal-prod": "wait-port -t 240000 http://localhost:8080/managementportal/management/health" - } + }, + "packageManager": "yarn@3.1.0" } diff --git a/proxy.conf.json b/proxy.conf.json index 7c1047295..e4cb46524 100644 --- a/proxy.conf.json +++ b/proxy.conf.json @@ -4,9 +4,9 @@ "/oauth", "/api", "/management", - "/swagger-resources", - "/v2/api-docs", - "/h2-console" + "/api-docs", + "/swagger-ui.html", + "/swagger-ui" ], "target": "http://127.0.0.1:8080", "secure": false diff --git a/radar-auth/build.gradle b/radar-auth/build.gradle index 1d25bed3f..e19a4e760 100644 --- a/radar-auth/build.gradle +++ b/radar-auth/build.gradle @@ -1,64 +1,26 @@ -plugins { - id 'com.github.johnrengelman.shadow' version '6.1.0' -} - apply plugin: 'maven-publish' -ext { - jacksonVersion = '2.11.4' - jacksonYamlVersion = '2.11.4' - okhttpVersion = '4.9.1' - oauthJwtVersion = '3.12.0' - commonsCodecVersion = '1.15' - slf4jVersion = '1.7.30' - junitVersion ='5.6.3' -} - -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_11 +targetCompatibility = JavaVersion.VERSION_11 description = 'Library for authentication and authorization of JWT tokens issued by the RADAR platform' -repositories { - jcenter() - mavenLocal() -} - -configurations { - testImplementation.extendsFrom shadow -} - dependencies { - implementation project(path: ':radar-auth:deprecated-auth0', configuration: 'shadow') - shadow "commons-codec:commons-codec:$commonsCodecVersion" - - shadow group: 'com.auth0', name: 'java-jwt', version: oauthJwtVersion - shadow group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttpVersion + api group: 'com.auth0', name: 'java-jwt', version: oauth_jwt_version + api group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp_version - shadow group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion - shadow group: 'com.fasterxml.jackson.core' , name: 'jackson-databind' , version: jacksonVersion - shadow group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonYamlVersion + implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4j_version + implementation(platform("com.fasterxml.jackson:jackson-bom:$jackson_version")) + implementation group: 'com.fasterxml.jackson.core' , name: 'jackson-databind' + implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml' - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junitVersion + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.27.2' testImplementation group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.19.0' - testRuntimeOnly group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitVersion - -} - -shadowJar { - archiveClassifier.set(null) - conventionMapping.with { - map('classifier') { - null - } - } -} + testRuntimeOnly group: 'ch.qos.logback', name: 'logback-classic', version: logback_version + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junit_version -jar { - enabled = false } test { @@ -73,7 +35,6 @@ task ghPagesJavadoc(type: Copy, dependsOn: javadoc) { into file("$rootDir/public/radar-auth-javadoc") } -ext.isShadowed = true ext.projectLanguage = "java" apply from: "$rootDir/gradle/style.gradle" diff --git a/radar-auth/deprecated-auth0/build.gradle b/radar-auth/deprecated-auth0/build.gradle deleted file mode 100644 index 116569247..000000000 --- a/radar-auth/deprecated-auth0/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' -} - -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 - -repositories { - jcenter() -} - -dependencies { - implementation(group: 'com.auth0', name: 'java-jwt', version: '3.2.0') { - // declare dependencies in superpackage - transitive = false - } - implementation 'org.bouncycastle:bcprov-jdk15on:1.65' -} - -shadowJar { - relocate 'com.auth0.jwt', 'shadow.com.auth0.jwt' - relocate 'org.bouncycastle', 'shadow.org.bouncycastle' -} diff --git a/radar-auth/src/main/java/org/radarbase/auth/authentication/AlgorithmLoader.java b/radar-auth/src/main/java/org/radarbase/auth/authentication/AlgorithmLoader.java index ac8693aa5..a6de57b68 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/authentication/AlgorithmLoader.java +++ b/radar-auth/src/main/java/org/radarbase/auth/authentication/AlgorithmLoader.java @@ -13,12 +13,10 @@ import org.radarbase.auth.token.validation.ECTokenValidationAlgorithm; import org.radarbase.auth.token.validation.RSATokenValidationAlgorithm; import org.radarbase.auth.token.validation.TokenValidationAlgorithm; -import org.radarbase.auth.token.validation.deprecated.DeprecatedEcTokenValidationAlgorithm; public class AlgorithmLoader { private final List supportedAlgorithmsForWebKeySets; - private final List supportedAlgorithmsForPublicKeysInConfig; /** * Creates an instance of {@link AlgorithmLoader} with lists of @@ -26,26 +24,10 @@ public class AlgorithmLoader { * @param supportedAlgorithmsForWebKeySets default support. Algorithms to be supported for * public keys shared from public key endpoints as * {@link JavaWebKeySet}. - * @param supportedAlgorithmsForPublicKeysInConfig deprecated support. Algorithms to be - * supported for public keys configured in config file. */ - public AlgorithmLoader(List supportedAlgorithmsForWebKeySets, - List supportedAlgorithmsForPublicKeysInConfig) { + public AlgorithmLoader( + List supportedAlgorithmsForWebKeySets) { this.supportedAlgorithmsForWebKeySets = supportedAlgorithmsForWebKeySets; - this.supportedAlgorithmsForPublicKeysInConfig = supportedAlgorithmsForPublicKeysInConfig; - } - - /** - * Creates algorithm loader with default algorithms. - */ - @SuppressWarnings("deprecation") // still use deprecated ec tokens - public AlgorithmLoader() { - this(Arrays.asList( - new ECTokenValidationAlgorithm(), - new RSATokenValidationAlgorithm()), - Arrays.asList( - new DeprecatedEcTokenValidationAlgorithm(), - new RSATokenValidationAlgorithm())); } private Algorithm algorithmFromPublicKey(String publicKey) { @@ -65,17 +47,6 @@ private static Algorithm loadAlgorithmFromPublicKey( .getAlgorithm(publicKey); } - /** - * Loads algorithms using deprecated method. - * @param publicKey publicKeys to load algorithms. - * @return instance of {@link Algorithm}. - */ - public Algorithm loadDeprecatedAlgorithmFromPublicKey(String publicKey) { - // We deny to trust the public key if the reported algorithm is unknown to us - // https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ - return loadAlgorithmFromPublicKey(supportedAlgorithmsForPublicKeysInConfig, publicKey); - } - /** * Loads Algorithms from {@link JavaWebKeySet}. * @param publicKeyInfo java web key set to load algorithm. @@ -101,4 +72,11 @@ public static JWTVerifier buildVerifier(Algorithm algorithm, String audience) { .withAudience(audience) .build(); } + + /** Load the default algorithms, ECDSA and RSA. */ + public static List defaultAlgorithms() { + return Arrays.asList( + new ECTokenValidationAlgorithm(), + new RSATokenValidationAlgorithm()); + } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/authentication/TokenValidator.java b/radar-auth/src/main/java/org/radarbase/auth/authentication/TokenValidator.java index 14178c7a6..2049ac3b9 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/authentication/TokenValidator.java +++ b/radar-auth/src/main/java/org/radarbase/auth/authentication/TokenValidator.java @@ -4,7 +4,6 @@ import java.time.Duration; import java.time.Instant; import java.util.Collection; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -28,6 +27,7 @@ import org.radarbase.auth.security.jwk.JavaWebKeySet; import org.radarbase.auth.token.JwtRadarToken; import org.radarbase.auth.token.RadarToken; +import org.radarbase.auth.token.validation.TokenValidationAlgorithm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,29 +39,31 @@ * construction. */ public class TokenValidator { - private static final Logger LOGGER = LoggerFactory.getLogger(TokenValidator.class); - private final TokenValidatorConfig config; - private List verifiers = new LinkedList<>(); + private static final Duration FETCH_TIMEOUT_DEFAULT = Duration.ofMinutes(1); + private final TokenValidatorConfig config; // If a client presents a token with an invalid signature, it might be the keypair was changed. // In that case we need to fetch it again, but we don't want a malicious client to be able to // make us DOS our own identity server. Fetching it at maximum once per minute mitigates this. - private static final Duration FETCH_TIMEOUT_DEFAULT = Duration.ofMinutes(1); private final Duration fetchTimeout; - private Instant lastFetch = Instant.MIN; - private static final long DEFAULT_TIMEOUT = 30; - private final OkHttpClient client = new OkHttpClient.Builder() - .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .build(); + private final OkHttpClient client; + private final ObjectMapper mapper; + private final AlgorithmLoader algorithmLoader; - private final ObjectMapper mapper = new ObjectMapper(); + private List verifiers; + private Instant lastFetch = Instant.MIN; - private final AlgorithmLoader algorithmLoader = new AlgorithmLoader(); + private TokenValidator(Builder builder) { + this.mapper = builder.mapper; + this.fetchTimeout = builder.fetchTimeout; + this.client = builder.httpClient; + this.config = builder.config; + this.algorithmLoader = new AlgorithmLoader(builder.algorithms); + this.verifiers = builder.verifiers; + } /** * Default constructor. Will load the identity server configuration from a file called @@ -70,7 +72,7 @@ public class TokenValidator { * identity server for checking token signatures. */ public TokenValidator() { - this(TokenVerifierPublicKeyConfig.readFromFileOrClasspath(), FETCH_TIMEOUT_DEFAULT); + this(new Builder().verify()); } /** @@ -79,43 +81,7 @@ public TokenValidator() { * @param config The identity server configuration */ public TokenValidator(TokenValidatorConfig config) { - this(config, FETCH_TIMEOUT_DEFAULT); - } - - /** - * Constructor where TokenValidatorConfig can be passed instead of it being loaded from file. - * - * @param config The identity server configuration - * @param fetchTimeout timeout for retrying the public RSA key - */ - private TokenValidator(TokenValidatorConfig config, Duration fetchTimeout) { - this.fetchTimeout = fetchTimeout; - this.config = config; - } - - /** - * Constructor where TokenValidatorConfig can be passed instead of it being loaded from file. - * - * @param config The identity server configuration - * @param fetchTimeout timeout for retrying the public RSA key in seconds - * @deprecated Prefer {@link #TokenValidator(TokenValidatorConfig, Duration)} instead. - */ - @Deprecated - public TokenValidator(TokenValidatorConfig config, long fetchTimeout) { - this(config, Duration.ofSeconds(fetchTimeout)); - } - - - /** - * Added for testing verifications with known verifiers. - * @param verifiers knows verifiers that have signed the tokens for testing. - * @param config instance of {@link TokenValidatorConfig} for testing. - */ - @Deprecated - protected TokenValidator(List verifiers, TokenValidatorConfig config) { - this.config = config; - this.verifiers = verifiers; - this.fetchTimeout = Duration.ofHours(1); + this(new Builder().config(config).verify()); } /** @@ -138,10 +104,10 @@ public RadarToken validateAccessToken(String token) throws TokenValidationExcept private RadarToken validateAccessToken(String token, boolean tryRefresh) { List localVerifiers = getVerifiers(); + boolean signatureFailed = false; for (JWTVerifier verifier : localVerifiers) { try { DecodedJWT jwt = verifier.verify(token); - Map claims = jwt.getClaims(); // Do not print full token with signature to avoid exposing valid token in logs. @@ -156,22 +122,25 @@ private RadarToken validateAccessToken(String token, boolean tryRefresh) { return new JwtRadarToken(jwt); } catch (SignatureVerificationException sve) { LOGGER.debug("Client presented a token with an incorrect signature."); - if (tryRefresh) { - LOGGER.info("Trying to fetch public keys again..."); - try { - refresh(); - } catch (TokenValidationException ex) { - // Log and Continue with validation - LOGGER.warn("Could not fetch public keys.", ex); - } - return validateAccessToken(token, false); - } + signatureFailed = true; } catch (JWTVerificationException ex) { - LOGGER.debug("Verifier {} with implementation {} did not accept token {}", - verifier.toString(), verifier.getClass().toString(), token); + LOGGER.debug("Verifier {} with implementation {} did not accept token", + verifier, verifier.getClass()); + } + } + if (signatureFailed && tryRefresh) { + LOGGER.info("Trying to fetch public keys again..."); + try { + refresh(); + } catch (TokenValidationException ex) { + // Log and Continue with validation + LOGGER.warn("Could not fetch public keys.", ex); } + return validateAccessToken(token, false); + } else { + throw new TokenValidationException( + "No registered validator could authenticate this token"); } - throw new TokenValidationException("No registered validator could authenticate this token"); } private List getVerifiers() { @@ -214,16 +183,10 @@ private List loadVerifiers() throws TokenValidationException { lastFetch = Instant.now(); } - Stream endpointKeys = streamEmptyIfNull(config.getPublicKeyEndpoints()) + return streamEmptyIfNull(config.getPublicKeyEndpoints()) .map(this::algorithmFromServerPublicKeyEndpoint) .filter(Objects::nonNull) - .flatMap(List::stream); - - Stream stringKeys = streamEmptyIfNull(config.getPublicKeys()) - .map(algorithmLoader::loadDeprecatedAlgorithmFromPublicKey); - - // Create a verifier for each signature verification algorithm we created - return Stream.concat(endpointKeys, stringKeys) + .flatMap(List::stream) .map(alg -> AlgorithmLoader.buildVerifier(alg, config.getResourceName())) .collect(Collectors.toList()); } @@ -236,20 +199,19 @@ private List algorithmFromServerPublicKeyEndpoint(URI serverUri) thro .url(serverUri.toURL()) .header("Accept", "application/json") .build(); - Response response = client.newCall(request).execute(); - if (response.isSuccessful() && response.body() != null) { - JavaWebKeySet publicKeyInfo = mapper.readValue(response.body().string(), - JavaWebKeySet.class); - response.close(); - LOGGER.debug("Processing {} public keys from public-key endpoint {}", publicKeyInfo - .getKeys().size(), serverUri.toURL()); - return algorithmLoader.loadAlgorithmsFromJavaWebKeys(publicKeyInfo); - } else { - // Log and Continue Pulling next Endpoints, if any - LOGGER.warn("Could not load newer public keys from {}", serverUri.toURL()); - return null; + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + JavaWebKeySet publicKeyInfo = mapper.readValue(response.body().string(), + JavaWebKeySet.class); + LOGGER.debug("Processing {} public keys from public-key endpoint {}", + publicKeyInfo.getKeys().size(), serverUri.toURL()); + return algorithmLoader.loadAlgorithmsFromJavaWebKeys(publicKeyInfo); + } else { + // Log and Continue Pulling next Endpoints, if any + LOGGER.warn("Could not load newer public keys from {}", serverUri.toURL()); + return null; + } } - } catch (Exception ex) { throw new TokenValidationException(ex); } @@ -258,4 +220,84 @@ private List algorithmFromServerPublicKeyEndpoint(URI serverUri) thro private static Stream streamEmptyIfNull(Collection collection) { return collection != null ? collection.stream() : Stream.empty(); } + + /** Builder for the TokenValidator. Prefer this {@link #build()} method over the constructor + * invocations. */ + public static class Builder { + private static final int DEFAULT_HTTP_TIMEOUT = 30; + + public TokenValidatorConfig config; + private OkHttpClient httpClient; + private ObjectMapper mapper; + private Duration fetchTimeout; + private List verifiers; + private List algorithms; + + public Builder httpClient(OkHttpClient client) { + this.httpClient = client; + return this; + } + + public Builder objectMapper(ObjectMapper mapper) { + this.mapper = mapper; + return this; + } + + public Builder fetchTimeout(Duration timeout) { + this.fetchTimeout = timeout; + return this; + } + + public Builder config(TokenValidatorConfig config) { + this.config = config; + return this; + } + + public Builder verifiers(List verifiers) { + this.verifiers = verifiers; + return this; + } + + public Builder validators(List validators) { + this.algorithms = validators; + return this; + } + + private Builder verify() { + if (httpClient == null) { + httpClient = new OkHttpClient.Builder() + .connectTimeout(DEFAULT_HTTP_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(DEFAULT_HTTP_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(DEFAULT_HTTP_TIMEOUT, TimeUnit.SECONDS) + .build(); + } else { + httpClient = httpClient.newBuilder().build(); + } + if (mapper == null) { + mapper = new ObjectMapper(); + } + if (fetchTimeout == null) { + fetchTimeout = FETCH_TIMEOUT_DEFAULT; + } + if (config == null) { + config = TokenVerifierPublicKeyConfig.readFromFileOrClasspath(); + } + if (algorithms == null) { + algorithms = AlgorithmLoader.defaultAlgorithms(); + } + if (verifiers == null) { + verifiers = List.of(); + } + return this; + } + + /** + * Build a new validator. + * @return built validator. + */ + public TokenValidator build() { + verify(); + return new TokenValidator(this); + } + } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/authorization/AuthoritiesConstants.java b/radar-auth/src/main/java/org/radarbase/auth/authorization/AuthoritiesConstants.java deleted file mode 100644 index 9b3cda745..000000000 --- a/radar-auth/src/main/java/org/radarbase/auth/authorization/AuthoritiesConstants.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.radarbase.auth.authorization; - -/** - * Constants for Spring Security authorities. - */ -public interface AuthoritiesConstants { - String SYS_ADMIN = "ROLE_SYS_ADMIN"; - - String PROJECT_ADMIN = "ROLE_PROJECT_ADMIN"; - - String PROJECT_OWNER = "ROLE_PROJECT_OWNER"; - - String PROJECT_AFFILIATE = "ROLE_PROJECT_AFFILIATE"; - - String PROJECT_ANALYST = "ROLE_PROJECT_ANALYST"; - - String PARTICIPANT = "ROLE_PARTICIPANT"; - - String INACTIVE_PARTICIPANT = "ROLE_INACTIVE_PARTICIPANT"; -} diff --git a/radar-auth/src/main/java/org/radarbase/auth/authorization/Permission.java b/radar-auth/src/main/java/org/radarbase/auth/authorization/Permission.java index ba04fdad2..7ecf199c9 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/authorization/Permission.java +++ b/radar-auth/src/main/java/org/radarbase/auth/authorization/Permission.java @@ -1,21 +1,53 @@ package org.radarbase.auth.authorization; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.lang.reflect.Modifier; import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Class to represent the different permissions in the RADAR platform. A permission has an entity * and an operation. */ -public class Permission { - - private static final Logger log = LoggerFactory.getLogger(Permission.class); +public enum Permission { + SOURCETYPE_CREATE(Entity.SOURCETYPE, Operation.CREATE), + SOURCETYPE_READ(Entity.SOURCETYPE, Operation.READ), + SOURCETYPE_UPDATE(Entity.SOURCETYPE, Operation.UPDATE), + SOURCETYPE_DELETE(Entity.SOURCETYPE, Operation.DELETE), + SOURCEDATA_CREATE(Entity.SOURCEDATA, Operation.CREATE), + SOURCEDATA_READ(Entity.SOURCEDATA, Operation.READ), + SOURCEDATA_UPDATE(Entity.SOURCEDATA, Operation.UPDATE), + SOURCEDATA_DELETE(Entity.SOURCEDATA, Operation.DELETE), + SOURCE_CREATE(Entity.SOURCE, Operation.CREATE), + SOURCE_READ(Entity.SOURCE, Operation.READ), + SOURCE_UPDATE(Entity.SOURCE, Operation.UPDATE), + SOURCE_DELETE(Entity.SOURCE, Operation.DELETE), + SUBJECT_CREATE(Entity.SUBJECT, Operation.CREATE), + SUBJECT_READ(Entity.SUBJECT, Operation.READ), + SUBJECT_UPDATE(Entity.SUBJECT, Operation.UPDATE), + SUBJECT_DELETE(Entity.SUBJECT, Operation.DELETE), + USER_CREATE(Entity.USER, Operation.CREATE), + USER_READ(Entity.USER, Operation.READ), + USER_UPDATE(Entity.USER, Operation.UPDATE), + USER_DELETE(Entity.USER, Operation.DELETE), + ROLE_CREATE(Entity.ROLE, Operation.CREATE), + ROLE_READ(Entity.ROLE, Operation.READ), + ROLE_UPDATE(Entity.ROLE, Operation.UPDATE), + ROLE_DELETE(Entity.ROLE, Operation.DELETE), + PROJECT_CREATE(Entity.PROJECT, Operation.CREATE), + PROJECT_READ(Entity.PROJECT, Operation.READ), + PROJECT_UPDATE(Entity.PROJECT, Operation.UPDATE), + PROJECT_DELETE(Entity.PROJECT, Operation.DELETE), + ORGANIZATION_CREATE(Entity.ORGANIZATION, Operation.CREATE), + ORGANIZATION_READ(Entity.ORGANIZATION, Operation.READ), + ORGANIZATION_UPDATE(Entity.ORGANIZATION, Operation.UPDATE), + ORGANIZATION_DELETE(Entity.ORGANIZATION, Operation.DELETE), + OAUTHCLIENTS_CREATE(Entity.OAUTHCLIENTS, Operation.CREATE), + OAUTHCLIENTS_READ(Entity.OAUTHCLIENTS, Operation.READ), + OAUTHCLIENTS_UPDATE(Entity.OAUTHCLIENTS, Operation.UPDATE), + OAUTHCLIENTS_DELETE(Entity.OAUTHCLIENTS, Operation.DELETE), + AUDIT_READ(Entity.AUDIT, Operation.READ), + AUTHORITY_READ(Entity.AUTHORITY, Operation.READ), + MEASUREMENT_READ(Entity.MEASUREMENT, Operation.READ), + MEASUREMENT_CREATE(Entity.MEASUREMENT, Operation.CREATE); public enum Entity { // ManagementPortal entities @@ -25,6 +57,7 @@ public enum Entity { SUBJECT, USER, ROLE, + ORGANIZATION, PROJECT, OAUTHCLIENTS, AUDIT, @@ -41,64 +74,6 @@ public enum Operation { DELETE } - public static final Permission SOURCETYPE_CREATE = - new Permission(Entity.SOURCETYPE, Operation.CREATE); - public static final Permission SOURCETYPE_READ = - new Permission(Entity.SOURCETYPE, Operation.READ); - public static final Permission SOURCETYPE_UPDATE = - new Permission(Entity.SOURCETYPE, Operation.UPDATE); - public static final Permission SOURCETYPE_DELETE = - new Permission(Entity.SOURCETYPE, Operation.DELETE); - public static final Permission SOURCEDATA_CREATE = - new Permission(Entity.SOURCEDATA, Operation.CREATE); - public static final Permission SOURCEDATA_READ = - new Permission(Entity.SOURCEDATA, Operation.READ); - public static final Permission SOURCEDATA_UPDATE = - new Permission(Entity.SOURCEDATA, Operation.UPDATE); - public static final Permission SOURCEDATA_DELETE = - new Permission(Entity.SOURCEDATA, Operation.DELETE); - public static final Permission SOURCE_CREATE = new Permission(Entity.SOURCE, Operation.CREATE); - public static final Permission SOURCE_READ = new Permission(Entity.SOURCE, Operation.READ); - public static final Permission SOURCE_UPDATE = new Permission(Entity.SOURCE, Operation.UPDATE); - public static final Permission SOURCE_DELETE = new Permission(Entity.SOURCE, Operation.DELETE); - public static final Permission SUBJECT_CREATE = - new Permission(Entity.SUBJECT, Operation.CREATE); - public static final Permission SUBJECT_READ = new Permission(Entity.SUBJECT, Operation.READ); - public static final Permission SUBJECT_UPDATE = - new Permission(Entity.SUBJECT, Operation.UPDATE); - public static final Permission SUBJECT_DELETE = - new Permission(Entity.SUBJECT, Operation.DELETE); - public static final Permission USER_CREATE = new Permission(Entity.USER, Operation.CREATE); - public static final Permission USER_READ = new Permission(Entity.USER, Operation.READ); - public static final Permission USER_UPDATE = new Permission(Entity.USER, Operation.UPDATE); - public static final Permission USER_DELETE = new Permission(Entity.USER, Operation.DELETE); - public static final Permission ROLE_CREATE = new Permission(Entity.ROLE, Operation.CREATE); - public static final Permission ROLE_READ = new Permission(Entity.ROLE, Operation.READ); - public static final Permission ROLE_UPDATE = new Permission(Entity.ROLE, Operation.UPDATE); - public static final Permission ROLE_DELETE = new Permission(Entity.ROLE, Operation.DELETE); - public static final Permission PROJECT_CREATE = new - Permission(Entity.PROJECT, Operation.CREATE); - public static final Permission PROJECT_READ = new Permission(Entity.PROJECT, Operation.READ); - public static final Permission PROJECT_UPDATE = - new Permission(Entity.PROJECT, Operation.UPDATE); - public static final Permission PROJECT_DELETE = - new Permission(Entity.PROJECT, Operation.DELETE); - public static final Permission OAUTHCLIENTS_CREATE = - new Permission(Entity.OAUTHCLIENTS, Operation.CREATE); - public static final Permission OAUTHCLIENTS_READ = - new Permission(Entity.OAUTHCLIENTS, Operation.READ); - public static final Permission OAUTHCLIENTS_UPDATE = - new Permission(Entity.OAUTHCLIENTS, Operation.UPDATE); - public static final Permission OAUTHCLIENTS_DELETE = - new Permission(Entity.OAUTHCLIENTS, Operation.DELETE); - public static final Permission AUDIT_READ = new Permission(Entity.AUDIT, Operation.READ); - public static final Permission AUTHORITY_READ = - new Permission(Entity.AUTHORITY, Operation.READ); - public static final Permission MEASUREMENT_READ = - new Permission(Entity.MEASUREMENT, Operation.READ); - public static final Permission MEASUREMENT_CREATE = - new Permission(Entity.MEASUREMENT, Operation.CREATE); - private final Entity entity; private final Operation operation; @@ -108,7 +83,7 @@ public enum Operation { * @param entity the entity that the permission refers to. * @param operation the operation on given entity that requires a permission. */ - public Permission(Entity entity, Operation operation) { + Permission(Entity entity, Operation operation) { if (entity == null || operation == null) { throw new IllegalArgumentException("Entity and operation can not be null"); } @@ -129,53 +104,40 @@ public Operation getOperation() { * @param authority the authority name * @return true if the given authority has this permission associated with it, false otherwise */ - public boolean isAuthorityAllowed(String authority) { - return Permissions.allowedAuthorities(this).contains(authority); + public boolean isRoleAllowed(RoleAuthority authority) { + return Permissions.allowedRoles(this).contains(authority); + } + + @Override + public String toString() { + return "Permission{entity=" + entity + ", operation=" + operation + '}'; } /** - * Get all currently defined permissions. - * @return A list containing all currently defined permissions + * Stream all available permissions. */ - public static List allPermissions() { - return Arrays.stream(Permission.class.getDeclaredFields()) // get declared fields - .filter(f -> Modifier.isStatic(f.getModifiers()) // that are static - && f.getType() == Permission.class) // and of type Permission - .map(f -> { - try { - return (Permission) f.get(null); - } catch (IllegalAccessException ex) { - log.error("Could not get permissions through reflection. Fieldname: {}", - f.getName()); - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + public static Stream stream() { + return Arrays.stream(values()); } - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - if (other == null || getClass() != other.getClass()) { - return false; - } - - Permission that = (Permission) other; - - return entity == that.entity && operation == that.operation; + /** Returns all available scope names. */ + public static String[] scopes() { + return stream() + .map(Permission::scope) + .toArray(String[]::new); } - @Override - public int hashCode() { - return Objects.hash(entity, operation); + /** Return matching permission. */ + public static Permission of(Entity entity, Operation operation) { + return stream() + .filter(p -> p.getEntity() == entity && p.getOperation() == operation) + .findAny() + .orElseThrow(() -> new IllegalArgumentException( + "No permission found for given entity and operation")); } - @Override - public String toString() { - return "Permission{entity=" + entity + ", operation=" + operation + '}'; + public static Permission ofScope(String scope) { + return valueOf(scope.replace('.', '_')); } /** @@ -183,7 +145,7 @@ public String toString() { * * @return the OAuth scope representation of this permission */ - public String scopeName() { + public String scope() { return entity + "." + operation; } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/authorization/Permissions.java b/radar-auth/src/main/java/org/radarbase/auth/authorization/Permissions.java index 643d9fb3b..14e076854 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/authorization/Permissions.java +++ b/radar-auth/src/main/java/org/radarbase/auth/authorization/Permissions.java @@ -2,27 +2,36 @@ import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; +import java.util.EnumMap; +import java.util.EnumSet; import java.util.Map; import java.util.Set; - -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PROJECT_ADMIN; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PROJECT_AFFILIATE; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PROJECT_ANALYST; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PROJECT_OWNER; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; +import java.util.function.Predicate; +import java.util.stream.Collector; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.collectingAndThen; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.mapping; +import static java.util.stream.Collectors.toCollection; +import static org.radarbase.auth.authorization.RoleAuthority.INACTIVE_PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.ORGANIZATION_ADMIN; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.PROJECT_ADMIN; +import static org.radarbase.auth.authorization.RoleAuthority.PROJECT_AFFILIATE; +import static org.radarbase.auth.authorization.RoleAuthority.PROJECT_ANALYST; +import static org.radarbase.auth.authorization.RoleAuthority.PROJECT_OWNER; +import static org.radarbase.auth.authorization.RoleAuthority.SYS_ADMIN; /** * Created by dverbeec on 22/09/2017. */ public final class Permissions { - private static final Map> PERMISSION_MATRIX = new HashMap<>(); + private static final Map> PERMISSION_MATRIX; static { - initPermissions(); + PERMISSION_MATRIX = createPermissions(); } private Permissions() { @@ -31,16 +40,12 @@ private Permissions() { /** * Look up the allowed authorities for a given permission. Authorities are String constants that - * appear in {@link AuthoritiesConstants}. + * appear in {@link RoleAuthority}. * @param permission The permission to look up. * @return An unmodifiable view of the set of allowed authorities. */ - public static Set allowedAuthorities(Permission permission) { - if (PERMISSION_MATRIX.containsKey(permission)) { - return Collections.unmodifiableSet(PERMISSION_MATRIX.get(permission)); - } else { - return Collections.emptySet(); - } + public static Set allowedRoles(Permission permission) { + return PERMISSION_MATRIX.getOrDefault(permission, Set.of()); } /** @@ -50,77 +55,118 @@ public static Set allowedAuthorities(Permission permission) { * permission.

* @return An unmodifiable view of the permission matrix. */ - public static Map> getPermissionMatrix() { - return Collections.unmodifiableMap(PERMISSION_MATRIX); + public static Map> getPermissionMatrix() { + return PERMISSION_MATRIX; } /** * Static permission matrix based on the currently agreed upon security rules. */ - private static void initPermissions() { - Permission.allPermissions().forEach(p -> PERMISSION_MATRIX.put(p, new HashSet<>())); + private static Map> createPermissions() { + Map> rolePermissions = new EnumMap<>( + RoleAuthority.class); + + // System admin can do everything. + rolePermissions.put(SYS_ADMIN, Permission.stream()); - /* System Administrator - has all currently defined permissions */ - PERMISSION_MATRIX.values().forEach(s -> s.add(SYS_ADMIN)); + // Organization admin can do most things, but not view subjects or measurements + rolePermissions.put(ORGANIZATION_ADMIN, Permission.stream() + .filter(excludePermissions(Permission.ORGANIZATION_CREATE)) + .filter(excludeEntities(Permission.Entity.AUDIT, + Permission.Entity.AUTHORITY, Permission.Entity.MEASUREMENT)) + .filter(excludePermissions(Permission.SOURCEDATA_CREATE, + Permission.SOURCETYPE_CREATE))); // for all authorities except for SYS_ADMIN, the authority is scoped to a project, which // is checked elsewhere // Project Admin - has all currently defined permissions except creating new projects // Note: from radar-auth:0.5.7 we allow PROJECT_ADMIN to create measurements. // This can be done by uploading data through the web application. - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> e.getKey() != Permission.PROJECT_CREATE) - .forEach(e -> e.getValue().add(PROJECT_ADMIN)); + rolePermissions.put(PROJECT_ADMIN, Permission.stream() + .filter(excludeEntities( + Permission.Entity.AUDIT, + Permission.Entity.AUTHORITY)) + .filter(excludeOtherEntityOperations( + Permission.Entity.ORGANIZATION, Permission.Operation.READ)) + .filter(excludePermissions(Permission.PROJECT_CREATE))); /* Project Owner */ // CRUD operations on subjects to allow enrollment - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> e.getKey().getEntity() == Permission.Entity.SUBJECT) - .forEach(e -> e.getValue().add(PROJECT_OWNER)); - - // can also read all other things except users, audits and authorities - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> !Arrays.asList(Permission.Entity.AUDIT, Permission.Entity.AUTHORITY, - Permission.Entity.USER) - .contains(e.getKey().getEntity())) - .filter(e -> e.getKey().getOperation() == Permission.Operation.READ) - .forEach(e -> e.getValue().add(PROJECT_OWNER)); + rolePermissions.put(PROJECT_OWNER, Permission.stream() + .filter(excludeEntities( + Permission.Entity.AUDIT, + Permission.Entity.AUTHORITY, + Permission.Entity.USER)) + .filter(excludeOtherEntityOperations( + Permission.Entity.ORGANIZATION, Permission.Operation.READ)) + .filter(excludePermissions(Permission.PROJECT_CREATE))); /* Project affiliate */ // Create, read and update participant (no delete) - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> e.getKey().getEntity() == Permission.Entity.SUBJECT) - .filter(e -> e.getKey().getOperation() != Permission.Operation.DELETE) - .forEach(e -> e.getValue().add(PROJECT_AFFILIATE)); - - // can also read all other things except users, audits and authorities - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> !Arrays.asList(Permission.Entity.AUDIT, Permission.Entity.AUTHORITY, - Permission.Entity.USER) - .contains(e.getKey().getEntity())) - .filter(e -> e.getKey().getOperation() == Permission.Operation.READ) - .forEach(e -> e.getValue().add(PROJECT_AFFILIATE)); + rolePermissions.put(PROJECT_AFFILIATE, Permission.stream() + .filter(excludeEntities( + Permission.Entity.AUDIT, + Permission.Entity.AUTHORITY, + Permission.Entity.USER)) + .filter(excludeOtherEntityOperations( + Permission.Entity.ORGANIZATION, Permission.Operation.READ)) + .filter(excludeOtherEntityOperations( + Permission.Entity.PROJECT, Permission.Operation.READ)) + .filter(excludePermissions( + Permission.SUBJECT_DELETE))); /* Project analyst */ // Can read everything except users, authorities and audits - PERMISSION_MATRIX.entrySet().stream() - .filter(e -> !Arrays.asList(Permission.Entity.AUDIT, Permission.Entity.AUTHORITY, - Permission.Entity.USER) - .contains(e.getKey().getEntity())) - .filter(e -> e.getKey().getOperation() == Permission.Operation.READ) - .forEach(e -> e.getValue().add(PROJECT_ANALYST)); - - // Can add metadata to sources - PERMISSION_MATRIX.get(Permission.SOURCE_UPDATE).add(PROJECT_ANALYST); + rolePermissions.put(PROJECT_ANALYST, Permission.stream() + .filter(excludeEntities( + Permission.Entity.AUDIT, + Permission.Entity.AUTHORITY, + Permission.Entity.USER)) + // Can add metadata to sources, only read other things. + .filter(p -> p.getOperation() == Permission.Operation.READ + || p == Permission.SUBJECT_UPDATE)); /* Participant */ // Can update and read own data and can read and write own measurements - Arrays.asList(Permission.SUBJECT_READ, Permission.SUBJECT_UPDATE, - Permission.MEASUREMENT_CREATE, Permission.MEASUREMENT_READ) - .forEach(p -> PERMISSION_MATRIX.get(p).add(PARTICIPANT)); + rolePermissions.put(PARTICIPANT, Stream.of( + Permission.SUBJECT_READ, + Permission.SUBJECT_UPDATE, + Permission.MEASUREMENT_CREATE, + Permission.MEASUREMENT_READ)); /* Inactive participant */ // Doesn't have any permissions + rolePermissions.put(INACTIVE_PARTICIPANT, Stream.empty()); + + // invert map + return Collections.unmodifiableMap( + rolePermissions.entrySet().stream() + .flatMap(rolePerm -> rolePerm.getValue() + .map(p -> Map.entry(p, rolePerm.getKey()))) + .collect(groupingBy( + Map.Entry::getKey, + () -> new EnumMap<>(Permission.class), + mapping(Map.Entry::getValue, toUnmodifiableEnumSet())))); + } + + private static Collector> + toUnmodifiableEnumSet() { + return collectingAndThen( + toCollection(() -> EnumSet.noneOf(RoleAuthority.class)), + Collections::unmodifiableSet); + } + + private static Predicate excludeOtherEntityOperations( + Permission.Entity entity, + Permission.Operation... operations) { + return p -> p.getEntity() != entity || Arrays.asList(operations).contains(p.getOperation()); + } + + private static Predicate excludePermissions(Permission... permissions) { + return p -> !Arrays.asList(permissions).contains(p); + } + private static Predicate excludeEntities(Permission.Entity... entities) { + return p -> !Arrays.asList(entities).contains(p.getEntity()); } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/authorization/RadarAuthorization.java b/radar-auth/src/main/java/org/radarbase/auth/authorization/RadarAuthorization.java index 5d104a7a5..6ee9b58e1 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/authorization/RadarAuthorization.java +++ b/radar-auth/src/main/java/org/radarbase/auth/authorization/RadarAuthorization.java @@ -19,28 +19,28 @@ private RadarAuthorization() { } /** - * Similar to {@link RadarToken#hasAuthority(String)} (Permission)}, but this method throws an - * exception rather than returning a boolean. Useful in combination with e.g. Spring's - * controllers and exception translators. + * Similar to {@link RadarToken#hasAuthority(RoleAuthority)}, but this + * method throws an exception rather than returning a boolean. Useful in combination with e.g. + * Spring's controllers and exception translators. * @param token The token of the requester * @param authority The authority to check * @throws NotAuthorizedException if the supplied token does not have the authority */ - public static void checkAuthority(RadarToken token, String authority) + public static void checkAuthority(RadarToken token, RoleAuthority authority) throws NotAuthorizedException { if (!token.isClientCredentials()) { log.debug("Checking authority {} for user {}", authority, - token.getSubject()); + token.getUsername()); if (!token.hasAuthority(authority)) { throw new NotAuthorizedException(String.format("Request Client %s does not have " - + "authority %s", token.getSubject(), authority)); + + "authority %s", token.getUsername(), authority)); } } } /** - * Similar to {@link RadarToken#hasAuthority(String)} (Permission)}, but this method throws an + * Similar to {@link RadarToken#hasAuthority(RoleAuthority)}, but this method throws an * exception rather than returning a boolean. Useful in combination with e.g. Spring's * controllers and exception translators. * @param token The token of the requester @@ -48,11 +48,11 @@ public static void checkAuthority(RadarToken token, String authority) * @param permission Permission that the authority should have. * @throws NotAuthorizedException if the supplied token does not have the authority */ - public static void checkAuthorityAndPermission(RadarToken token, String authority, + public static void checkAuthorityAndPermission(RadarToken token, RoleAuthority authority, Permission permission) throws NotAuthorizedException { log.debug("Checking authority {} and permission {} for user {}", authority, permission, - token.getSubject()); + token.getUsername()); checkAuthority(token, authority); checkPermission(token, permission); } @@ -68,10 +68,72 @@ public static void checkAuthorityAndPermission(RadarToken token, String authorit public static void checkPermission(RadarToken token, Permission permission) throws NotAuthorizedException { log.debug("Checking permission {} for user {}", permission.toString(), - token.getSubject()); + token.getUsername()); if (!token.hasPermission(permission)) { throw new NotAuthorizedException(String.format("Client %s does not have " - + "permission %s", token.getSubject(), permission.toString())); + + "permission %s", token.getUsername(), permission)); + } + } + + /** + * Similar to {@link RadarToken#hasGlobalPermission(Permission)}, but this method throws an + * exception rather than returning a boolean. Useful in combination with e.g. Spring's + * controllers and exception translators. + * @param token The token of the authenticated client + * @param permission The permission to check + * @throws NotAuthorizedException if the supplied token does not have the permission + */ + public static void checkGlobalPermission(RadarToken token, Permission permission) + throws NotAuthorizedException { + log.debug("Checking global permission {} for user {}", permission.toString(), + token.getUsername()); + if (!token.hasGlobalPermission(permission)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s", token.getUsername(), permission)); + } + } + + /** + * Similar to {@link RadarToken#hasPermissionOnOrganization(Permission, String)}, + * but this method throws an exception rather than returning a boolean. + * Useful in combination with e.g. Spring's controllers and exception translators. + * @param token The token of the logged in user + * @param permission The permission to check + * @param organizationName The organization for which to check the permission + * @throws NotAuthorizedException if the supplied token + * does not have the permission in the given organization + */ + public static void checkPermissionOnOrganization(RadarToken token, Permission permission, + String organizationName) throws NotAuthorizedException { + log.debug("Checking permission {} for user {} in organization {}", permission.toString(), + token.getUsername(), organizationName); + if (!token.hasPermissionOnOrganization(permission, organizationName)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s in organization %s", + token.getUsername(), permission, organizationName)); + } + } + + /** + * Similar to {@link RadarToken#hasPermissionOnProject(Permission, String)}, but this method + * throws an exception rather than returning a boolean. Useful in combination with e.g. Spring's + * controllers and exception translators. + * @param token The token of the logged in user + * @param permission The permission to check + * @param projectName The project for which to check the permission + * @throws NotAuthorizedException if the supplied token does not have the permission in the + * given project + */ + public static void checkPermissionOnOrganizationAndProject(RadarToken token, + Permission permission, String organization, String projectName) + throws NotAuthorizedException { + log.debug("Checking permission {} for user {} in organization {} and project {}", + permission.toString(), token.getUsername(), organization, projectName); + if (!token.hasPermissionOnOrganizationAndProject(permission, organization, projectName)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s in organization %s and project %s", + token.getUsername(), permission, organization, + projectName)); } } @@ -88,10 +150,10 @@ public static void checkPermission(RadarToken token, Permission permission) public static void checkPermissionOnProject(RadarToken token, Permission permission, String projectName) throws NotAuthorizedException { log.debug("Checking permission {} for user {} in project {}", permission.toString(), - token.getSubject(), projectName); + token.getUsername(), projectName); if (!token.hasPermissionOnProject(permission, projectName)) { throw new NotAuthorizedException(String.format("Client %s does not have " - + "permission %s in project %s", token.getSubject(), permission.toString(), + + "permission %s in project %s", token.getUsername(), permission, projectName)); } } @@ -110,10 +172,10 @@ public static void checkPermissionOnProject(RadarToken token, Permission permiss public static void checkPermissionOnSubject(RadarToken token, Permission permission, String projectName, String subjectName) throws NotAuthorizedException { log.debug("Checking permission {} for user {} on subject {} in project {}", - permission.toString(), token.getSubject(), subjectName, projectName); + permission.toString(), token.getUsername(), subjectName, projectName); if (!token.hasPermissionOnSubject(permission, projectName, subjectName)) { throw new NotAuthorizedException(String.format("Client %s does not have " - + "permission %s on subject %s in project %s", token.getSubject(), + + "permission %s on subject %s in project %s", token.getUsername(), permission, subjectName, projectName)); } } @@ -133,11 +195,11 @@ public static void checkPermissionOnSubject(RadarToken token, Permission permiss public static void checkPermissionOnSource(RadarToken token, Permission permission, String projectName, String subjectName, String sourceId) throws NotAuthorizedException { log.debug("Checking permission {} for user {} on source {} of subject {} in project {}", - permission.toString(), token.getSubject(), sourceId, subjectName, projectName); + permission.toString(), token.getUsername(), sourceId, subjectName, projectName); if (!token.hasPermissionOnSource(permission, projectName, subjectName, sourceId)) { throw new NotAuthorizedException(String.format("Client %s does not have " + "permission %s on source %s of subject %s in project %s", - token.getSubject(), permission, sourceId, subjectName, projectName)); + token.getUsername(), permission, sourceId, subjectName, projectName)); } } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/authorization/RoleAuthority.java b/radar-auth/src/main/java/org/radarbase/auth/authorization/RoleAuthority.java new file mode 100644 index 000000000..136008f8d --- /dev/null +++ b/radar-auth/src/main/java/org/radarbase/auth/authorization/RoleAuthority.java @@ -0,0 +1,84 @@ +package org.radarbase.auth.authorization; + +import java.io.Serializable; +import java.util.EnumSet; +import java.util.Locale; +import java.util.Set; +import java.util.stream.Collector; + +import static java.util.stream.Collectors.toCollection; + +/** + * Constants for Spring Security authorities. + */ +public enum RoleAuthority implements Serializable { + SYS_ADMIN(Scope.GLOBAL, false), + PROJECT_ADMIN(Scope.PROJECT, false), + PROJECT_OWNER(Scope.PROJECT, false), + PROJECT_AFFILIATE(Scope.PROJECT, false), + PROJECT_ANALYST(Scope.PROJECT, false), + PARTICIPANT(Scope.PROJECT, true), + INACTIVE_PARTICIPANT(Scope.PROJECT, true), + ORGANIZATION_ADMIN(Scope.ORGANIZATION, false); + + public static final String SYS_ADMIN_AUTHORITY = "ROLE_SYS_ADMIN"; + + private final Scope scope; + private final boolean isPersonal; + + RoleAuthority(Scope scope, boolean isPersonal) { + this.scope = scope; + this.isPersonal = isPersonal; + } + + public Scope scope() { + return scope; + } + + public String authority() { + return "ROLE_" + name(); + } + + public boolean isPersonal() { + return this.isPersonal; + } + + /** + * Find role authority based on authority name. + * @param authority authority name + * @return RoleAuthority + * @throws IllegalArgumentException if no role authority exists with the given name. + * @throws NullPointerException if given authority is null. + */ + public static RoleAuthority valueOfAuthority(String authority) { + String upperAuthority = authority.toUpperCase(Locale.ROOT); + if (!upperAuthority.startsWith("ROLE_")) { + throw new IllegalArgumentException("Cannot map role without 'ROLE_' prefix"); + } + return valueOf(upperAuthority.substring(5)); + } + + /** + * Find role authority based on authority name. + * @param authority authority name + * @return RoleAuthority or null if no role authority exists with the given name. + */ + public static RoleAuthority valueOfAuthorityOrNull(String authority) { + if (authority == null) { + return null; + } + try { + return valueOfAuthority(authority); + } catch (IllegalArgumentException ex) { + return null; + } + } + + public enum Scope { + GLOBAL, ORGANIZATION, PROJECT + } + + public static > Collector> toEnumSet(Class clazz) { + return toCollection(() -> EnumSet.noneOf(clazz)); + } +} diff --git a/radar-auth/src/main/java/org/radarbase/auth/config/TokenValidatorConfig.java b/radar-auth/src/main/java/org/radarbase/auth/config/TokenValidatorConfig.java index 39ad5db80..4c3898a09 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/config/TokenValidatorConfig.java +++ b/radar-auth/src/main/java/org/radarbase/auth/config/TokenValidatorConfig.java @@ -18,12 +18,4 @@ public interface TokenValidatorConfig { */ String getResourceName(); - /** - * Get the public keys set in the config file. They should be in PEM format. - * @return The public keys, or null if not defined. - * @deprecated Use the {@link #getPublicKeyEndpoints()} instead to get public-keys. - */ - @Deprecated - List getPublicKeys(); - } diff --git a/radar-auth/src/main/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfig.java b/radar-auth/src/main/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfig.java index d00628372..521a35bbd 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfig.java +++ b/radar-auth/src/main/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfig.java @@ -6,7 +6,6 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URL; -import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -27,13 +26,10 @@ public class TokenVerifierPublicKeyConfig implements TokenValidatorConfig { private static final String CONFIG_FILE_NAME = "radar-is.yml"; - private List publicKeyEndpoints = new LinkedList<>(); + private List publicKeyEndpoints = List.of(); private String resourceName; - private List publicKeys = new LinkedList<>(); - - /** * Read the configuration from file. This method will first check if the environment variable * RADAR_IS_CONFIG_LOCATION is set. If not set, it will look for a file called @@ -91,25 +87,10 @@ public String getResourceName() { return resourceName; } - @Override - public List getPublicKeys() { - return publicKeys; - } - public void setResourceName(String resourceName) { this.resourceName = resourceName; } - /** - * Set the public keys. This method will detect the public key type (EC or RSA) and parse - * accordingly. - * - * @param publicKeys The public keys to parse - */ - public void setPublicKeys(List publicKeys) { - this.publicKeys = publicKeys; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -120,12 +101,11 @@ public boolean equals(Object o) { } TokenVerifierPublicKeyConfig that = (TokenVerifierPublicKeyConfig) o; return Objects.equals(publicKeyEndpoints, that.publicKeyEndpoints) - && Objects.equals(resourceName, that.resourceName) - && Objects.equals(publicKeys, that.publicKeys); + && Objects.equals(resourceName, that.resourceName); } @Override public int hashCode() { - return Objects.hash(publicKeyEndpoints, resourceName, publicKeys); + return Objects.hash(publicKeyEndpoints, resourceName); } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/token/AbstractRadarToken.java b/radar-auth/src/main/java/org/radarbase/auth/token/AbstractRadarToken.java index 04e18e0b7..e2122b712 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/token/AbstractRadarToken.java +++ b/radar-auth/src/main/java/org/radarbase/auth/token/AbstractRadarToken.java @@ -1,46 +1,63 @@ package org.radarbase.auth.token; -import static java.util.Collections.singletonList; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; +import org.radarbase.auth.authorization.Permission; +import org.radarbase.auth.authorization.RoleAuthority; -import java.util.Collection; -import java.util.List; import java.util.Objects; -import org.radarbase.auth.authorization.Permission; +import java.util.function.Predicate; +import java.util.stream.Stream; /** * Partial implementation of {@link RadarToken}, providing a default implementation for the three * permission checks. */ public abstract class AbstractRadarToken implements RadarToken { - protected static final String CLIENT_CREDENTIALS = "client_credentials"; @Override - public boolean hasAuthority(String authority) { + public boolean hasAuthority(RoleAuthority authority) { return isClientCredentials() - || getAuthorities().stream().anyMatch(authority::equals); + || getRoleAuthorities().stream().anyMatch(authority::equals); } - @Override public boolean hasPermission(Permission permission) { - return hasScope(permission.scopeName()) + return hasScope(permission.scope()) && (isClientCredentials() || hasAuthorityForPermission(permission)); } + @Override + public boolean hasGlobalPermission(Permission permission) { + return hasScope(permission.scope()) + && (isClientCredentials() || hasGlobalAuthorityForPermission(permission)); + } + + @Override + public boolean hasPermissionOnOrganization(Permission permission, String organization) { + return hasScope(permission.scope()) + && (isClientCredentials() || hasAuthorityForOrganization(permission, organization)); + } + + @Override + public boolean hasPermissionOnOrganizationAndProject(Permission permission, String organization, + String projectName) { + return hasScope(permission.scope()) + && (isClientCredentials() || hasAuthorityForOrganizationAndProject( + permission, organization, projectName)); + } + @Override public boolean hasPermissionOnProject(Permission permission, String projectName) { - return hasScope(permission.scopeName()) - && (isClientCredentials() || hasAuthorityForProject(permission, projectName)); + return hasScope(permission.scope()) + && (isClientCredentials() || hasAuthorityForProject( + permission, projectName)); } @Override public boolean hasPermissionOnSubject(Permission permission, String projectName, String subjectName) { - return hasScope(permission.scopeName()) + return hasScope(permission.scope()) && (isClientCredentials() || hasAuthorityForSubject(permission, projectName, subjectName)); } @@ -48,7 +65,7 @@ public boolean hasPermissionOnSubject(Permission permission, String projectName, @Override public boolean hasPermissionOnSource(Permission permission, String projectName, String subjectName, String sourceId) { - return hasScope(permission.scopeName()) + return hasScope(permission.scope()) && (isClientCredentials() || hasAuthorityForSource(permission, projectName, subjectName, sourceId)); } @@ -69,84 +86,101 @@ public boolean isClientCredentials() { * @return {@code true} if any authority contains the permission, {@code false} otherwise */ protected boolean hasAuthorityForPermission(Permission permission) { - return hasNonProjectRelatedAuthorityForPermission(permission) - || getRoles() - .values().stream() - .flatMap(Collection::stream) - .anyMatch(permission::isAuthorityAllowed); + return Stream.concat(getRoles().stream().map(AuthorityReference::getRole), + getRoleAuthorities().stream()) + .anyMatch(permission::isRoleAllowed); } /** * Check authorities in this token linked to the given project, or not linked to any project * (such as {@code SYS_ADMIN}), for the given permission. * @param permission the permission - * @param projectName the project name + * @param organization the organization name * @return {@code true} if any authority contains the permission, {@code false} otherwise */ - protected boolean hasAuthorityForProject(Permission permission, String projectName) { - if (hasNonProjectRelatedAuthorityForPermission(permission)) { + protected boolean hasAuthorityForOrganization(Permission permission, String organization) { + if (hasGlobalAuthorityForPermission(permission)) { return true; } - if (projectName == null) { + if (organization == null) { return false; } - List roles = getRoles().get(projectName); - return roles != null && roles.stream().anyMatch(permission::isAuthorityAllowed); + return getReferentsWithPermission(RoleAuthority.Scope.ORGANIZATION, permission) + .anyMatch(organization::equals); } /** * Check authorities in this token linked to the given project, or not linked to any project - * (such as {@code SYS_ADMIN}), for the given permission on the given subject. + * (such as {@code SYS_ADMIN}), for the given permission. * @param permission the permission + * @param organization the organization name * @param projectName the project name - * @param subjectName the subject name * @return {@code true} if any authority contains the permission, {@code false} otherwise */ - protected boolean hasAuthorityForSubject(Permission permission, String projectName, - String subjectName) { - if (isJustParticipant(projectName)) { - // if we're only a participant, we can only do operations on our own data - return getSubject().equals(subjectName) - && permission.isAuthorityAllowed(PARTICIPANT); - } else { - // if we have other roles beside participant, we should check those on the - // project level - return hasAuthorityForProject(permission, projectName); - } + protected boolean hasAuthorityForOrganizationAndProject(Permission permission, + String organization, String projectName) { + return hasAuthorityForOrganization(permission, organization) + || hasAuthorityForProject(permission, projectName); } - protected boolean hasAuthorityForSource(Permission permission, String projectName, - String subjectName, String sourceId) { - if (!hasAuthorityForSubject(permission, projectName, subjectName)) { - return false; - } - if (isJustParticipant(projectName)) { - return getSources().contains(sourceId); - } else { + /** + * Check whether roles from this token give authority to a given subject. By providing an + * additional personal role condition, if the authority is personal (e.g. subject-specific), + * the predicate for that subject will be evaluated. + * + * @param permission permission to check. + * @param projectName project name. + * @param personalRoleCondition additional condition (possibly null) when a role is + * only applies to the person. + * @return {@code true} if any authority contains the permission, {@code false} otherwise + */ + protected boolean hasAuthorityForProject( + Permission permission, + String projectName, + Predicate personalRoleCondition) { + if (hasGlobalAuthorityForPermission(permission)) { return true; } + if (projectName == null) { + return false; + } + return getAuthorityReferencesWithPermission(RoleAuthority.Scope.PROJECT, permission) + .anyMatch(r -> projectName.equals(r.getReferent()) + && (personalRoleCondition == null + || !r.getRole().isPersonal() + || personalRoleCondition.test(r.getRole()))); } /** - * Check if any non-project related authority has the given permission. Currently the only - * non-project authority is {@code SYS_ADMIN}, so we only check for that. + * Check authorities in this token linked to the given project, or not linked to any project + * (such as {@code SYS_ADMIN}), for the given permission. * @param permission the permission - * @return {@code true} if any non-project related authority has the permission, {@code false} - * otherwise + * @param projectName the project name + * @return {@code true} if any authority contains the permission, {@code false} otherwise */ - protected boolean hasNonProjectRelatedAuthorityForPermission(Permission permission) { - return getAuthorities().contains(SYS_ADMIN) - && permission.isAuthorityAllowed(SYS_ADMIN); + protected boolean hasAuthorityForProject(Permission permission, String projectName) { + return hasAuthorityForProject(permission, projectName, + p -> permission.getOperation() == Permission.Operation.READ); } /** - * Check if this token only has the participant role in the given project. - * @param projectName the project - * @return {@code true} if this token only has the participant role in the given project, - * {@code false} otherwise + * Check authorities in this token linked to the given project, or not linked to any project + * (such as {@code SYS_ADMIN}), for the given permission on the given subject. + * @param permission the permission + * @param projectName the project name + * @param subjectName the subject name + * @return {@code true} if any authority contains the permission, {@code false} otherwise */ - protected boolean isJustParticipant(String projectName) { - return singletonList(PARTICIPANT).equals(getRoles().get(projectName)); + protected boolean hasAuthorityForSubject(Permission permission, String projectName, + String subjectName) { + return hasAuthorityForProject(permission, projectName, role -> + getUsername().equals(subjectName)); + } + + protected boolean hasAuthorityForSource(Permission permission, String projectName, + String subjectName, String sourceId) { + return hasAuthorityForProject(permission, projectName, role -> + getUsername().equals(subjectName) && getSources().contains(sourceId)); } @Override @@ -170,6 +204,7 @@ public int hashCode() { public String toString() { return getClass().getSimpleName() + "{" + "scopes=" + getScopes() + + ", username='" + getUsername() + '\'' + ", subject='" + getSubject() + '\'' + ", roles=" + getRoles() + ", sources=" + getSources() @@ -180,7 +215,7 @@ public String toString() { + ", issuedAt=" + getIssuedAt() + ", expiresAt=" + getExpiresAt() + ", type='" + getType() + '\'' - + ", token='" + getToken() + '\'' + '}'; } + } diff --git a/radar-auth/src/main/java/org/radarbase/auth/token/AuthorityReference.java b/radar-auth/src/main/java/org/radarbase/auth/token/AuthorityReference.java new file mode 100644 index 000000000..218b78366 --- /dev/null +++ b/radar-auth/src/main/java/org/radarbase/auth/token/AuthorityReference.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.auth.token; + +import org.radarbase.auth.authorization.RoleAuthority; + +import java.io.Serializable; +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public class AuthorityReference implements Serializable { + private final String authority; + private final String referent; + private final RoleAuthority role; + + public AuthorityReference(String authority) { + this(authority, null); + } + + public AuthorityReference(RoleAuthority role) { + this(role, null); + } + + /** + * Authority reference with given role and the object it refers to. + * @param role user role. + * @param referent reference. + */ + public AuthorityReference(RoleAuthority role, String referent) { + this.role = requireNonNull(role); + this.authority = role.authority(); + this.referent = referent; + } + + /** + * Authority reference with given authority and the object it refers to. + * @param authority user authority. + * @param referent reference. + */ + public AuthorityReference(String authority, String referent) { + this.authority = requireNonNull(authority); + this.role = RoleAuthority.valueOfAuthorityOrNull(authority); + this.referent = referent; + } + + public RoleAuthority getRole() { + return role; + } + + public String getReferent() { + return referent; + } + + public String getAuthority() { + return authority; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + AuthorityReference that = (AuthorityReference) o; + + return Objects.equals(referent, that.referent) && authority.equals(that.authority); + } + + @Override + public int hashCode() { + int result = referent != null ? referent.hashCode() : 0; + result = 31 * result + authority.hashCode(); + return result; + } +} diff --git a/radar-auth/src/main/java/org/radarbase/auth/token/JwtRadarToken.java b/radar-auth/src/main/java/org/radarbase/auth/token/JwtRadarToken.java index a25a20794..0ff56ff23 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/token/JwtRadarToken.java +++ b/radar-auth/src/main/java/org/radarbase/auth/token/JwtRadarToken.java @@ -1,18 +1,20 @@ package org.radarbase.auth.token; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.mapping; -import static java.util.stream.Collectors.toList; +import static java.util.Objects.requireNonNullElseGet; +import static java.util.stream.Collectors.toUnmodifiableSet; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; +import org.radarbase.auth.authorization.RoleAuthority; + import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; -import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Stream; /** * Implementation of {@link RadarToken} based on JWT tokens. @@ -26,8 +28,9 @@ public class JwtRadarToken extends AbstractRadarToken { public static final String SOURCES_CLAIM = "sources"; public static final String GRANT_TYPE_CLAIM = "grant_type"; public static final String CLIENT_ID_CLAIM = "client_id"; + public static final String USER_NAME_CLAIM = "user_name"; - private final Map> roles; + private final Set roles; private final List authorities; private final List scopes; private final List sources; @@ -41,6 +44,7 @@ public class JwtRadarToken extends AbstractRadarToken { private final String type; private final String clientId; private final DecodedJWT jwt; + private final String username; /** * Initialize this {@code JwtRadarToken} based on the {@link DecodedJWT}. All relevant @@ -51,8 +55,14 @@ public class JwtRadarToken extends AbstractRadarToken { */ public JwtRadarToken(DecodedJWT jwt) { this.jwt = jwt; - roles = parseRoles(jwt); authorities = emptyIfNull(jwt.getClaim(AUTHORITIES_CLAIM).asList(String.class)); + roles = Stream.concat( + authorities.stream() + .map(RoleAuthority::valueOfAuthorityOrNull) + .filter(r -> r != null && r.scope() == RoleAuthority.Scope.GLOBAL) + .map(AuthorityReference::new), + parseRoles(jwt)) + .collect(toUnmodifiableSet()); Claim scopeClaim = jwt.getClaim(SCOPE_CLAIM); String scopeClaimString = scopeClaim.asString(); @@ -61,16 +71,13 @@ public JwtRadarToken(DecodedJWT jwt) { scopes = Arrays.asList(scopeClaimString.split(" ")); } else { List scopeClaimList = scopeClaim.asList(String.class); - if (scopeClaimList != null) { - scopes = scopeClaimList; - } else { - scopes = Collections.emptyList(); - } + scopes = requireNonNullElseGet(scopeClaimList, Collections::emptyList); } sources = emptyIfNull(jwt.getClaim(SOURCES_CLAIM).asList(String.class)); grantType = emptyIfNull(jwt.getClaim(GRANT_TYPE_CLAIM).asString()); subject = emptyIfNull(jwt.getSubject()); + username = emptyIfNull(jwt.getClaim(USER_NAME_CLAIM).asString()); issuedAt = jwt.getIssuedAt(); expiresAt = jwt.getExpiresAt(); audience = emptyIfNull(jwt.getAudience()); @@ -81,7 +88,7 @@ public JwtRadarToken(DecodedJWT jwt) { } @Override - public Map> getRoles() { + public Set getRoles() { return roles; } @@ -110,6 +117,11 @@ public String getSubject() { return subject; } + @Override + public String getUsername() { + return username; + } + @Override public Date getIssuedAt() { return issuedAt; @@ -153,19 +165,19 @@ public String getClaimString(String name) { @Override public List getClaimList(String name) { try { - return jwt.getClaim(name).asList(String.class); + return emptyIfNull(jwt.getClaim(name).asList(String.class)); } catch (JWTDecodeException ex) { - return null; + return List.of(); } } - private Map> parseRoles(DecodedJWT jwt) { + private Stream parseRoles(DecodedJWT jwt) { return emptyIfNull(jwt.getClaim(ROLES_CLAIM).asList(String.class)).stream() - .filter(s -> s.contains(":")) - .distinct() + .filter(s -> s != null && !s.isBlank()) .map(ROLE_SEPARATOR_PATTERN::split) - .collect(groupingBy(s -> s[0], - mapping(s -> s[1], toList()))); + .map(v -> v.length == 1 || v[1].isEmpty() + ? new AuthorityReference(v[0]) + : new AuthorityReference(v[1], v[0])); } private static String emptyIfNull(String string) { @@ -173,6 +185,6 @@ private static String emptyIfNull(String string) { } private static List emptyIfNull(List list) { - return list != null ? list : Collections.emptyList(); + return requireNonNullElseGet(list, Collections::emptyList); } } diff --git a/radar-auth/src/main/java/org/radarbase/auth/token/RadarToken.java b/radar-auth/src/main/java/org/radarbase/auth/token/RadarToken.java index 8aa1dd864..96f0858b5 100644 --- a/radar-auth/src/main/java/org/radarbase/auth/token/RadarToken.java +++ b/radar-auth/src/main/java/org/radarbase/auth/token/RadarToken.java @@ -1,22 +1,61 @@ package org.radarbase.auth.token; import org.radarbase.auth.authorization.Permission; +import org.radarbase.auth.authorization.RoleAuthority; import java.util.Date; import java.util.List; -import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Stream; + +import static org.radarbase.auth.authorization.RoleAuthority.toEnumSet; /** * Created by dverbeec on 10/01/2018. */ public interface RadarToken { + /** + * Get all roles defined in this token. + * @return non-null set describing the roles defined in this token. + */ + Set getRoles(); + + default Stream getAuthorityReferencesWithPermission( + RoleAuthority.Scope scope, Permission permission) { + return getRoles().stream() + .filter(r -> r.getRole().scope() == scope && permission.isRoleAllowed(r.getRole())); + } + + /** + * Get the referents (i.e., organization or project name) in a given scope that matches a + * permission. + * @param scope scope of the referents + * @param permission permission that should be authorized within the scope + * @return referents names + */ + default Stream getReferentsWithPermission(RoleAuthority.Scope scope, + Permission permission) { + return getAuthorityReferencesWithPermission(scope, permission) + .map(AuthorityReference::getReferent) + .filter(Objects::nonNull); + } /** - * Get the roles defined in this token. - * @return non-null map describing the roles defined in this token. The keys in the map are the - * project names, and the values are lists of authority names associated to the project. + * Check if any non-project related authority has the given permission. Currently the only + * non-project authority is {@code SYS_ADMIN}, so we only check for that. + * @param permission the permission + * @return {@code true} if any non-project related authority has the permission, {@code false} + * otherwise */ - Map> getRoles(); + default boolean hasGlobalAuthorityForPermission(Permission permission) { + return Stream.concat( + getAuthorities().stream().map(RoleAuthority::valueOfAuthorityOrNull), + getRoles().stream().map(AuthorityReference::getRole)) + .anyMatch(r -> r != null + && r.scope() == RoleAuthority.Scope.GLOBAL + && permission.isRoleAllowed(r)); + } /** * Get a list of non-project related authorities. @@ -24,6 +63,17 @@ public interface RadarToken { */ List getAuthorities(); + /** + * Get a list of non-project related authorities. + * @return non-null list of authority names + */ + default Set getRoleAuthorities() { + return getAuthorities().stream() + .map(RoleAuthority::valueOfAuthorityOrNull) + .filter(Objects::nonNull) + .collect(toEnumSet(RoleAuthority.class)); + } + /** * Get a list of scopes assigned to this token. * @return non-null list of scope names @@ -48,6 +98,11 @@ public interface RadarToken { */ String getSubject(); + /** + * Get the token username. + */ + String getUsername(); + /** * Get the date this token was issued. * @return date this token was issued or null @@ -113,7 +168,7 @@ public interface RadarToken { * @param authority The permission to check * @return {@code true} if this token has the permission, {@code false} otherwise */ - boolean hasAuthority(String authority); + boolean hasAuthority(RoleAuthority authority); /** * Check if this token gives the given permission, not taking into account project affiliations. @@ -128,6 +183,37 @@ public interface RadarToken { */ boolean hasPermission(Permission permission); + /** + * Check if this token gives the given permission from a global scope. + * + *

This token must have the permission in its set of scopes. If it's a + * client credentials token, this is the only requirement, as a client credentials token is + * linked to an OAuth client and not to a user in the system. If it's not a client + * credentials token, this also checks to see if the user has a global role with the specified + * permission.

+ * @param permission The permission to check + * @return {@code true} if this token has the permission, {@code false} otherwise + */ + boolean hasGlobalPermission(Permission permission); + + /** + * Check if this token gives a permission in a specific organization. + * @param permission the permission + * @param organization the organization name + * @return true if this token has the permission in the project, false otherwise + */ + boolean hasPermissionOnOrganization(Permission permission, String organization); + + /** + * Check if this token gives a permission in a specific project in a given organization. + * @param permission the permission + * @param organization the organization name + * @param projectName the project name + * @return true if this token has the permission in the project, false otherwise + */ + boolean hasPermissionOnOrganizationAndProject(Permission permission, String organization, + String projectName); + /** * Check if this token gives a permission in a specific project. * @param permission the permission diff --git a/radar-auth/src/main/java/org/radarbase/auth/token/validation/deprecated/DeprecatedEcTokenValidationAlgorithm.java b/radar-auth/src/main/java/org/radarbase/auth/token/validation/deprecated/DeprecatedEcTokenValidationAlgorithm.java deleted file mode 100644 index 66ecced09..000000000 --- a/radar-auth/src/main/java/org/radarbase/auth/token/validation/deprecated/DeprecatedEcTokenValidationAlgorithm.java +++ /dev/null @@ -1,244 +0,0 @@ -package org.radarbase.auth.token.validation.deprecated; - -import java.io.StringReader; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.interfaces.ECPublicKey; -import java.security.spec.X509EncodedKeySpec; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.exceptions.SignatureGenerationException; -import com.auth0.jwt.exceptions.SignatureVerificationException; -import com.auth0.jwt.interfaces.DecodedJWT; -import shadow.org.bouncycastle.util.io.pem.PemReader; -import org.radarbase.auth.exception.ConfigurationException; -import org.radarbase.auth.token.validation.AbstractTokenValidationAlgorithm; -import shadow.com.auth0.jwt.exceptions.JWTDecodeException; -import shadow.com.auth0.jwt.interfaces.Claim; - -/** - * This is a deprecated algorithm to validate old tokens. - * Added to maintain compatibility with java-jwt:3.2.0 validators. - * - */ -@Deprecated -public class DeprecatedEcTokenValidationAlgorithm extends AbstractTokenValidationAlgorithm { - - @Override - public String getJwtAlgorithm() { - return "SHA256withECDSA"; - } - - @Override - public String getKeyHeader() { - return "-----BEGIN EC PUBLIC KEY-----"; - } - - @Override - /** - * Parse a public key in PEM format. - * @param publicKey the public key to parse - * @return a PublicKey object representing the supplied public key - */ - protected PublicKey parseKey(String publicKey) { - try (PemReader pemReader = new PemReader(new StringReader(publicKey))) { - byte[] keyBytes = pemReader.readPemObject().getContent(); - pemReader.close(); - X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); - KeyFactory kf = KeyFactory.getInstance(getKeyFactoryType()); - return kf.generatePublic(spec); - } catch (Exception ex) { - throw new ConfigurationException(ex); - } - } - - @Override - public Algorithm getAlgorithm(String publicKey) { - - shadow.com.auth0.jwt.algorithms.Algorithm deprecatedEcVerifier = - shadow.com.auth0.jwt.algorithms.Algorithm.ECDSA256( - (ECPublicKey) parseKey(publicKey), null); - return new Algorithm(deprecatedEcVerifier.getName(), getJwtAlgorithm()) { - @Override - public void verify(DecodedJWT jwt) throws SignatureVerificationException { - try { - deprecatedEcVerifier.verify(wrap(jwt)); - } catch (shadow.com.auth0.jwt.exceptions.SignatureVerificationException exe) { - throw new SignatureVerificationException(this, exe); - } - } - - @Override - public byte[] sign(byte[] contentBytes) throws SignatureGenerationException { - return deprecatedEcVerifier.sign(contentBytes); - } - }; - } - - private shadow.com.auth0.jwt.interfaces.DecodedJWT wrap(DecodedJWT jwt) { - return new shadow.com.auth0.jwt.interfaces.DecodedJWT() { - @Override - public String getToken() { - return jwt.getToken(); - } - - @Override - public String getHeader() { - return jwt.getHeader(); - } - - @Override - public String getPayload() { - return jwt.getPayload(); - } - - @Override - public String getSignature() { - return jwt.getSignature(); - } - - @Override - public String getAlgorithm() { - return jwt.getAlgorithm(); - } - - @Override - public String getType() { - return jwt.getType(); - } - - @Override - public String getContentType() { - return jwt.getContentType(); - } - - @Override - public String getKeyId() { - return jwt.getKeyId(); - } - - @Override - public Claim getHeaderClaim(String s) { - com.auth0.jwt.interfaces.Claim claim = jwt.getHeaderClaim(s); - return wrap(claim); - } - - @Override - public String getIssuer() { - return jwt.getIssuer(); - } - - @Override - public String getSubject() { - return jwt.getSubject(); - } - - @Override - public List getAudience() { - return jwt.getAudience(); - } - - @Override - public Date getExpiresAt() { - return jwt.getExpiresAt(); - } - - @Override - public Date getNotBefore() { - return jwt.getNotBefore(); - } - - @Override - public Date getIssuedAt() { - return jwt.getIssuedAt(); - } - - @Override - public String getId() { - return jwt.getId(); - } - - @Override - public Claim getClaim(String s) { - com.auth0.jwt.interfaces.Claim claim = jwt.getHeaderClaim(s); - return wrap(claim); - } - - @Override - public Map getClaims() { - Map claims = jwt.getClaims(); - return claims.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> wrap(e.getValue()))); - } - }; - } - - private Claim wrap(com.auth0.jwt.interfaces.Claim claim) { - return new Claim() { - @Override - public boolean isNull() { - return claim.isNull(); - } - - @Override - public Boolean asBoolean() { - return claim.asBoolean(); - } - - @Override - public Integer asInt() { - return claim.asInt(); - } - - @Override - public Long asLong() { - return claim.asLong(); - } - - @Override - public Double asDouble() { - return claim.asDouble(); - } - - @Override - public String asString() { - return claim.asString(); - } - - @Override - public Date asDate() { - return claim.asDate(); - } - - @Override - public T[] asArray(Class aClass) throws JWTDecodeException { - return claim.asArray(aClass); - } - - @Override - public List asList(Class aClass) throws JWTDecodeException { - return claim.asList(aClass); - } - - @Override - public Map asMap() throws JWTDecodeException { - return claim.asMap(); - } - - @Override - public T as(Class aClass) throws JWTDecodeException { - return claim.as(aClass); - } - }; - } - - @Override - protected String getKeyFactoryType() { - return "EC"; - } -} diff --git a/radar-auth/src/test/java/org/radarbase/auth/authentication/TokenValidatorTest.java b/radar-auth/src/test/java/org/radarbase/auth/authentication/TokenValidatorTest.java index 46a3334ae..b97e0ad14 100644 --- a/radar-auth/src/test/java/org/radarbase/auth/authentication/TokenValidatorTest.java +++ b/radar-auth/src/test/java/org/radarbase/auth/authentication/TokenValidatorTest.java @@ -35,7 +35,6 @@ public static void loadToken() throws Exception { wireMockServer = new WireMockServer(new WireMockConfiguration() .port(TokenTestUtils.WIREMOCK_PORT)); wireMockServer.start(); - TokenTestUtils.setUp(); } /** diff --git a/radar-auth/src/test/java/org/radarbase/auth/authorization/RadarAuthorizationTest.java b/radar-auth/src/test/java/org/radarbase/auth/authorization/RadarAuthorizationTest.java index cd80edff0..aa2fbcd99 100644 --- a/radar-auth/src/test/java/org/radarbase/auth/authorization/RadarAuthorizationTest.java +++ b/radar-auth/src/test/java/org/radarbase/auth/authorization/RadarAuthorizationTest.java @@ -1,8 +1,11 @@ package org.radarbase.auth.authorization; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; +import org.radarbase.auth.authorization.Permission.Entity; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.JwtRadarToken; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.auth.util.TokenTestUtils; import java.security.GeneralSecurityException; import java.util.Arrays; @@ -10,30 +13,21 @@ import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.radarbase.auth.authorization.Permission.Entity; -import org.radarbase.auth.exception.NotAuthorizedException; -import org.radarbase.auth.token.JwtRadarToken; -import org.radarbase.auth.token.RadarToken; -import org.radarbase.auth.util.TokenTestUtils; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.fail; /** * Created by dverbeec on 25/09/2017. */ class RadarAuthorizationTest { - - @BeforeAll - public static void loadToken() throws Exception { - TokenTestUtils.setUp(); - } - @Test void testCheckPermissionOnProject() throws NotAuthorizedException { String project = "PROJECT1"; // let's get all permissions a project admin has Set permissions = Permissions.getPermissionMatrix().entrySet().stream() - .filter(e -> e.getValue().contains(AuthoritiesConstants.PROJECT_ADMIN)) + .filter(e -> e.getValue().contains(RoleAuthority.PROJECT_ADMIN)) .map(Entry::getKey) .collect(Collectors.toSet()); RadarToken token = new JwtRadarToken(TokenTestUtils.PROJECT_ADMIN_TOKEN); @@ -42,7 +36,7 @@ void testCheckPermissionOnProject() throws NotAuthorizedException { } Set notPermitted = Permissions.getPermissionMatrix().entrySet().stream() - .filter(e -> !e.getValue().contains(AuthoritiesConstants.PROJECT_ADMIN)) + .filter(e -> !e.getValue().contains(RoleAuthority.PROJECT_ADMIN)) .map(Entry::getKey) .collect(Collectors.toSet()); @@ -51,10 +45,29 @@ void testCheckPermissionOnProject() throws NotAuthorizedException { String.format("Token should not have permission %s on project %s", p, project))); } + @Test + void testCheckPermissionOnOrganization() throws NotAuthorizedException { + JwtRadarToken token = new JwtRadarToken(TokenTestUtils.ORGANIZATION_ADMIN_TOKEN); + assertNotAuthorized(() -> { + RadarAuthorization.checkPermissionOnOrganization(token, Permission.ORGANIZATION_CREATE, + "main"); + }, "Token should not be able to create organization"); + RadarAuthorization.checkPermissionOnOrganization(token, Permission.PROJECT_CREATE, "main"); + RadarAuthorization.checkPermissionOnOrganizationAndProject(token, Permission.SUBJECT_CREATE, + "main", "PROJECT1"); + assertNotAuthorized(() -> RadarAuthorization.checkPermissionOnOrganization( + token, Permission.PROJECT_CREATE, "other"), + "Token should not be able to create organization"); + assertNotAuthorized(() -> RadarAuthorization.checkPermissionOnOrganizationAndProject( + token, Permission.SUBJECT_CREATE, "other", + "PROJECT1"), + "Token should not be able to create organization"); + } + @Test void testCheckPermission() throws NotAuthorizedException { RadarToken token = new JwtRadarToken(TokenTestUtils.SUPER_USER_TOKEN); - for (Permission p : Permission.allPermissions()) { + for (Permission p : Permission.values()) { RadarAuthorization.checkPermission(token, p); } } @@ -78,7 +91,7 @@ void testCheckPermissionOnOtherSubject() { // this token is participant in PROJECT2 RadarToken token = new JwtRadarToken(TokenTestUtils.PROJECT_ADMIN_TOKEN); String other = "other-subject"; - Permission.allPermissions() + Permission.stream() .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermissionOnSubject(token, p, project, other), "Token should not have permission " + p + " on another subject")); @@ -91,7 +104,7 @@ void testCheckPermissionOnSubject() throws NotAuthorizedException { // this token is participant in PROJECT2 RadarToken token = new JwtRadarToken(TokenTestUtils.PROJECT_ADMIN_TOKEN); String subject = "some-subject"; - Set permissions = Permission.allPermissions().stream() + Set permissions = Permission.stream() .filter(p -> p.getEntity() == Permission.Entity.SUBJECT) .collect(Collectors.toSet()); for (Permission p : permissions) { @@ -104,7 +117,7 @@ void testMultipleRolesInProjectToken() throws NotAuthorizedException { String project = "PROJECT2"; RadarToken token = new JwtRadarToken(TokenTestUtils.MULTIPLE_ROLES_IN_PROJECT_TOKEN); String subject = "some-subject"; - Set permissions = Permission.allPermissions().stream() + Set permissions = Permission.stream() .filter(p -> p.getEntity() == Permission.Entity.SUBJECT) .collect(Collectors.toSet()); for (Permission p : permissions) { @@ -120,7 +133,7 @@ void testCheckPermissionOnSource() { String subject = "some-subject"; String source = "source-1"; - Permission.allPermissions() + Permission.stream() .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermissionOnSource( token, p, project, subject, source), @@ -135,7 +148,7 @@ void testCheckPermissionOnOwnSource() throws NotAuthorizedException { String subject = token.getSubject(); String source = "source-1"; // source to use - Set permissions = Permission.allPermissions().stream() + Set permissions = Permission.stream() .filter(p -> p.getEntity() == Entity.MEASUREMENT) .collect(Collectors.toSet()); @@ -160,25 +173,25 @@ void testScopeOnlyToken() throws NotAuthorizedException { } // test we can do nothing else, for each of the checkPermission methods - Permission.allPermissions().stream() + Permission.stream() .filter(p -> !scope.contains(p)) .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermission(token, p), "Permission " + p + " is granted but not in scope.")); - Permission.allPermissions().stream() + Permission.stream() .filter(p -> !scope.contains(p)) .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermissionOnProject(token, p, ""), "Permission " + p + " is granted but not in scope.")); - Permission.allPermissions().stream() + Permission.stream() .filter(p -> !scope.contains(p)) .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermissionOnSubject(token, p, "", ""), "Permission " + p + " is granted but not in scope.")); - Permission.allPermissions().stream() + Permission.stream() .filter(p -> !scope.contains(p)) .forEach(p -> assertNotAuthorized( () -> RadarAuthorization.checkPermissionOnSource(token, p, "", "", ""), diff --git a/radar-auth/src/test/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfigTest.java b/radar-auth/src/test/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfigTest.java index f7c8577ea..c5fe7e81b 100644 --- a/radar-auth/src/test/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfigTest.java +++ b/radar-auth/src/test/java/org/radarbase/auth/config/TokenVerifierPublicKeyConfigTest.java @@ -1,19 +1,16 @@ package org.radarbase.auth.config; -import static org.hamcrest.CoreMatchers.hasItems; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.contrib.java.lang.system.EnvironmentVariables; +import org.junit.jupiter.api.Test; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.List; -import org.junit.jupiter.api.Test; -import org.junit.contrib.java.lang.system.EnvironmentVariables; -import org.radarbase.auth.token.validation.ECTokenValidationAlgorithm; -import org.radarbase.auth.token.validation.RSATokenValidationAlgorithm; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -45,9 +42,5 @@ private void checkConfig(TokenValidatorConfig config) throws URISyntaxException new URI("http://localhost:8089/oauth/token_key"))); assertEquals(2, uris.size()); assertEquals("unit_test", config.getResourceName()); - assertEquals(2, config.getPublicKeys().size()); - List algs = config.getPublicKeys(); - assertThat(algs, hasItems(startsWith(new ECTokenValidationAlgorithm().getKeyHeader()), - startsWith(new RSATokenValidationAlgorithm().getKeyHeader()))); } } diff --git a/radar-auth/src/test/java/org/radarbase/auth/token/AbstractRadarTokenTest.java b/radar-auth/src/test/java/org/radarbase/auth/token/AbstractRadarTokenTest.java index a5fd08439..38f04ee93 100644 --- a/radar-auth/src/test/java/org/radarbase/auth/token/AbstractRadarTokenTest.java +++ b/radar-auth/src/test/java/org/radarbase/auth/token/AbstractRadarTokenTest.java @@ -2,22 +2,22 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.SYS_ADMIN; import static org.radarbase.auth.authorization.Permission.MEASUREMENT_CREATE; import static org.radarbase.auth.token.AbstractRadarToken.CLIENT_CREDENTIALS; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Set; + import org.junit.jupiter.api.Test; class AbstractRadarTokenTest { static class MockToken extends AbstractRadarToken { - private final Map> roles = new HashMap<>(); + private final Set roles = new HashSet<>(); private final List sources = new ArrayList<>(); private final List scopes = new ArrayList<>(); private String grantType = "refresh_token"; @@ -25,7 +25,7 @@ static class MockToken extends AbstractRadarToken { private String subject = null; @Override - public Map> getRoles() { + public Set getRoles() { return roles; } @@ -54,6 +54,11 @@ public String getSubject() { return subject; } + @Override + public String getUsername() { + return subject; + } + @Override public Date getIssuedAt() { return null; @@ -66,7 +71,7 @@ public Date getExpiresAt() { @Override public List getAudience() { - return null; + return List.of(); } @Override @@ -96,7 +101,7 @@ public String getClaimString(String name) { @Override public List getClaimList(String name) { - return null; + return List.of(); } } @@ -116,23 +121,23 @@ void notHasPermissionWithoutAuthority() { @Test void hasPermissionAsAdmin() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.authorities.add(SYS_ADMIN); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.authorities.add(SYS_ADMIN.authority()); assertTrue(token.hasPermission(MEASUREMENT_CREATE)); } @Test void hasPermissionAsUser() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.roles.put("some", Collections.singletonList(PARTICIPANT)); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.roles.add(new AuthorityReference(PARTICIPANT, "some")); assertTrue(token.hasPermission(MEASUREMENT_CREATE)); } @Test void hasPermissionAsClient() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); + token.scopes.add(MEASUREMENT_CREATE.scope()); token.grantType = CLIENT_CREDENTIALS; assertTrue(token.hasPermission(MEASUREMENT_CREATE)); } @@ -153,24 +158,24 @@ void notHasPermissioOnProjectnWithoutAuthority() { @Test void hasPermissionOnProjectAsAdmin() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.authorities.add(SYS_ADMIN); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.authorities.add(SYS_ADMIN.authority()); assertTrue(token.hasPermissionOnProject(MEASUREMENT_CREATE, "project")); } @Test void hasPermissionOnProjectAsUser() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.roles.put("project", Collections.singletonList(PARTICIPANT)); - assertTrue(token.hasPermissionOnProject(MEASUREMENT_CREATE, "project")); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.roles.add(new AuthorityReference(PARTICIPANT, "project")); + assertFalse(token.hasPermissionOnProject(MEASUREMENT_CREATE, "project")); assertFalse(token.hasPermissionOnProject(MEASUREMENT_CREATE, "otherProject")); } @Test void hasPermissionOnProjectAsClient() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); + token.scopes.add(MEASUREMENT_CREATE.scope()); token.grantType = CLIENT_CREDENTIALS; assertTrue(token.hasPermissionOnProject(MEASUREMENT_CREATE, "project")); } @@ -192,16 +197,16 @@ void notHasPermissioOnSubjectnWithoutAuthority() { @Test void hasPermissionOnSubjectAsAdmin() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.authorities.add(SYS_ADMIN); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.authorities.add(SYS_ADMIN.authority()); assertTrue(token.hasPermissionOnSubject(MEASUREMENT_CREATE, "project", "subject")); } @Test void hasPermissionOnSubjectAsUser() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); - token.roles.put("project", Collections.singletonList(PARTICIPANT)); + token.scopes.add(MEASUREMENT_CREATE.scope()); + token.roles.add(new AuthorityReference(PARTICIPANT, "project")); token.subject = "subject"; assertTrue(token.hasPermissionOnSubject(MEASUREMENT_CREATE, "project", "subject")); assertFalse(token.hasPermissionOnSubject(MEASUREMENT_CREATE, "otherProject", "subject")); @@ -211,7 +216,7 @@ void hasPermissionOnSubjectAsUser() { @Test void hasPermissionOnSubjectAsClient() { MockToken token = new MockToken(); - token.scopes.add(MEASUREMENT_CREATE.scopeName()); + token.scopes.add(MEASUREMENT_CREATE.scope()); token.grantType = CLIENT_CREDENTIALS; assertTrue(token.hasPermissionOnSubject(MEASUREMENT_CREATE, "project", "subject")); } diff --git a/radar-auth/src/test/java/org/radarbase/auth/util/TokenTestUtils.java b/radar-auth/src/test/java/org/radarbase/auth/util/TokenTestUtils.java index a3e7a828f..3536be508 100644 --- a/radar-auth/src/test/java/org/radarbase/auth/util/TokenTestUtils.java +++ b/radar-auth/src/test/java/org/radarbase/auth/util/TokenTestUtils.java @@ -1,37 +1,40 @@ package org.radarbase.auth.util; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.auth0.jwt.interfaces.RSAKeyProvider; +import org.radarbase.auth.authorization.Permission; + +import java.io.IOException; import java.io.InputStream; +import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.time.Instant; +import java.util.Base64; import java.util.Date; -import java.util.stream.Collectors; - -import com.auth0.jwt.JWT; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import org.apache.commons.codec.binary.Base64; -import org.radarbase.auth.authorization.Permission; /** - * Created by dverbeec on 29/06/2017. + * Sets up a keypair for signing the tokens, initialize all kinds of different tokens for tests. */ public final class TokenTestUtils { public static final String PUBLIC_KEY = "/oauth/token_key"; - public static String PUBLIC_KEY_BODY; - public static String VALID_RSA_TOKEN; - public static String INCORRECT_AUDIENCE_TOKEN; - public static String EXPIRED_TOKEN; - public static String INCORRECT_ALGORITHM_TOKEN; - public static DecodedJWT SCOPE_TOKEN; - public static DecodedJWT PROJECT_ADMIN_TOKEN; - public static DecodedJWT SUPER_USER_TOKEN; - public static DecodedJWT MULTIPLE_ROLES_IN_PROJECT_TOKEN; + public static final String PUBLIC_KEY_BODY; + public static final String VALID_RSA_TOKEN; + public static final String INCORRECT_AUDIENCE_TOKEN; + public static final String EXPIRED_TOKEN; + public static final String INCORRECT_ALGORITHM_TOKEN; + public static final DecodedJWT SCOPE_TOKEN; + public static final DecodedJWT ORGANIZATION_ADMIN_TOKEN; + public static final DecodedJWT PROJECT_ADMIN_TOKEN; + public static final DecodedJWT SUPER_USER_TOKEN; + public static final DecodedJWT MULTIPLE_ROLES_IN_PROJECT_TOKEN; public static final String[] AUTHORITIES = {"ROLE_SYS_ADMIN", "ROLE_USER"}; - public static final String[] ALL_SCOPES = allScopes(); + public static final String[] ALL_SCOPES = Permission.scopes(); public static final String[] ROLES = {"PROJECT1:ROLE_PROJECT_ADMIN", "PROJECT2:ROLE_PARTICIPANT"}; public static final String[] SOURCES = {}; @@ -39,7 +42,7 @@ public final class TokenTestUtils { public static final String USER = "admin"; public static final String ISS = "RADAR"; public static final String JTI = "some-jwt-id"; - public static String PUBLIC_KEY_STRING; + public static final String PUBLIC_KEY_STRING; public static final String APPLICATION_JSON = "application/json"; public static final int WIREMOCK_PORT = 8089; @@ -48,11 +51,41 @@ private TokenTestUtils() { // utility class } - /** - * Set up a keypair for signing the tokens, initialize all kinds of different tokens for tests. - * @throws Exception If anything goes wrong during setup - */ - public static void setUp() throws Exception { + static { + RSAKeyProvider provider; + try { + provider = loadKeys(); + } catch (GeneralSecurityException | IOException e) { + throw new IllegalStateException("Failed to load keys for test", e); + } + RSAPublicKey publicKey = provider.getPublicKeyById("selfsigned"); + PUBLIC_KEY_STRING = new String(Base64.getEncoder().encode( + provider.getPublicKeyById("selfsigned").getEncoded())); + Algorithm algorithm = Algorithm.RSA256(publicKey, provider.getPrivateKey()); + + PUBLIC_KEY_BODY = "{\n \"keys\" : [ {\n \"alg\" : \"" + algorithm.getName() + + "\",\n \"alg\" : \"RSA\",\n" + + " \"value\" : \"-----BEGIN PUBLIC KEY-----\\n" + PUBLIC_KEY_STRING + + "\\n-----END PUBLIC KEY-----\"\n} ]\n}"; + + Instant exp = Instant.now().plusSeconds(30 * 60); + Instant iat = Instant.now(); + + VALID_RSA_TOKEN = initValidToken(algorithm, exp, iat); + SUPER_USER_TOKEN = JWT.decode(VALID_RSA_TOKEN); + PROJECT_ADMIN_TOKEN = initProjectAdminToken(algorithm, exp, iat); + ORGANIZATION_ADMIN_TOKEN = initOrgananizationAdminToken(algorithm, exp, iat); + MULTIPLE_ROLES_IN_PROJECT_TOKEN = initMultipleRolesToken(algorithm, exp, iat); + INCORRECT_AUDIENCE_TOKEN = initIncorrectAudienceToken(algorithm, exp, iat); + SCOPE_TOKEN = initTokenWithScopes(algorithm, exp, iat); + INCORRECT_ALGORITHM_TOKEN = initIncorrectAlgorithmToken(exp, iat); + + Instant past = Instant.now().minusSeconds(1); + Instant iatpast = Instant.now().minusSeconds(30 * 60 + 1); + EXPIRED_TOKEN = initExpiredToken(algorithm, past, iatpast); + } + + private static RSAKeyProvider loadKeys() throws GeneralSecurityException, IOException { KeyStore ks = KeyStore.getInstance("PKCS12"); try (InputStream keyStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("keystore.p12")) { @@ -61,35 +94,26 @@ public static void setUp() throws Exception { RSAPrivateKey privateKey = (RSAPrivateKey) ks.getKey("selfsigned", "radarbase".toCharArray()); Certificate cert = ks.getCertificate("selfsigned"); - RSAPublicKey publicKey = (RSAPublicKey) cert.getPublicKey(); - PUBLIC_KEY_STRING = new String(new Base64().encode(publicKey.getEncoded())); - initVars(PUBLIC_KEY_STRING, Algorithm.RSA256(publicKey, privateKey)); - } - - private static void initVars(String publicKey, Algorithm algorithm) { - PUBLIC_KEY_BODY = - "{\n" + " \"keys\" : [ {\n" + " \"alg\" : \"" + algorithm.getName() + "\",\n" - + " \"alg\" : \"" + "RSA" + "\",\n" - + " \"value\" : \"-----BEGIN PUBLIC KEY-----\\n" + publicKey - + "\\n-----END PUBLIC " + "KEY-----\"\n" + "} ]\n" + "}"; + return new RSAKeyProvider() { + @Override + public RSAPublicKey getPublicKeyById(String keyId) { + return (RSAPublicKey) cert.getPublicKey(); + } - Instant exp = Instant.now().plusSeconds(30 * 60); - Instant iat = Instant.now(); - - initValidToken(algorithm, exp, iat); - initProjectAdminToken(algorithm, exp, iat); - initMultipleRolesToken(algorithm, exp, iat); - initIncorrectAudienceToken(algorithm, exp, iat); - initTokenWithScopes(algorithm, exp, iat); - initIncorrectAlgorithmToken(exp, iat); + @Override + public RSAPrivateKey getPrivateKey() { + return privateKey; + } - Instant past = Instant.now().minusSeconds(1); - Instant iatpast = Instant.now().minusSeconds(30 * 60 + 1); - initExpiredToken(algorithm, past, iatpast); + @Override + public String getPrivateKeyId() { + return null; + } + }; } - private static void initExpiredToken(Algorithm algorithm, Instant past, Instant iatpast) { - EXPIRED_TOKEN = JWT.create() + private static String initExpiredToken(Algorithm algorithm, Instant past, Instant iatpast) { + return JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iatpast)) .withExpiresAt(Date.from(past)) @@ -106,10 +130,10 @@ private static void initExpiredToken(Algorithm algorithm, Instant past, Instant .sign(algorithm); } - private static void initIncorrectAlgorithmToken(Instant exp, Instant iat) { + private static String initIncorrectAlgorithmToken(Instant exp, Instant iat) { Algorithm psk = Algorithm.HMAC256("super-secret-stuff"); // token signed with a pre-shared key - INCORRECT_ALGORITHM_TOKEN = JWT.create() + return JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) .withExpiresAt(Date.from(exp)) @@ -126,8 +150,9 @@ private static void initIncorrectAlgorithmToken(Instant exp, Instant iat) { .sign(psk); } - private static void initIncorrectAudienceToken(Algorithm algorithm, Instant exp, Instant iat) { - INCORRECT_AUDIENCE_TOKEN = JWT.create() + private static String initIncorrectAudienceToken(Algorithm algorithm, Instant exp, + Instant iat) { + return JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) .withExpiresAt(Date.from(exp)) @@ -144,7 +169,8 @@ private static void initIncorrectAudienceToken(Algorithm algorithm, Instant exp, .sign(algorithm); } - private static void initMultipleRolesToken(Algorithm algorithm, Instant exp, Instant iat) { + private static DecodedJWT initMultipleRolesToken(Algorithm algorithm, Instant exp, + Instant iat) { String multipleRolesInProjectToken = JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) @@ -162,10 +188,31 @@ private static void initMultipleRolesToken(Algorithm algorithm, Instant exp, Ins .withClaim("grant_type", "password") .sign(algorithm); - MULTIPLE_ROLES_IN_PROJECT_TOKEN = JWT.decode(multipleRolesInProjectToken); + return JWT.decode(multipleRolesInProjectToken); + } + + private static DecodedJWT initOrgananizationAdminToken(Algorithm algorithm, Instant exp, + Instant iat) { + String projectAdminToken = JWT.create() + .withIssuer(ISS) + .withIssuedAt(Date.from(iat)) + .withExpiresAt(Date.from(exp)) + .withAudience(CLIENT) + .withSubject(USER) + .withArrayClaim("scope", ALL_SCOPES) + .withArrayClaim("authorities", new String[] {"ROLE_ORGANIZATION_ADMIN"}) + .withArrayClaim("roles", new String[] {"main:ROLE_ORGANIZATION_ADMIN"}) + .withArrayClaim("sources", new String[] {}) + .withClaim("client_id", CLIENT) + .withClaim("user_name", USER) + .withClaim("jti", JTI) + .withClaim("grant_type", "password") + .sign(algorithm); + + return JWT.decode(projectAdminToken); } - private static void initProjectAdminToken(Algorithm algorithm, Instant exp, Instant iat) { + private static DecodedJWT initProjectAdminToken(Algorithm algorithm, Instant exp, Instant iat) { String projectAdminToken = JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) @@ -183,11 +230,11 @@ private static void initProjectAdminToken(Algorithm algorithm, Instant exp, Inst .withClaim("grant_type", "password") .sign(algorithm); - PROJECT_ADMIN_TOKEN = JWT.decode(projectAdminToken); + return JWT.decode(projectAdminToken); } - private static void initValidToken(Algorithm algorithm, Instant exp, Instant iat) { - VALID_RSA_TOKEN = JWT.create() + private static String initValidToken(Algorithm algorithm, Instant exp, Instant iat) { + return JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) .withExpiresAt(Date.from(exp)) @@ -202,10 +249,9 @@ private static void initValidToken(Algorithm algorithm, Instant exp, Instant iat .withClaim("jti", JTI) .withClaim("grant_type", "password") .sign(algorithm); - SUPER_USER_TOKEN = JWT.decode(VALID_RSA_TOKEN); } - private static void initTokenWithScopes(Algorithm algorithm, Instant exp, Instant iat) { + private static DecodedJWT initTokenWithScopes(Algorithm algorithm, Instant exp, Instant iat) { String token = JWT.create() .withIssuer(ISS) .withIssuedAt(Date.from(iat)) @@ -218,13 +264,6 @@ private static void initTokenWithScopes(Algorithm algorithm, Instant exp, Instan .withClaim("jti", JTI) .withClaim("grant_type", "client_credentials") .sign(algorithm); - SCOPE_TOKEN = JWT.decode(token); - } - - private static String[] allScopes() { - return Permission.allPermissions().stream() - .map(Permission::scopeName) - .collect(Collectors.toList()) - .toArray(new String[Permission.allPermissions().size()]); + return JWT.decode(token); } } diff --git a/radar-auth/src/test/resources/radar-is-2.yml b/radar-auth/src/test/resources/radar-is-2.yml index 52feaa416..655432337 100644 --- a/radar-auth/src/test/resources/radar-is-2.yml +++ b/radar-auth/src/test/resources/radar-is-2.yml @@ -1,10 +1 @@ resourceName: unit_test -publicKeys: - - |- - -----BEGIN PUBLIC KEY----- - MIICHDANBgkqhkiG9w0BAQEFAAOCAgkAMIICBAKCAfsAqM4o+hVAdF2QATQBmpehSMyhdqKvwh9mrfnxDNtctZYlpiQXMbq4uqRgp98aBy6bMKKr3k0rSXTzr27Y+tdLUWXqbl4y8kKm8rGZo9gTbPyhqPm4f4OIxMRJcuhQ7f8qBY87w9buzClQeUs3h5f+DUVRUfB9FnDtim+ma3mFqYh38TMnrBapCtG+7iVKRFgGv6JWiNTql+oVBPNuUX3koc5/zO6IhrD49vBbsjaRWTJV2xMNll82gPvVLtgQNA2t7iGnUPhfKDj1NInZeg79NzFnWAa9Jtc1r2Q7D68MiJhYZN2QAlZS1GfbELnRAeUmSxT5i3BHu23iz9zluhIhYe1vhA1QWk2HsriGL9w+iFqzYlk5P3GCAE+nfNmM/6GIp1ehzW+/4+xgik5rOakCWw4vewmSBWOrV/XZvT2ZT3AA6zIByWdERyMOVJmd9rqPH1FIDtQk8h2jFTqIvBda727DHXeUB9J4hHQTzQmvOxPMipwDslxWOjnG4nbq6Exme0o/ELMOxt+4APH6KW+LqCNl5jGdbKxySLQyNgfUjhXJ06U1b8JHPheTnWcKO+cMmhyheUkZmLMLK2mlAsR+JJeBDY1/jd7+q6hgymeJzoDoXJj4LARiYZ+StRr/E0+P8DrprWYZPi496VIzwgV8otV9fVz29V501rcCAwEAAQ== - -----END PUBLIC KEY----- - - |- - -----BEGIN EC PUBLIC KEY----- - MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvmBia5inhASHAVrFBB5JAh0ne/aKb6z/sCIuWzKp/azFcD/OPJ2H6RPLn3t7XA4oAa2FR3GB4ZhU7SCh20FUhA== - -----END EC PUBLIC KEY----- diff --git a/radar-auth/src/test/resources/radar-is.yml b/radar-auth/src/test/resources/radar-is.yml index 990dbd032..81aee0bbb 100644 --- a/radar-auth/src/test/resources/radar-is.yml +++ b/radar-auth/src/test/resources/radar-is.yml @@ -2,12 +2,3 @@ resourceName: unit_test publicKeyEndpoints: - http://localhost:8089/oauth/token_key - http://localhost:8089/oauth/token_key # in our tests we only have one wiremock port open, so we have two times the same uri -publicKeys: - - |- - -----BEGIN PUBLIC KEY----- - MIICHDANBgkqhkiG9w0BAQEFAAOCAgkAMIICBAKCAfsAqM4o+hVAdF2QATQBmpehSMyhdqKvwh9mrfnxDNtctZYlpiQXMbq4uqRgp98aBy6bMKKr3k0rSXTzr27Y+tdLUWXqbl4y8kKm8rGZo9gTbPyhqPm4f4OIxMRJcuhQ7f8qBY87w9buzClQeUs3h5f+DUVRUfB9FnDtim+ma3mFqYh38TMnrBapCtG+7iVKRFgGv6JWiNTql+oVBPNuUX3koc5/zO6IhrD49vBbsjaRWTJV2xMNll82gPvVLtgQNA2t7iGnUPhfKDj1NInZeg79NzFnWAa9Jtc1r2Q7D68MiJhYZN2QAlZS1GfbELnRAeUmSxT5i3BHu23iz9zluhIhYe1vhA1QWk2HsriGL9w+iFqzYlk5P3GCAE+nfNmM/6GIp1ehzW+/4+xgik5rOakCWw4vewmSBWOrV/XZvT2ZT3AA6zIByWdERyMOVJmd9rqPH1FIDtQk8h2jFTqIvBda727DHXeUB9J4hHQTzQmvOxPMipwDslxWOjnG4nbq6Exme0o/ELMOxt+4APH6KW+LqCNl5jGdbKxySLQyNgfUjhXJ06U1b8JHPheTnWcKO+cMmhyheUkZmLMLK2mlAsR+JJeBDY1/jd7+q6hgymeJzoDoXJj4LARiYZ+StRr/E0+P8DrprWYZPi496VIzwgV8otV9fVz29V501rcCAwEAAQ== - -----END PUBLIC KEY----- - - |- - -----BEGIN EC PUBLIC KEY----- - MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvmBia5inhASHAVrFBB5JAh0ne/aKb6z/sCIuWzKp/azFcD/OPJ2H6RPLn3t7XA4oAa2FR3GB4ZhU7SCh20FUhA== - -----END EC PUBLIC KEY----- diff --git a/settings.gradle b/settings.gradle index e036a7f96..bb323b41a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,4 @@ rootProject.name = 'management-portal' include ':oauth-client-util' include ':radar-auth' -include ':radar-auth:deprecated-auth0' include ':managementportal-client' diff --git a/src/gatling/scala/ManagementPortalSimulation.scala b/src/gatling/scala/ManagementPortalSimulation.scala index 59d02fba0..40edbc7aa 100644 --- a/src/gatling/scala/ManagementPortalSimulation.scala +++ b/src/gatling/scala/ManagementPortalSimulation.scala @@ -52,7 +52,7 @@ abstract class ManagementPortalSimulation extends Simulation { def run(): Unit = { val users = scenario("Users").exec(scn) setUp( - users.inject(rampUsers(100) during (1 minutes)) + users.inject(rampUsers(100) during (1.minutes)) ).protocols(httpConf) } } diff --git a/src/gatling/scala/ProjectGatlingTest.scala b/src/gatling/scala/ProjectGatlingTest.scala index 34eeac696..fde7b673d 100644 --- a/src/gatling/scala/ProjectGatlingTest.scala +++ b/src/gatling/scala/ProjectGatlingTest.scala @@ -39,7 +39,7 @@ class ProjectGatlingTest extends ManagementPortalSimulation { .get("/api/projects") .headers(headers_http_authenticated) .check(status.is(200))) - .pause(5 seconds, 10 seconds) + .pause(5.seconds, 10.seconds) .feed(randomString) .exec(http("Create new project") .post("/api/projects") diff --git a/src/gatling/scala/SensorDataGatlingTest.scala b/src/gatling/scala/SensorDataGatlingTest.scala index 1dd0f9de5..d438006b0 100644 --- a/src/gatling/scala/SensorDataGatlingTest.scala +++ b/src/gatling/scala/SensorDataGatlingTest.scala @@ -50,7 +50,7 @@ class SensorDataGatlingTest extends ManagementPortalSimulation { .get("/api/source-data") .headers(headers_http_authenticated) .check(status.is(200))) - .pause(5 seconds, 10 seconds) + .pause(5.seconds, 10.seconds) .feed(randomString) .exec(http("Create new sourceData") .post("/api/source-data") diff --git a/src/gatling/scala/SourceGatlingTest.scala b/src/gatling/scala/SourceGatlingTest.scala index 381d9fb5b..fce209ffe 100644 --- a/src/gatling/scala/SourceGatlingTest.scala +++ b/src/gatling/scala/SourceGatlingTest.scala @@ -47,7 +47,7 @@ class SourceGatlingTest extends ManagementPortalSimulation { .get("/api/sources") .headers(headers_http_authenticated) .check(status.is(200))) - .pause(5 seconds, 10 seconds) + .pause(5.seconds, 10.seconds) .feed(randomString) .exec(http("Create new source") .post("/api/sources") diff --git a/src/gatling/scala/SourceTypeGatlingTest.scala b/src/gatling/scala/SourceTypeGatlingTest.scala index 2e47c6ccf..56461e83c 100644 --- a/src/gatling/scala/SourceTypeGatlingTest.scala +++ b/src/gatling/scala/SourceTypeGatlingTest.scala @@ -38,7 +38,7 @@ class SourceTypeGatlingTest extends ManagementPortalSimulation { .get("/api/source-types") .headers(headers_http_authenticated) .check(status.is(200))) - .pause(5 seconds, 10 seconds) + .pause(5.seconds, 10.seconds) .feed(randomString) .exec(http("Create new sourceType") .post("/api/source-types") diff --git a/src/gatling/scala/SubjectGatlingTest.scala b/src/gatling/scala/SubjectGatlingTest.scala index 08ce58848..baea1fdf3 100644 --- a/src/gatling/scala/SubjectGatlingTest.scala +++ b/src/gatling/scala/SubjectGatlingTest.scala @@ -44,7 +44,7 @@ class SubjectGatlingTest extends ManagementPortalSimulation { .get("/api/subjects") .headers(headers_http_authenticated) .check(status.is(200))) - .pause(5 seconds, 10 seconds) + .pause(5.seconds, 10.seconds) .feed(randomString) .exec(http("Create new subject") .post("/api/subjects") diff --git a/src/main/docker/app.yml b/src/main/docker/app.yml index db58cf512..902e30f3b 100644 --- a/src/main/docker/app.yml +++ b/src/main/docker/app.yml @@ -3,7 +3,7 @@ services: managementportal-app: image: managementportal environment: - - SPRING_PROFILES_ACTIVE=prod,swagger + - SPRING_PROFILES_ACTIVE=prod,api-docs - SPRING_DATASOURCE_URL=jdbc:postgresql://managementportal-postgresql:5432/managementportal - SPRING_DATASOURCE_USERNAME=radarbase - SPRING_DATASOURCE_PASSWORD=radarbase diff --git a/src/main/docker/management-portal.yml b/src/main/docker/management-portal.yml index 88fb4fcc4..7ea6fc1c4 100644 --- a/src/main/docker/management-portal.yml +++ b/src/main/docker/management-portal.yml @@ -3,7 +3,7 @@ services: managementportal-app: image: radarbase/management-portal environment: - - SPRING_PROFILES_ACTIVE=prod,swagger + - SPRING_PROFILES_ACTIVE=prod,api-docs - SPRING_DATASOURCE_URL=jdbc:postgresql://managementportal-postgresql:5432/managementportal - SPRING_DATASOURCE_USERNAME=radarbase - SPRING_DATASOURCE_PASSWORD=radarbase diff --git a/src/main/java/org/radarbase/management/ApplicationWebXml.java b/src/main/java/org/radarbase/management/ApplicationWebXml.java deleted file mode 100644 index 94b27fb01..000000000 --- a/src/main/java/org/radarbase/management/ApplicationWebXml.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.radarbase.management; - -import org.radarbase.management.config.DefaultProfileUtil; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -/** - * This is a helper Java class that provides an alternative to creating a web.xml. This will be - * invoked only when the application is deployed to a servlet container like Tomcat, JBoss etc. - */ -public class ApplicationWebXml extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - /** - * set a default to use when no profile is configured. - */ - DefaultProfileUtil.addDefaultProfile(application.application()); - return application.sources(ManagementPortalApp.class); - } -} diff --git a/src/main/java/org/radarbase/management/ManagementPortalApp.java b/src/main/java/org/radarbase/management/ManagementPortalApp.java index 3b3c03239..c62844276 100644 --- a/src/main/java/org/radarbase/management/ManagementPortalApp.java +++ b/src/main/java/org/radarbase/management/ManagementPortalApp.java @@ -1,13 +1,11 @@ package org.radarbase.management; -import io.github.jhipster.config.JHipsterConstants; +import tech.jhipster.config.DefaultProfileUtil; +import tech.jhipster.config.JHipsterConstants; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; import javax.annotation.PostConstruct; import org.radarbase.management.config.ApplicationProperties; -import org.radarbase.management.config.DefaultProfileUtil; import org.radarbase.management.config.ManagementPortalProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,9 +13,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.ComponentScan; import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; @ComponentScan({ "org.radarbase.management.config", @@ -28,7 +26,6 @@ "org.radarbase.management.security", "org.radarbase.management.web" }) -@EnableZuulProxy @EnableAutoConfiguration @EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class, ManagementPortalProperties.class}) @@ -55,14 +52,13 @@ public ManagementPortalApp(Environment env) { */ @PostConstruct public void initApplication() { - Collection activeProfiles = Arrays.asList(env.getActiveProfiles()); - if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles - .contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) + && env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_PRODUCTION))) { log.error("You have misconfigured your application! It should not run " + "with both the 'dev' and 'prod' profiles at the same time."); } - if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles - .contains(JHipsterConstants.SPRING_PROFILE_CLOUD)) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) + && env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_CLOUD))) { log.error("You have misconfigured your application! It should not" + "run with both the 'dev' and 'cloud' profiles at the same time."); } diff --git a/src/main/java/org/radarbase/management/aop/logging/LoggingAspect.java b/src/main/java/org/radarbase/management/aop/logging/LoggingAspect.java index 47ef9cc23..3e912af1e 100644 --- a/src/main/java/org/radarbase/management/aop/logging/LoggingAspect.java +++ b/src/main/java/org/radarbase/management/aop/logging/LoggingAspect.java @@ -1,6 +1,7 @@ package org.radarbase.management.aop.logging; -import io.github.jhipster.config.JHipsterConstants; +import org.springframework.core.env.Profiles; +import tech.jhipster.config.JHipsterConstants; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; @@ -21,7 +22,6 @@ */ @Aspect public class LoggingAspect { - private static final Logger log = LoggerFactory.getLogger(LoggingAspect.class); private final Environment env; @@ -48,8 +48,8 @@ public void loggingPointcut() { */ @AfterThrowing(pointcut = "loggingPointcut()", throwing = "e") public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - log.error("Exception in {}.{}() with cause = \'{}\' and exception = \'{}\'", + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + log.error("Exception in {}.{}() with cause = '{}' and exception = '{}'", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL", e.getMessage(), e); diff --git a/src/main/java/org/radarbase/management/config/AsyncConfiguration.java b/src/main/java/org/radarbase/management/config/AsyncConfiguration.java index 5c02ac8e8..485a9dbf9 100644 --- a/src/main/java/org/radarbase/management/config/AsyncConfiguration.java +++ b/src/main/java/org/radarbase/management/config/AsyncConfiguration.java @@ -1,7 +1,7 @@ package org.radarbase.management.config; -import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; -import io.github.jhipster.config.JHipsterProperties; +import tech.jhipster.async.ExceptionHandlingAsyncTaskExecutor; +import tech.jhipster.config.JHipsterProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; diff --git a/src/main/java/org/radarbase/management/config/CacheConfiguration.java b/src/main/java/org/radarbase/management/config/CacheConfiguration.java index 41d1cef3d..41b56bf88 100644 --- a/src/main/java/org/radarbase/management/config/CacheConfiguration.java +++ b/src/main/java/org/radarbase/management/config/CacheConfiguration.java @@ -1,28 +1,36 @@ package org.radarbase.management.config; +import com.hazelcast.config.AttributeConfig; import com.hazelcast.config.Config; import com.hazelcast.config.EvictionPolicy; +import com.hazelcast.config.IndexConfig; +import com.hazelcast.config.IndexType; import com.hazelcast.config.MapConfig; -import com.hazelcast.config.MaxSizeConfig; +import com.hazelcast.config.NetworkConfig; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.JHipsterProperties; -import javax.annotation.PreDestroy; +import com.hazelcast.spring.cache.HazelcastCacheManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import org.springframework.session.hazelcast.Hazelcast4IndexedSessionRepository; +import org.springframework.session.hazelcast.Hazelcast4PrincipalNameExtractor; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterProperties; + +import javax.annotation.PreDestroy; +import java.util.List; + +import static com.hazelcast.config.MaxSizePolicy.USED_HEAP_SIZE; @Configuration @EnableCaching -@AutoConfigureAfter(value = {MetricsConfiguration.class}) @AutoConfigureBefore(value = {WebConfigurer.class, DatabaseConfiguration.class}) public class CacheConfiguration { @@ -40,39 +48,42 @@ public void destroy() { @Bean public CacheManager cacheManager(HazelcastInstance hazelcastInstance) { log.debug("Starting HazelcastCacheManager"); - CacheManager cacheManager = new com.hazelcast.spring.cache.HazelcastCacheManager( + return new HazelcastCacheManager( hazelcastInstance); - return cacheManager; } @Bean - public HazelcastInstance hazelcastInstance(JHipsterProperties jHipsterProperties) { - log.debug("Configuring Hazelcast"); - - HazelcastInstance hazelCastInstance = Hazelcast - .getHazelcastInstanceByName("ManagementPortal"); - if (hazelCastInstance != null) { - log.debug("Hazelcast already initialized"); - return hazelCastInstance; - } - + public Config hazelcastConfig(JHipsterProperties jHipsterProperties) { Config config = new Config(); config.setInstanceName("ManagementPortal"); - config.getNetworkConfig().setPort(5701); - config.getNetworkConfig().setPortAutoIncrement(true); + NetworkConfig networkConfig = config.getNetworkConfig(); + networkConfig.setPort(5701); + networkConfig.setPortAutoIncrement(true); // In development, remove multicast auto-configuration if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - System.setProperty("hazelcast.local.localAddress", "127.0.0.1"); - - config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false); - config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); - config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(false); + networkConfig.getInterfaces().setEnabled(true); + networkConfig.getInterfaces().setInterfaces(List.of("127.0.0.1")); + + networkConfig.getJoin().getAwsConfig().setEnabled(false); + networkConfig.getJoin().getMulticastConfig().setEnabled(false); + networkConfig.getJoin().getTcpIpConfig().setEnabled(false); + networkConfig.getJoin().getAzureConfig().setEnabled(false); + networkConfig.getJoin().getGcpConfig().setEnabled(false); + networkConfig.getJoin().getEurekaConfig().setEnabled(false); + networkConfig.getJoin().getKubernetesConfig().setEnabled(false); } + AttributeConfig attributeConfig = new AttributeConfig() + .setName(Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE) + .setExtractorClassName(Hazelcast4PrincipalNameExtractor.class.getName()); + config.getMapConfig(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME) + .addAttributeConfig(attributeConfig).addIndexConfig( + new IndexConfig(IndexType.HASH, + Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)); config.getMapConfigs().put("default", initializeDefaultMapConfig()); config.getMapConfigs().put("org.radarbase.management.domain.*", initializeDomainMapConfig(jHipsterProperties)); - return Hazelcast.newHazelcastInstance(config); + return config; } private MapConfig initializeDefaultMapConfig() { @@ -88,14 +99,13 @@ private MapConfig initializeDefaultMapConfig() { LRU (Least Recently Used), LFU (Least Frequently Used). NONE is the default. */ - mapConfig.setEvictionPolicy(EvictionPolicy.LRU); + mapConfig.getEvictionConfig().setEvictionPolicy(EvictionPolicy.LRU); /* Maximum size of the map. When max size is reached, map is evicted based on the policy defined. Any integer between 0 and Integer.MAX_VALUE. 0 means Integer.MAX_VALUE. Default is 0. */ - mapConfig - .setMaxSizeConfig(new MaxSizeConfig(0, MaxSizeConfig.MaxSizePolicy.USED_HEAP_SIZE)); + mapConfig.getEvictionConfig().setMaxSizePolicy(USED_HEAP_SIZE); return mapConfig; } diff --git a/src/main/java/org/radarbase/management/config/DatabaseConfiguration.java b/src/main/java/org/radarbase/management/config/DatabaseConfiguration.java index e2c43953e..971954b6f 100644 --- a/src/main/java/org/radarbase/management/config/DatabaseConfiguration.java +++ b/src/main/java/org/radarbase/management/config/DatabaseConfiguration.java @@ -1,26 +1,22 @@ package org.radarbase.management.config; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; -import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.liquibase.AsyncSpringLiquibase; -import java.sql.SQLException; -import javax.sql.DataSource; import liquibase.integration.spring.SpringLiquibase; -import org.h2.tools.Server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; +import tech.jhipster.config.JHipsterConstants; + +import javax.sql.DataSource; @Configuration @EnableJpaRepositories(basePackages = "org.radarbase.management.repository", @@ -34,32 +30,19 @@ public class DatabaseConfiguration { @Autowired private Environment env; - /** - * Open the TCP port for the H2 database, so it is available remotely. - * - * @return the H2 database TCP server - * @throws SQLException if the server failed to start - */ - @Bean(initMethod = "start", destroyMethod = "stop") - @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) - public Server h2TCPServer() throws SQLException { - return Server.createTcpServer("-tcp", "-tcpAllowOthers"); - } - @Bean - public SpringLiquibase liquibase( - @Qualifier("taskExecutor") ExceptionHandlingAsyncTaskExecutor taskExecutor, - DataSource dataSource, LiquibaseProperties liquibaseProperties) { + public SpringLiquibase liquibase(DataSource dataSource, + LiquibaseProperties liquibaseProperties) { // Use liquibase.integration.spring.SpringLiquibase if you don't want Liquibase to start // asynchronously - SpringLiquibase liquibase = new AsyncSpringLiquibase(taskExecutor, env); + SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:config/liquibase/master.xml"); liquibase.setContexts(liquibaseProperties.getContexts()); liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); liquibase.setDropFirst(liquibaseProperties.isDropFirst()); - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE)) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) { liquibase.setShouldRun(false); } else { liquibase.setShouldRun(liquibaseProperties.isEnabled()); diff --git a/src/main/java/org/radarbase/management/config/DateTimeFormatConfiguration.java b/src/main/java/org/radarbase/management/config/DateTimeFormatConfiguration.java index df24e259a..0dbf2d722 100644 --- a/src/main/java/org/radarbase/management/config/DateTimeFormatConfiguration.java +++ b/src/main/java/org/radarbase/management/config/DateTimeFormatConfiguration.java @@ -3,15 +3,51 @@ import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.annotation.Nonnull; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.ResolverStyle; + +import static java.time.temporal.ChronoField.HOUR_OF_DAY; +import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; +import static java.time.temporal.ChronoField.NANO_OF_SECOND; +import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; @Configuration -public class DateTimeFormatConfiguration extends WebMvcConfigurerAdapter { +public class DateTimeFormatConfiguration implements WebMvcConfigurer { @Override - public void addFormatters(FormatterRegistry registry) { + public void addFormatters(@Nonnull FormatterRegistry registry) { DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); registrar.setUseIsoFormat(true); + registrar.setDateTimeFormatter(new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .append(DateTimeFormatter.ISO_LOCAL_DATE) + .optionalStart() + .appendLiteral('T') + .append(DateTimeFormatter.ISO_LOCAL_TIME) + .optionalStart() + .parseLenient() + .appendOffsetId() + .parseStrict() + .optionalEnd() + .optionalStart() + .appendLiteral('[') + .parseCaseSensitive() + .appendZoneRegionId() + .appendLiteral(']') + .optionalEnd() + .optionalEnd() + .parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum()) + .parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum()) + .parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum()) + .parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum()) + .toFormatter() + .withZone(ZoneId.of("UTC")) + .withResolverStyle(ResolverStyle.LENIENT)); registrar.registerFormatters(registry); } } diff --git a/src/main/java/org/radarbase/management/config/DefaultProfileUtil.java b/src/main/java/org/radarbase/management/config/DefaultProfileUtil.java deleted file mode 100644 index d747b43e5..000000000 --- a/src/main/java/org/radarbase/management/config/DefaultProfileUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.radarbase.management.config; - -import io.github.jhipster.config.JHipsterConstants; -import java.util.HashMap; -import java.util.Map; -import org.springframework.boot.SpringApplication; -import org.springframework.core.env.Environment; - -/** - * Utility class to load a Spring profile to be used as default when there is no - * spring.profiles.active set in the environment or as command line argument. If the - * value is not available in application.yml then dev profile will be used - * as default. - */ -public final class DefaultProfileUtil { - - private static final String SPRING_PROFILE_DEFAULT = "spring.profiles.default"; - - private DefaultProfileUtil() { - } - - /** - * Set a default to use when no profile is configured. - * - * @param app the Spring application - */ - public static void addDefaultProfile(SpringApplication app) { - Map defProperties = new HashMap<>(); - /* - * The default profile to use when no other profiles are defined - * This cannot be set in the application.yml file. - * See https://github.com/spring-projects/spring-boot/issues/1219 - */ - defProperties.put(SPRING_PROFILE_DEFAULT, JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); - app.setDefaultProperties(defProperties); - } - - /** - * Get the profiles that are applied else get default profiles. - * - * @param env spring environment - * @return profiles - */ - public static String[] getActiveProfiles(Environment env) { - String[] profiles = env.getActiveProfiles(); - if (profiles.length == 0) { - return env.getDefaultProfiles(); - } - return profiles; - } -} diff --git a/src/main/java/org/radarbase/management/config/LocaleConfiguration.java b/src/main/java/org/radarbase/management/config/LocaleConfiguration.java index 0d7a20d4e..3d30a9765 100644 --- a/src/main/java/org/radarbase/management/config/LocaleConfiguration.java +++ b/src/main/java/org/radarbase/management/config/LocaleConfiguration.java @@ -1,17 +1,17 @@ package org.radarbase.management.config; -import io.github.jhipster.config.locale.AngularCookieLocaleResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import tech.jhipster.config.locale.AngularCookieLocaleResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; @Configuration -public class LocaleConfiguration extends WebMvcConfigurerAdapter implements EnvironmentAware { +public class LocaleConfiguration implements WebMvcConfigurer, EnvironmentAware { @Override public void setEnvironment(Environment environment) { diff --git a/src/main/java/org/radarbase/management/config/LoggingAspectConfiguration.java b/src/main/java/org/radarbase/management/config/LoggingAspectConfiguration.java index 86b854bda..e2f0e71f4 100644 --- a/src/main/java/org/radarbase/management/config/LoggingAspectConfiguration.java +++ b/src/main/java/org/radarbase/management/config/LoggingAspectConfiguration.java @@ -1,6 +1,6 @@ package org.radarbase.management.config; -import io.github.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterConstants; import org.radarbase.management.aop.logging.LoggingAspect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/org/radarbase/management/config/LoggingConfiguration.java b/src/main/java/org/radarbase/management/config/LoggingConfiguration.java index 8ae2ebfe5..1899a111e 100644 --- a/src/main/java/org/radarbase/management/config/LoggingConfiguration.java +++ b/src/main/java/org/radarbase/management/config/LoggingConfiguration.java @@ -1,114 +1,46 @@ package org.radarbase.management.config; -import ch.qos.logback.classic.AsyncAppender; -import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.spi.LoggerContextListener; -import ch.qos.logback.core.spi.ContextAwareBase; -import io.github.jhipster.config.JHipsterProperties; -import javax.annotation.PostConstruct; -import net.logstash.logback.appender.LogstashSocketAppender; -import net.logstash.logback.stacktrace.ShortenedThrowableConverter; -import org.slf4j.Logger; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import tech.jhipster.config.JHipsterProperties; -@Configuration -public class LoggingConfiguration { - - private static final Logger log = LoggerFactory.getLogger(LoggingConfiguration.class); - - private final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - - @Value("${spring.application.name}") - private String appName; - - @Value("${server.port}") - private String serverPort; - - @Autowired - private JHipsterProperties jHipsterProperties; - - @PostConstruct - public void setUpLogstash() { - if (jHipsterProperties.getLogging().getLogstash().isEnabled()) { - addLogstashAppender(context); - - // Add context listener - LogbackLoggerContextListener loggerContextListener = new LogbackLoggerContextListener(); - loggerContextListener.setContext(context); - context.addListener(loggerContextListener); - } - } - - private void addLogstashAppender(LoggerContext context) { - log.info("Initializing Logstash logging"); +import java.util.HashMap; +import java.util.Map; - LogstashSocketAppender logstashAppender = new LogstashSocketAppender(); - logstashAppender.setName("LOGSTASH"); - logstashAppender.setContext(context); - String customFields = - "{\"app_name\":\"" + appName + "\",\"app_port\":\"" + serverPort + "\"}"; +import static tech.jhipster.config.logging.LoggingUtils.addContextListener; +import static tech.jhipster.config.logging.LoggingUtils.addJsonConsoleAppender; +import static tech.jhipster.config.logging.LoggingUtils.addLogstashTcpSocketAppender; - // Set the Logstash appender config from JHipster properties - logstashAppender.setSyslogHost(jHipsterProperties.getLogging().getLogstash().getHost()); - logstashAppender.setPort(jHipsterProperties.getLogging().getLogstash().getPort()); - logstashAppender.setCustomFields(customFields); - - // Limit the maximum length of the forwarded stacktrace so that it won't exceed the 8KB - // UDP limit of logstash - ShortenedThrowableConverter throwableConverter = new ShortenedThrowableConverter(); - throwableConverter.setMaxLength(7500); - throwableConverter.setRootCauseFirst(true); - logstashAppender.setThrowableConverter(throwableConverter); - - logstashAppender.start(); - - // Wrap the appender in an Async appender for performance - AsyncAppender asyncLogstashAppender = new AsyncAppender(); - asyncLogstashAppender.setContext(context); - asyncLogstashAppender.setName("ASYNC_LOGSTASH"); - asyncLogstashAppender - .setQueueSize(jHipsterProperties.getLogging().getLogstash().getQueueSize()); - asyncLogstashAppender.addAppender(logstashAppender); - asyncLogstashAppender.start(); - - context.getLogger("ROOT").addAppender(asyncLogstashAppender); - } +@Configuration +public class LoggingConfiguration { + /** Logging configuration for JHipster. */ + public LoggingConfiguration(@Value("${spring.application.name}") String appName, + @Value("${server.port}") String serverPort, + JHipsterProperties jHipsterProperties, + ObjectMapper mapper) throws JsonProcessingException { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - /** - * Logback configuration is achieved by configuration file and API. When configuration file - * change is detected, the configuration is reset. This listener ensures that the programmatic - * configuration is also re-applied after reset. - */ - class LogbackLoggerContextListener extends ContextAwareBase implements LoggerContextListener { + Map map = new HashMap<>(); + map.put("app_name", appName); + map.put("app_port", serverPort); - @Override - public boolean isResetResistant() { - return true; - } + String customFields = mapper.writeValueAsString(map); - @Override - public void onStart(LoggerContext context) { - addLogstashAppender(context); - } + JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging(); + JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash(); - @Override - public void onReset(LoggerContext context) { - addLogstashAppender(context); + if (loggingProperties.isUseJsonFormat()) { + addJsonConsoleAppender(context, customFields); } - - @Override - public void onStop(LoggerContext context) { - // Nothing to do. + if (logstashProperties.isEnabled()) { + addLogstashTcpSocketAppender(context, customFields, logstashProperties); } - - @Override - public void onLevelChange(ch.qos.logback.classic.Logger logger, Level level) { - // Nothing to do. + if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) { + addContextListener(context, customFields, loggingProperties); } } - } diff --git a/src/main/java/org/radarbase/management/config/ManagementPortalSecurityConfigLoader.java b/src/main/java/org/radarbase/management/config/ManagementPortalSecurityConfigLoader.java index a31809944..5ef6c52fe 100644 --- a/src/main/java/org/radarbase/management/config/ManagementPortalSecurityConfigLoader.java +++ b/src/main/java/org/radarbase/management/config/ManagementPortalSecurityConfigLoader.java @@ -11,13 +11,13 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.MappingIterator; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema; import org.radarbase.auth.authorization.Permission; @@ -80,18 +80,14 @@ public void loadFrontendOauthClient() { ManagementPortalProperties.Frontend frontend = managementPortalProperties.getFrontend(); BaseClientDetails details = new BaseClientDetails(); details.setClientId(frontend.getClientId()); - details.setClientSecret(frontend.getClientSecret()); + details.setClientSecret(null); details.setAccessTokenValiditySeconds(frontend.getAccessTokenValiditySeconds()); details.setRefreshTokenValiditySeconds(frontend.getRefreshTokenValiditySeconds()); details.setResourceIds(Collections.singletonList("res_ManagementPortal")); details.setAuthorizedGrantTypes(Arrays.asList("password", "refresh_token", "authorization_code")); details.setAdditionalInformation(Collections.singletonMap("protected", Boolean.TRUE)); - List allScopes = Arrays.stream(Permission.Entity.values()) - .map(Permission.Entity::name) - .flatMap(e -> Arrays.stream(Permission.Operation.values()) - .map(o -> String.join(".", e, o.name()))) - .collect(Collectors.toList()); + List allScopes = Arrays.asList(Permission.scopes()); details.setScope(allScopes); details.setAutoApproveScopes(allScopes); loadOAuthClient(details); @@ -109,20 +105,25 @@ public void loadOAuthClientsFromFile() { return; } Path file = Paths.get(path); - try (InputStream inputStream = Files.newInputStream(file)) { + // CsvSchema uses the @JsonPropertyOrder to define column order, it does not + // read the header. Let's read the header ourselves and provide that as + // column order + String[] columnOrder = getCsvFileColumnOrder(file); + if (columnOrder == null) { + return; + } + CsvMapper mapper = new CsvMapper(); + CsvSchema schema = mapper.schemaFor(CustomBaseClientDetails.class) + .withColumnReordering(true) + .sortedBy(columnOrder) + .withColumnSeparator(SEPARATOR) + .withHeader(); + ObjectReader reader = mapper + .readerFor(CustomBaseClientDetails.class) + .with(schema); + try (InputStream inputStream = Files.newInputStream(file); + MappingIterator iterator = reader.readValues(inputStream)) { logger.info("Loading OAuth clients from {}", file.toAbsolutePath()); - CsvMapper mapper = new CsvMapper(); - CsvSchema schema = mapper.schemaFor(CustomBaseClientDetails.class) - // CsvSchema uses the @JsonPropertyOrder to define column order, it does not - // read the header. Let's read the header ourselves and provide that as - // column order - .withColumnReordering(true) - .sortedBy(getCsvFileColumnOrder(file)) - .withColumnSeparator(SEPARATOR) - .withHeader(); - MappingIterator iterator = mapper - .readerFor(CustomBaseClientDetails.class) - .with(schema).readValues(inputStream); while (iterator.hasNext()) { loadOAuthClient(iterator.nextValue()); } diff --git a/src/main/java/org/radarbase/management/config/MetricsConfiguration.java b/src/main/java/org/radarbase/management/config/MetricsConfiguration.java deleted file mode 100644 index ba30a11c6..000000000 --- a/src/main/java/org/radarbase/management/config/MetricsConfiguration.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.radarbase.management.config; - -import com.codahale.metrics.JmxReporter; -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.Slf4jReporter; -import com.codahale.metrics.health.HealthCheckRegistry; -import com.codahale.metrics.jvm.BufferPoolMetricSet; -import com.codahale.metrics.jvm.FileDescriptorRatioGauge; -import com.codahale.metrics.jvm.GarbageCollectorMetricSet; -import com.codahale.metrics.jvm.MemoryUsageGaugeSet; -import com.codahale.metrics.jvm.ThreadStatesGaugeSet; -import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; -import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; -import com.zaxxer.hikari.HikariDataSource; -import io.github.jhipster.config.JHipsterProperties; -import java.lang.management.ManagementFactory; -import java.util.concurrent.TimeUnit; -import javax.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableMetrics(proxyTargetClass = true) -public class MetricsConfiguration extends MetricsConfigurerAdapter { - - private static final String PROP_METRIC_REG_JVM_MEMORY = "jvm.memory"; - private static final String PROP_METRIC_REG_JVM_GARBAGE = "jvm.garbage"; - private static final String PROP_METRIC_REG_JVM_THREADS = "jvm.threads"; - private static final String PROP_METRIC_REG_JVM_FILES = "jvm.files"; - private static final String PROP_METRIC_REG_JVM_BUFFERS = "jvm.buffers"; - private static final Logger log = LoggerFactory.getLogger(MetricsConfiguration.class); - - private final MetricRegistry metricRegistry = new MetricRegistry(); - - private final HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry(); - - @Autowired - private JHipsterProperties jHipsterProperties; - - @Autowired(required = false) - private HikariDataSource hikariDataSource; - - @Override - public MetricRegistry getMetricRegistry() { - return metricRegistry; - } - - @Override - public HealthCheckRegistry getHealthCheckRegistry() { - return healthCheckRegistry; - } - - /** - * Initialize the metric registry. - */ - @PostConstruct - public void init() { - log.debug("Registering JVM gauges"); - metricRegistry.register(PROP_METRIC_REG_JVM_MEMORY, new MemoryUsageGaugeSet()); - metricRegistry.register(PROP_METRIC_REG_JVM_GARBAGE, new GarbageCollectorMetricSet()); - metricRegistry.register(PROP_METRIC_REG_JVM_THREADS, new ThreadStatesGaugeSet()); - metricRegistry.register(PROP_METRIC_REG_JVM_FILES, new FileDescriptorRatioGauge()); - metricRegistry.register(PROP_METRIC_REG_JVM_BUFFERS, - new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer())); - if (hikariDataSource != null) { - log.debug("Monitoring the datasource"); - hikariDataSource.setMetricRegistry(metricRegistry); - } - if (jHipsterProperties.getMetrics().getJmx().isEnabled()) { - log.debug("Initializing Metrics JMX reporting"); - JmxReporter jmxReporter = JmxReporter.forRegistry(metricRegistry).build(); - jmxReporter.start(); - } - if (jHipsterProperties.getMetrics().getLogs().isEnabled()) { - log.info("Initializing Metrics Log reporting"); - final Slf4jReporter reporter = Slf4jReporter.forRegistry(metricRegistry) - .outputTo(LoggerFactory.getLogger("metrics")) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.MILLISECONDS) - .build(); - reporter.start(jHipsterProperties.getMetrics().getLogs().getReportFrequency(), - TimeUnit.SECONDS); - } - } -} diff --git a/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.java b/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.java index ed7f1b990..809c395b7 100644 --- a/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.java +++ b/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.java @@ -1,14 +1,10 @@ package org.radarbase.management.config; -import static org.springframework.orm.jpa.vendor.Database.POSTGRESQL; - -import java.util.Arrays; -import javax.sql.DataSource; - -import io.github.jhipster.security.AjaxLogoutSuccessHandler; -import io.github.jhipster.security.Http401UnauthorizedEntryPoint; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import org.radarbase.auth.authorization.RoleAuthority; +import org.radarbase.management.repository.UserRepository; import org.radarbase.management.security.ClaimsTokenEnhancer; +import org.radarbase.management.security.Http401UnauthorizedEntryPoint; +import org.radarbase.management.security.JwtAuthenticationFilter; import org.radarbase.management.security.PostgresApprovalStore; import org.radarbase.management.security.jwt.ManagementPortalJwtAccessTokenConverter; import org.radarbase.management.security.jwt.ManagementPortalJwtTokenStore; @@ -31,6 +27,7 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.Authentication; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; @@ -49,7 +46,12 @@ import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.web.filter.CorsFilter; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.sql.DataSource; +import java.util.Arrays; + +import static org.springframework.orm.jpa.vendor.Database.POSTGRESQL; @Configuration public class OAuth2ServerConfiguration { @@ -58,6 +60,9 @@ public class OAuth2ServerConfiguration { @Autowired private DataSource dataSource; + @Autowired + private PasswordEncoder passwordEncoder; + @Configuration @Order(-20) protected static class LoginConfig extends WebSecurityConfigurerAdapter { @@ -65,14 +70,21 @@ protected static class LoginConfig extends WebSecurityConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; + @Autowired + private UserRepository userRepository; + + @Autowired + private ManagementPortalOauthKeyStoreHandler keyStoreHandler; + @Override protected void configure(HttpSecurity http) throws Exception { http .formLogin().loginPage("/login").permitAll() .and() - .requestMatchers().antMatchers("/login", - "/oauth/authorize", - "/oauth/confirm_access") + .addFilterBefore(jwtAuthenticationFilter(), + UsernamePasswordAuthenticationFilter.class) + .requestMatchers() + .antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") .and() .authorizeRequests().anyRequest().authenticated(); } @@ -81,18 +93,28 @@ protected void configure(HttpSecurity http) throws Exception { protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.parentAuthenticationManager(authenticationManager); } + + public JwtAuthenticationFilter jwtAuthenticationFilter() { + return new JwtAuthenticationFilter( + keyStoreHandler.getTokenValidator(), + authenticationManager, + userRepository, + true); + } } @Bean public JdbcClientDetailsService jdbcClientDetailsService() { JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource); - clientDetailsService.setPasswordEncoder(new BCryptPasswordEncoder()); + clientDetailsService.setPasswordEncoder(passwordEncoder); return clientDetailsService; } @Configuration @EnableResourceServer protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { + @Autowired + private ManagementPortalOauthKeyStoreHandler keyStoreHandler; @Autowired private TokenStore tokenStore; @@ -101,10 +123,25 @@ protected static class ResourceServerConfiguration extends ResourceServerConfigu private Http401UnauthorizedEntryPoint http401UnauthorizedEntryPoint; @Autowired - private AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler; + private LogoutSuccessHandler logoutSuccessHandler; + + @Autowired + private AuthenticationManager authenticationManager; @Autowired - private CorsFilter corsFilter; + private UserRepository userRepository; + + public JwtAuthenticationFilter jwtAuthenticationFilter() { + return new JwtAuthenticationFilter( + keyStoreHandler.getTokenValidator(), authenticationManager, userRepository + ) + .skipUrlPattern(HttpMethod.GET, "/management/health") + .skipUrlPattern(HttpMethod.GET, "/api/meta-token/*") + .skipUrlPattern(HttpMethod.GET, "/images/**") + .skipUrlPattern(HttpMethod.GET, "/css/**") + .skipUrlPattern(HttpMethod.GET, "/js/**") + .skipUrlPattern(HttpMethod.GET, "/radar-baseRR.png"); + } @Override public void configure(HttpSecurity http) throws Exception { @@ -113,33 +150,37 @@ public void configure(HttpSecurity http) throws Exception { .authenticationEntryPoint(http401UnauthorizedEntryPoint) .and() .logout() - .logoutUrl("/api/logout") - .logoutSuccessHandler(ajaxLogoutSuccessHandler) + .invalidateHttpSession(true) + .logoutUrl("/api/logout") + .logoutSuccessHandler(logoutSuccessHandler) .and() .csrf() - .disable() - .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .disable() + .addFilterBefore(jwtAuthenticationFilter(), + UsernamePasswordAuthenticationFilter.class) .headers() - .frameOptions().disable() + .frameOptions() + .disable() .and() .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .sessionCreationPolicy(SessionCreationPolicy.ALWAYS) .and() .authorizeRequests() - .antMatchers("/oauth/**").permitAll() - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .antMatchers("/api/authenticate").permitAll() - .antMatchers("/api/register").hasAnyAuthority(AuthoritiesConstants.SYS_ADMIN) - .antMatchers("/api/profile-info").permitAll() - .antMatchers("/api/**").authenticated() - // Allow management/health endpoint to all to allow kubernetes to be able to - // detect the health of the service - .antMatchers("/management/health").permitAll() - .antMatchers("/management/**").hasAnyAuthority(AuthoritiesConstants.SYS_ADMIN) - .antMatchers("/v2/api-docs/**").permitAll() - .antMatchers("/swagger-resources/configuration/ui").permitAll() - .antMatchers("/swagger-ui/index.html") - .hasAnyAuthority(AuthoritiesConstants.SYS_ADMIN); + .antMatchers("/oauth/**").permitAll() + .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() + .antMatchers("/api/register") + .hasAnyAuthority(RoleAuthority.SYS_ADMIN_AUTHORITY) + .antMatchers("/api/profile-info").permitAll() + .antMatchers("/api/**").authenticated() + // Allow management/health endpoint to all to allow kubernetes to be able to + // detect the health of the service + .antMatchers("/management/health").permitAll() + .antMatchers("/management/**") + .hasAnyAuthority(RoleAuthority.SYS_ADMIN_AUTHORITY) + .antMatchers("/v2/api-docs/**").permitAll() + .antMatchers("/swagger-resources/configuration/ui").permitAll() + .antMatchers("/swagger-ui/index.html") + .hasAnyAuthority(RoleAuthority.SYS_ADMIN_AUTHORITY); } @Override @@ -219,9 +260,9 @@ public ManagementPortalJwtAccessTokenConverter accessTokenConverter() { @Bean @Primary - public DefaultTokenServices tokenServices() { + public DefaultTokenServices tokenServices(TokenStore tokenStore) { DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); - defaultTokenServices.setTokenStore(tokenStore()); + defaultTokenServices.setTokenStore(tokenStore); defaultTokenServices.setSupportRefreshToken(true); defaultTokenServices.setReuseRefreshToken(false); return defaultTokenServices; diff --git a/src/main/java/org/radarbase/management/config/OpenApiConfiguration.java b/src/main/java/org/radarbase/management/config/OpenApiConfiguration.java new file mode 100644 index 000000000..b161b51e9 --- /dev/null +++ b/src/main/java/org/radarbase/management/config/OpenApiConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.OAuthFlow; +import io.swagger.v3.oas.models.security.OAuthFlows; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import tech.jhipster.config.JHipsterConstants; + +@Configuration +@Profile(JHipsterConstants.SPRING_PROFILE_API_DOCS) +public class OpenApiConfiguration { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .components(new Components() + .addSecuritySchemes("oauth2Login", new SecurityScheme() + .type(SecurityScheme.Type.OAUTH2) + .flows(new OAuthFlows() + .authorizationCode(new OAuthFlow() + .authorizationUrl("/oauth/authorize") + .tokenUrl("/oauth/token")) + .clientCredentials(new OAuthFlow() + .tokenUrl("/oauth/token"))))) + .info(new Info() + .title("ManagementPortal API") + .description("ManagementPortal for RADAR-base") + .license(new License() + .name("Apache 2.0") + .url("https://radar-base.org"))); + } +} diff --git a/src/main/java/org/radarbase/management/config/SecurityConfiguration.java b/src/main/java/org/radarbase/management/config/SecurityConfiguration.java index 553e68c65..59ed7f262 100644 --- a/src/main/java/org/radarbase/management/config/SecurityConfiguration.java +++ b/src/main/java/org/radarbase/management/config/SecurityConfiguration.java @@ -1,20 +1,17 @@ package org.radarbase.management.config; -import javax.annotation.PostConstruct; -import javax.servlet.Filter; - -import io.github.jhipster.security.AjaxLogoutSuccessHandler; -import io.github.jhipster.security.Http401UnauthorizedEntryPoint; -import org.radarbase.management.security.JwtAuthenticationFilter; -import org.radarbase.management.security.jwt.ManagementPortalOauthKeyStoreHandler; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.security.Http401UnauthorizedEntryPoint; +import org.radarbase.management.security.RadarAuthenticationProvider; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; import org.springframework.http.HttpMethod; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.DefaultAuthenticationEventPublisher; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; @@ -25,34 +22,49 @@ import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.data.repository.query.SecurityEvaluationContextExtension; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import tech.jhipster.security.AjaxLogoutSuccessHandler; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.radarbase.management.security.JwtAuthenticationFilter.TOKEN_ATTRIBUTE; +import static org.springframework.context.annotation.ScopedProxyMode.TARGET_CLASS; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + private final AuthenticationManagerBuilder authenticationManagerBuilder; - @Autowired - private AuthenticationManagerBuilder authenticationManagerBuilder; - - @Autowired - private UserDetailsService userDetailsService; + private final UserDetailsService userDetailsService; - @Autowired - private ApplicationEventPublisher applicationEventPublisher; + private final ApplicationEventPublisher applicationEventPublisher; + private final PasswordEncoder passwordEncoder; + /** Security configuration constructor. */ @Autowired - private ManagementPortalOauthKeyStoreHandler keyStoreHandler; + public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, + UserDetailsService userDetailsService, + ApplicationEventPublisher applicationEventPublisher, + PasswordEncoder passwordEncoder) { + this.authenticationManagerBuilder = authenticationManagerBuilder; + this.userDetailsService = userDetailsService; + this.applicationEventPublisher = applicationEventPublisher; + this.passwordEncoder = passwordEncoder; + } @PostConstruct public void init() { try { authenticationManagerBuilder .userDetailsService(userDetailsService) - .passwordEncoder(passwordEncoder()) + .passwordEncoder(passwordEncoder) .and() + .authenticationProvider(new RadarAuthenticationProvider()) .authenticationEventPublisher( new DefaultAuthenticationEventPublisher(applicationEventPublisher)); } catch (Exception e) { @@ -61,7 +73,7 @@ public void init() { } @Bean - public AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler() { + public LogoutSuccessHandler logoutSuccessHandler() { return new AjaxLogoutSuccessHandler(); } @@ -70,26 +82,27 @@ public Http401UnauthorizedEntryPoint http401UnauthorizedEntryPoint() { return new Http401UnauthorizedEntryPoint(); } - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - @Override - public void configure(WebSecurity web) throws Exception { + public void configure(WebSecurity web) { web.ignoring() + .antMatchers("/") + .antMatchers("/*.{js,ico,css,html}") .antMatchers(HttpMethod.OPTIONS, "/**") .antMatchers("/app/**/*.{js,html}") .antMatchers("/bower_components/**") .antMatchers("/i18n/**") .antMatchers("/content/**") - .antMatchers("/swagger-ui/index.html") + .antMatchers("/swagger-ui/**") + .antMatchers("/api-docs/**") + .antMatchers("/swagger-ui.html") + .antMatchers("/api-docs{,.json,.yml}") .antMatchers("/api/register") + .antMatchers("/api/profile-info") .antMatchers("/api/activate") .antMatchers("/api/account/reset_password/init") .antMatchers("/api/account/reset_password/finish") .antMatchers("/test/**") - .antMatchers("/h2-console/**") + .antMatchers("/management/health") .antMatchers(HttpMethod.GET, "/api/meta-token/**"); } @@ -99,7 +112,7 @@ public void configure(HttpSecurity http) throws Exception { .httpBasic().realmName("ManagementPortal") .and() .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); } @Override @@ -113,41 +126,26 @@ public SecurityEvaluationContextExtension securityEvaluationContextExtension() { return new SecurityEvaluationContextExtension(); } + @Scope(value = "request", proxyMode = TARGET_CLASS) @Bean - public FilterRegistrationBean jwtAuthenticationFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(jwtAuthenticationFilter()); - // Servlet filters do not have an API to exclude URLs, we need to exclude - // /api/account/reset_password/*, so we need to list all other endpoints - registration.addUrlPatterns( - "/api/account", - "/api/account/change_password", - "/api/authenticate", - "/api/authorities/*", - "/api/source-types/*", - "/api/oauth-clients/*", - "/api/profile-info/*", - "/api/projects/*", - "/api/roles/*", - "/api/source-data/*", - "/api/sources/*", - "/api/subjects/*", - "/api/users/*", - "/api/meta-token/*", - "/management/*"); - registration.setName("jwtAuthenticationFilter"); - registration.setOrder(1); - return registration; - } - - /** - * Create a {@link JwtAuthenticationFilter}. - * - * @return the JwtAuthenticationFilter - */ - public Filter jwtAuthenticationFilter() { - return new JwtAuthenticationFilter(keyStoreHandler.getTokenValidator()) - .skipUrlPattern(HttpMethod.GET, "/management/health") - .skipUrlPattern(HttpMethod.GET, "/api/meta-token/*"); + public RadarToken radarToken(HttpServletRequest request) { + Object token = request.getAttribute(TOKEN_ATTRIBUTE); + if (token == null) { + HttpSession session = request.getSession(false); + if (session != null) { + token = session.getAttribute(TOKEN_ATTRIBUTE); + } + } + if (token == null) { + // should not happen, the JwtAuthenticationFilter would throw an exception first if it + // can not decode the authorization header into a valid JWT + throw new AccessDeniedException("No token was found in the request context."); + } + if (!(token instanceof RadarToken)) { + // should not happen, the JwtAuthenticationFilter will only set a DecodedJWT object + throw new AccessDeniedException("Expected token to be of type org.radarbase" + + ".auth.token.RadarToken but was " + token.getClass().getName()); + } + return (RadarToken) token; } } diff --git a/src/main/java/org/radarbase/management/config/SourceTypeLoader.java b/src/main/java/org/radarbase/management/config/SourceTypeLoader.java index dff7bbd3a..d46dfc4f0 100644 --- a/src/main/java/org/radarbase/management/config/SourceTypeLoader.java +++ b/src/main/java/org/radarbase/management/config/SourceTypeLoader.java @@ -3,6 +3,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.radarbase.management.domain.SourceData; import org.radarbase.management.domain.SourceType; @@ -50,54 +51,46 @@ public class SourceTypeLoader implements CommandLineRunner { @Override public void run(String... args) { + if (!managementPortalProperties.getCatalogueServer().isEnableAutoImport()) { + log.info("Auto source-type import is disabled"); + return; + } String catalogServerUrl = managementPortalProperties.getCatalogueServer().getServerUrl(); - if (managementPortalProperties.getCatalogueServer().isEnableAutoImport()) { - - try { - if (HttpUtil.isReachable(new URL(catalogServerUrl))) { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity catalogues = null; - log.debug("Requesting source-types from catalogue server..."); - catalogues = restTemplate - .getForEntity( - managementPortalProperties.getCatalogueServer().getServerUrl(), - SourceTypeResponse.class); - SourceTypeResponse catalogueDto = catalogues.getBody(); - List catalogSourceTypes = new ArrayList<>(); - if (catalogueDto.getPassiveSources() != null) { - catalogSourceTypes.addAll(catalogueDto.getPassiveSources()); - } - - if (catalogueDto.getActiveSources() != null) { - catalogSourceTypes.addAll(catalogueDto.getActiveSources()); - } - - if (catalogueDto.getMonitorSources() != null) { - catalogSourceTypes.addAll(catalogueDto.getMonitorSources()); - } - - if (catalogueDto.getConnectorSources() != null) { - catalogSourceTypes.addAll(catalogueDto.getConnectorSources()); - } - - saveSourceTypesFromCatalogServer(catalogSourceTypes); - - } else { - log.warn("Catalog Service {} is unreachable", catalogServerUrl); - } - } catch (MalformedURLException e) { - log.warn("Invalid Url provided for Catalog server url {} : {}", catalogServerUrl, - e.getMessage()); - } catch (RuntimeException exe) { - log.warn("An error has occurred during auto import of source-types: {}", exe - .getMessage()); + try { + if (HttpUtil.isReachable(new URL(catalogServerUrl))) { + log.warn("Catalog Service {} is unreachable", catalogServerUrl); + return; } - } else { - log.info("Auto source-type import is disabled"); + RestTemplate restTemplate = new RestTemplate(); + log.debug("Requesting source-types from catalogue server..."); + ResponseEntity catalogues = restTemplate + .getForEntity(catalogServerUrl, SourceTypeResponse.class); + SourceTypeResponse catalogueDto = catalogues.getBody(); + if (catalogueDto == null) { + log.warn("Catalog Service {} returned empty response", catalogServerUrl); + return; + } + List catalogSourceTypes = new ArrayList<>(); + addNonNull(catalogSourceTypes, catalogueDto.getPassiveSources()); + addNonNull(catalogSourceTypes, catalogueDto.getActiveSources()); + addNonNull(catalogSourceTypes, catalogueDto.getMonitorSources()); + addNonNull(catalogSourceTypes, catalogueDto.getConnectorSources()); + saveSourceTypesFromCatalogServer(catalogSourceTypes); + } catch (MalformedURLException e) { + log.warn("Invalid Url provided for Catalog server url {} : {}", catalogServerUrl, + e.getMessage()); + } catch (RuntimeException exe) { + log.warn("An error has occurred during auto import of source-types: {}", exe + .getMessage()); } + } + private static void addNonNull(Collection collection, Collection toAdd) { + if (toAdd != null && !toAdd.isEmpty()) { + collection.addAll(toAdd); + } } /** @@ -107,64 +100,74 @@ public void run(String... args) { */ @Transactional public void saveSourceTypesFromCatalogServer(List catalogSourceTypes) { - for (CatalogSourceType catalogSourceType : catalogSourceTypes) { - SourceType sourceType = catalogSourceTypeMapper .catalogSourceTypeToSourceType(catalogSourceType); - if (sourceType.getProducer() == null) { - log.warn("Catalog source-type {} does not have a vendor. " - + "Skipping importing this type", catalogSourceType.getName()); + if (!isSourceTypeValid(sourceType)) { continue; } - if (sourceType.getModel() == null) { - log.warn("Catalog source-type {} does not have a model. " - + "Skipping importing this type", catalogSourceType.getName()); - continue; - } - - if (sourceType.getCatalogVersion() == null) { - log.warn("Catalog source-type {} does not have a version. " - + "Skipping importing this type", catalogSourceType.getName()); - continue; - } // check whether a source-type is already available with given config - if (!sourceTypeRepository.findOneWithEagerRelationshipsByProducerAndModelAndVersion( + if (sourceTypeRepository.hasOneByProducerAndModelAndVersion( sourceType.getProducer(), sourceType.getModel(), - sourceType.getCatalogVersion()).isPresent()) { + sourceType.getCatalogVersion())) { + // skip for existing source-types + log.info("Source-type {} is already available ", sourceType.getProducer() + + "_" + sourceType.getModel() + + "_" + sourceType.getCatalogVersion()); + } else { try { // create new source-type - sourceTypeRepository.save(sourceType); + sourceType = sourceTypeRepository.save(sourceType); // create source-data for the new source-type for (CatalogSourceData catalogSourceData : catalogSourceType.getData()) { - try { - SourceData sourceData = catalogSourceDataMapper - .catalogSourceDataToSourceData(catalogSourceData); - // sourceDataName should be unique - // generated by combining sourceDataType and source-type configs - sourceData.sourceDataName(sourceType.getProducer() - + "_" + sourceType.getModel() - + "_" + sourceType.getCatalogVersion() - + "_" + sourceData.getSourceDataType()); - sourceData.sourceType(sourceType); - sourceDataRepository.save(sourceData); - } catch (RuntimeException ex) { - log.error("Failed to import source data {}", catalogSourceData, ex); - } + saveSourceData(sourceType, catalogSourceData); } } catch (RuntimeException ex) { log.error("Failed to import source type {}", sourceType, ex); } - } else { - // skip for existing source-types - log.info("Source-type {} is already available ", sourceType.getProducer() - + "_" + sourceType.getModel() - + "_" + sourceType.getCatalogVersion()); } } log.info("Completed source-type import from catalog-server"); } + + private void saveSourceData(SourceType sourceType, CatalogSourceData catalogSourceData) { + try { + SourceData sourceData = catalogSourceDataMapper + .catalogSourceDataToSourceData(catalogSourceData); + // sourceDataName should be unique + // generated by combining sourceDataType and source-type configs + sourceData.sourceDataName(sourceType.getProducer() + + "_" + sourceType.getModel() + + "_" + sourceType.getCatalogVersion() + + "_" + sourceData.getSourceDataType()); + sourceData.sourceType(sourceType); + sourceDataRepository.save(sourceData); + } catch (RuntimeException ex) { + log.error("Failed to import source data {}", catalogSourceData, ex); + } + } + + private static boolean isSourceTypeValid(SourceType sourceType) { + if (sourceType.getProducer() == null) { + log.warn("Catalog source-type {} does not have a vendor. " + + "Skipping importing this type", sourceType.getName()); + return false; + } + + if (sourceType.getModel() == null) { + log.warn("Catalog source-type {} does not have a model. " + + "Skipping importing this type", sourceType.getName()); + return false; + } + + if (sourceType.getCatalogVersion() == null) { + log.warn("Catalog source-type {} does not have a version. " + + "Skipping importing this type", sourceType.getName()); + return false; + } + return true; + } } diff --git a/src/main/java/org/radarbase/management/config/ThymeleafConfiguration.java b/src/main/java/org/radarbase/management/config/ThymeleafConfiguration.java index 6cebf816b..a7f77132d 100644 --- a/src/main/java/org/radarbase/management/config/ThymeleafConfiguration.java +++ b/src/main/java/org/radarbase/management/config/ThymeleafConfiguration.java @@ -1,11 +1,12 @@ package org.radarbase.management.config; -import org.apache.commons.lang3.CharEncoding; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; +import java.nio.charset.StandardCharsets; + @Configuration public class ThymeleafConfiguration { @Bean @@ -15,7 +16,7 @@ public ClassLoaderTemplateResolver emailTemplateResolver() { emailTemplateResolver.setPrefix("templates/"); emailTemplateResolver.setSuffix(".html"); emailTemplateResolver.setTemplateMode("HTML"); - emailTemplateResolver.setCharacterEncoding(CharEncoding.UTF_8); + emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name()); emailTemplateResolver.setOrder(1); return emailTemplateResolver; } diff --git a/src/main/java/org/radarbase/management/config/WebConfigurer.java b/src/main/java/org/radarbase/management/config/WebConfigurer.java index 07e2ed338..83d5bf0a5 100644 --- a/src/main/java/org/radarbase/management/config/WebConfigurer.java +++ b/src/main/java/org/radarbase/management/config/WebConfigurer.java @@ -1,34 +1,29 @@ package org.radarbase.management.config; -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.servlet.InstrumentedFilter; -import com.codahale.metrics.servlets.MetricsServlet; -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.JHipsterProperties; -import io.github.jhipster.web.filter.CachingHttpHeadersFilter; -import io.undertow.UndertowOptions; -import java.io.File; -import java.nio.file.Paths; -import java.util.EnumSet; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.server.MimeMappings; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; +import org.springframework.core.env.Profiles; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterProperties; +import tech.jhipster.web.filter.CachingHttpHeadersFilter; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; +import javax.servlet.ServletContext; +import java.io.File; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.EnumSet; /** * Configuration of web application with Servlet 3.0 APIs. @@ -45,24 +40,17 @@ public class WebConfigurer implements ServletContextInitializer, @Autowired private JHipsterProperties jHipsterProperties; - @Autowired(required = false) - private MetricRegistry metricRegistry; - @Override - public void onStartup(ServletContext servletContext) throws ServletException { + public void onStartup(ServletContext servletContext) { if (env.getActiveProfiles().length != 0) { log.info("Web application configuration, using profiles: {}", - (Object[]) env.getActiveProfiles()); + Arrays.asList(env.getActiveProfiles())); } - EnumSet disps = EnumSet - .of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC); - initMetrics(servletContext, disps); - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_PRODUCTION))) { + EnumSet disps = EnumSet + .of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC); initCachingHttpHeadersFilter(servletContext, disps); } - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - initH2Console(servletContext); - } log.info("Web application fully configured"); } @@ -80,21 +68,6 @@ public void customize(ConfigurableServletWebServerFactory factory) { factory.setMimeMappings(mappings); // When running in an IDE or with ./gradlew bootRun, set location of the static web assets. setLocationForStaticAssets(factory); - - /* - * Enable HTTP/2 for Undertow - https://twitter.com/ankinson/status/829256167700492288 - * HTTP/2 requires HTTPS, so HTTP requests will fallback to HTTP/1.1. - * See the JHipsterProperties class and your application-*.yml configuration files - * for more information. - */ - if (jHipsterProperties.getHttp().getVersion().equals(JHipsterProperties.Http.Version.V_2_0) - && - factory instanceof UndertowServletWebServerFactory) { - - ((UndertowServletWebServerFactory) factory) - .addBuilderCustomizers(builder -> - builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true)); - } } private void setLocationForStaticAssets(ConfigurableServletWebServerFactory factory) { @@ -135,55 +108,8 @@ private void initCachingHttpHeadersFilter(ServletContext servletContext, cachingHttpHeadersFilter.setAsyncSupported(true); } - /** - * Initializes Metrics. - */ - private void initMetrics(ServletContext servletContext, EnumSet disps) { - log.debug("Initializing Metrics registries"); - servletContext.setAttribute(InstrumentedFilter.REGISTRY_ATTRIBUTE, - metricRegistry); - servletContext.setAttribute(MetricsServlet.METRICS_REGISTRY, - metricRegistry); - - log.debug("Registering Metrics Filter"); - FilterRegistration.Dynamic metricsFilter = servletContext.addFilter("webappMetricsFilter", - new InstrumentedFilter()); - - metricsFilter.addMappingForUrlPatterns(disps, true, "/*"); - metricsFilter.setAsyncSupported(true); - - log.debug("Registering Metrics Servlet"); - ServletRegistration.Dynamic metricsAdminServlet = - servletContext.addServlet("metricsServlet", new MetricsServlet()); - - metricsAdminServlet.addMapping("/management/metrics/*"); - metricsAdminServlet.setAsyncSupported(true); - metricsAdminServlet.setLoadOnStartup(2); - } - @Bean - public CorsFilter corsFilter() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = jHipsterProperties.getCors(); - if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { - log.debug("Registering CORS filter"); - source.registerCorsConfiguration("/api/**", config); - source.registerCorsConfiguration("/v2/api-docs", config); - source.registerCorsConfiguration("/oauth/**", config); - } - return new CorsFilter(source); - } - - /** - * Initializes H2 console. - */ - private void initH2Console(ServletContext servletContext) { - log.debug("Initialize H2 console"); - ServletRegistration.Dynamic h2ConsoleServlet = servletContext - .addServlet("H2Console", new org.h2.server.web.WebServlet()); - h2ConsoleServlet.addMapping("/h2-console/*"); - h2ConsoleServlet.setInitParameter("-properties", "src/main/resources/"); - h2ConsoleServlet.setLoadOnStartup(1); + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); } - } diff --git a/src/main/java/org/radarbase/management/domain/Authority.java b/src/main/java/org/radarbase/management/domain/Authority.java index c86e6da90..ee5d00b9b 100644 --- a/src/main/java/org/radarbase/management/domain/Authority.java +++ b/src/main/java/org/radarbase/management/domain/Authority.java @@ -12,6 +12,7 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.envers.Audited; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.auth.config.Constants; /** @@ -40,6 +41,10 @@ public Authority(String authorityName) { this.name = authorityName; } + public Authority(RoleAuthority role) { + this(role.authority()); + } + public String getName() { return name; } diff --git a/src/main/java/org/radarbase/management/domain/Group.java b/src/main/java/org/radarbase/management/domain/Group.java new file mode 100644 index 000000000..6008009fb --- /dev/null +++ b/src/main/java/org/radarbase/management/domain/Group.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2021 The Hyve and respective contributors. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.radarbase.auth.config.Constants; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +import java.io.Serializable; +import java.util.Objects; + +/** + * A Group. + */ +@Entity +@Table(name = "radar_group") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class Group extends AbstractEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") + private Long id; + + @NotNull + @Pattern(regexp = Constants.ENTITY_ID_REGEX) + @Size(min = 1, max = 50) + @Column(name = "name", length = 50, nullable = false) + private String name; + + @JsonIgnore + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @JoinColumn(name = "project_id", nullable = false) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + private Project project; + + @Override + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Group group = (Group) o; + if (group.id == null || id == null) { + return false; + } + return Objects.equals(id, group.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Group{" + + "id=" + id + ", " + + "name=" + name + ", " + + "project='" + project.getProjectName() + "', " + + "}"; + } + +} diff --git a/src/main/java/org/radarbase/management/domain/MetaToken.java b/src/main/java/org/radarbase/management/domain/MetaToken.java index abdf3c351..3f5e1b0bd 100644 --- a/src/main/java/org/radarbase/management/domain/MetaToken.java +++ b/src/main/java/org/radarbase/management/domain/MetaToken.java @@ -46,7 +46,8 @@ public class MetaToken extends AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @NotNull diff --git a/src/main/java/org/radarbase/management/domain/Organization.java b/src/main/java/org/radarbase/management/domain/Organization.java new file mode 100644 index 000000000..f728adae7 --- /dev/null +++ b/src/main/java/org/radarbase/management/domain/Organization.java @@ -0,0 +1,127 @@ +package org.radarbase.management.domain; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.envers.Audited; +import org.radarbase.auth.config.Constants; +import org.radarbase.management.domain.support.AbstractEntityListener; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.List; +import java.util.Objects; + +/** + * An Organization. + */ +@Entity +@Audited +@Table(name = "radar_organization") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +@EntityListeners({AbstractEntityListener.class}) +public class Organization extends AbstractEntity { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") + private Long id; + + @NotNull + @Pattern(regexp = Constants.ENTITY_ID_REGEX) + @Column(name = "name", nullable = false, unique = true) + private String name; + + @NotNull + @Column(name = "description", nullable = false) + private String description; + + @NotNull + @Column(name = "location", nullable = false) + private String location; + + @OneToMany(mappedBy = "organization") + private List projects; + + @Override + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var org = (Organization) o; + if (org.id == null || id == null) { + return false; + } + return Objects.equals(id, org.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Organization{" + + "id=" + id + + ", name='" + name + "'" + + ", description='" + description + "'" + + ", location='" + location + "'" + + "}"; + } +} diff --git a/src/main/java/org/radarbase/management/domain/PersistentAuditEvent.java b/src/main/java/org/radarbase/management/domain/PersistentAuditEvent.java index fa56e7d8f..09e21d02b 100644 --- a/src/main/java/org/radarbase/management/domain/PersistentAuditEvent.java +++ b/src/main/java/org/radarbase/management/domain/PersistentAuditEvent.java @@ -34,7 +34,8 @@ public class PersistentAuditEvent implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") @Column(name = "event_id") private Long id; diff --git a/src/main/java/org/radarbase/management/domain/Project.java b/src/main/java/org/radarbase/management/domain/Project.java index 83e96f859..26e7c1179 100644 --- a/src/main/java/org/radarbase/management/domain/Project.java +++ b/src/main/java/org/radarbase/management/domain/Project.java @@ -6,7 +6,10 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.annotations.DynamicInsert; import org.hibernate.envers.Audited; +import org.hibernate.envers.NotAudited; import org.radarbase.auth.config.Constants; import org.radarbase.management.domain.enumeration.ProjectStatus; import org.radarbase.management.domain.support.AbstractEntityListener; @@ -25,8 +28,10 @@ import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderBy; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.validation.constraints.NotNull; @@ -39,6 +44,10 @@ import java.util.Objects; import java.util.Set; +import static javax.persistence.CascadeType.DETACH; +import static javax.persistence.CascadeType.REFRESH; +import static javax.persistence.CascadeType.REMOVE; + /** * A Project. */ @@ -47,13 +56,15 @@ @Table(name = "project") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @EntityListeners({AbstractEntityListener.class}) +@DynamicInsert public class Project extends AbstractEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @NotNull @@ -66,7 +77,11 @@ public class Project extends AbstractEntity implements Serializable { private String description; @Column(name = "jhi_organization") - private String organization; + private String organizationName; + + @ManyToOne(fetch = FetchType.EAGER) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + private Organization organization; @NotNull @Column(name = "location", nullable = false) @@ -84,7 +99,7 @@ public class Project extends AbstractEntity implements Serializable { @JsonIgnore @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) - @Cascade(org.hibernate.annotations.CascadeType.ALL) + @Cascade(CascadeType.ALL) private Set roles = new HashSet<>(); @ManyToMany(fetch = FetchType.LAZY) @@ -100,6 +115,12 @@ public class Project extends AbstractEntity implements Serializable { @CollectionTable(name = "project_metadata", joinColumns = @JoinColumn(name = "id")) private Map attributes = new HashMap<>(); + @NotAudited + @OneToMany(mappedBy = "project", fetch = FetchType.LAZY, orphanRemoval = true, + cascade = {REMOVE, REFRESH, DETACH}) + @OrderBy("name ASC") + private Set groups = new HashSet<>(); + @Override public Long getId() { return id; @@ -135,12 +156,12 @@ public void setDescription(String description) { this.description = description; } - public String getOrganization() { - return organization; + public String getOrganizationName() { + return organizationName; } - public Project organization(String organization) { - this.organization = organization; + public Project organizationName(String organizationName) { + this.organizationName = organizationName; return this; } @@ -153,7 +174,20 @@ public void setRoles(Set roles) { this.roles = roles; } - public void setOrganization(String organization) { + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + + public Organization getOrganization() { + return organization; + } + + public Project organization(Organization organization) { + this.organization = organization; + return this; + } + + public void setOrganization(Organization organization) { this.organization = organization; } @@ -218,30 +252,6 @@ public Project sourceTypes(Set sourceTypes) { return this; } - /** - * Add a source type to this project. - * - * @param sourceType the source type to add - * @return this project - */ - public Project addSourceType(SourceType sourceType) { - this.sourceTypes.add(sourceType); - sourceType.getProjects().add(this); - return this; - } - - /** - * Remove a source type from this project. - * - * @param sourceType the source type to remove - * @return this project - */ - public Project removeSourceType(SourceType sourceType) { - this.sourceTypes.remove(sourceType); - sourceType.getProjects().remove(this); - return this; - } - @JsonSetter(nulls = Nulls.AS_EMPTY) public void setSourceTypes(Set sourceTypes) { this.sourceTypes = sourceTypes; @@ -256,6 +266,15 @@ public void setAttributes(Map attributes) { this.attributes = attributes; } + public Set getGroups() { + return groups; + } + + @JsonSetter(nulls = Nulls.AS_EMPTY) + public void setGroups(Set groups) { + this.groups = groups; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -282,7 +301,7 @@ public String toString() { + "id=" + id + ", projectName='" + projectName + "'" + ", description='" + description + "'" - + ", organization='" + organization + "'" + + ", organization='" + organizationName + "'" + ", location='" + location + "'" + ", startDate='" + startDate + "'" + ", projectStatus='" + projectStatus + "'" diff --git a/src/main/java/org/radarbase/management/domain/Role.java b/src/main/java/org/radarbase/management/domain/Role.java index e947b57bb..501078f17 100644 --- a/src/main/java/org/radarbase/management/domain/Role.java +++ b/src/main/java/org/radarbase/management/domain/Role.java @@ -17,6 +17,7 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.envers.Audited; import org.hibernate.envers.RelationTargetAuditMode; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.management.domain.support.AbstractEntityListener; import javax.persistence.Entity; @@ -48,7 +49,8 @@ public class Role extends AbstractEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) @@ -61,6 +63,10 @@ public class Role extends AbstractEntity implements Serializable { @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Project project; + @ManyToOne(fetch = FetchType.EAGER) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + private Organization organization; + @JsonProperty() @ManyToOne(fetch = FetchType.EAGER) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @@ -103,6 +109,14 @@ public void setUsers(Set users) { this.users = users; } + public Organization getOrganization() { + return organization; + } + + public void setOrganization(Organization organization) { + this.organization = organization; + } + public Project getProject() { return project; } @@ -120,6 +134,10 @@ public Authority getAuthority() { return authority; } + public RoleAuthority getRole() { + return RoleAuthority.valueOfAuthorityOrNull(authority.getName()); + } + public Role authority(Authority authority) { this.authority = authority; return this; @@ -138,22 +156,23 @@ public boolean equals(Object o) { return false; } Role role = (Role) o; - if (role.id == null || id == null) { - return false; - } - return Objects.equals(id, role.id); + return Objects.equals(authority, role.authority) + && Objects.equals(project, role.project) + && Objects.equals(organization, role.organization); } @Override public int hashCode() { - return Objects.hashCode(id); + return Objects.hash(authority, project, organization); } @Override public String toString() { return "Role{" + "id=" + id + ", " - + "project='" + (project == null ? "null" : project.getProjectName()) + "', " + + "organization='" + (organization == null ? "null" : organization.getName()) + + "', " + + "project='" + (project == null ? "null" : project.getProjectName()) + "', " + "authority='" + getAuthority().getName() + "', " + "}"; } diff --git a/src/main/java/org/radarbase/management/domain/Source.java b/src/main/java/org/radarbase/management/domain/Source.java index 9d1b0f7e1..25b5258d4 100644 --- a/src/main/java/org/radarbase/management/domain/Source.java +++ b/src/main/java/org/radarbase/management/domain/Source.java @@ -46,7 +46,8 @@ public class Source extends AbstractEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @NotNull @@ -65,6 +66,10 @@ public class Source extends AbstractEntity implements Serializable { @Column(name = "assigned", nullable = false) private Boolean assigned; + @NotNull + @Column(name = "deleted", nullable = false) + private Boolean deleted = false; + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "subject_id") @JsonIgnore @@ -153,6 +158,19 @@ public void setAssigned(Boolean assigned) { this.assigned = assigned; } + public Boolean isDeleted() { + return deleted; + } + + public Source deleted(Boolean deleted) { + this.deleted = deleted; + return this; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + public void setSourceType(SourceType sourceType) { this.sourceType = sourceType; } diff --git a/src/main/java/org/radarbase/management/domain/SourceData.java b/src/main/java/org/radarbase/management/domain/SourceData.java index 615491535..48afa665b 100644 --- a/src/main/java/org/radarbase/management/domain/SourceData.java +++ b/src/main/java/org/radarbase/management/domain/SourceData.java @@ -36,7 +36,8 @@ public class SourceData extends AbstractEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; //SourceData type e.g. ACCELEROMETER, TEMPERATURE. diff --git a/src/main/java/org/radarbase/management/domain/SourceType.java b/src/main/java/org/radarbase/management/domain/SourceType.java index 47b07bd15..0722ba75c 100644 --- a/src/main/java/org/radarbase/management/domain/SourceType.java +++ b/src/main/java/org/radarbase/management/domain/SourceType.java @@ -44,7 +44,8 @@ public class SourceType extends AbstractEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @NotNull @@ -162,30 +163,6 @@ public SourceType sourceData(Set sourceData) { return this; } - /** - * Add source data to this source type. - * - * @param sourceData the source data to add - * @return this source type - */ - public SourceType addSourceData(SourceData sourceData) { - this.sourceData.add(sourceData); - sourceData.setSourceType(this); - return this; - } - - /** - * Remove source data from this source type. - * - * @param sourceData the source data to remove - * @return this source type - */ - public SourceType removeSourceData(SourceData sourceData) { - this.sourceData.remove(sourceData); - sourceData.setSourceType(null); - return this; - } - @JsonSetter(nulls = Nulls.AS_EMPTY) public void setSourceData(Set sourceData) { this.sourceData = sourceData; diff --git a/src/main/java/org/radarbase/management/domain/Subject.java b/src/main/java/org/radarbase/management/domain/Subject.java index e272d94e8..c481da8e4 100644 --- a/src/main/java/org/radarbase/management/domain/Subject.java +++ b/src/main/java/org/radarbase/management/domain/Subject.java @@ -1,15 +1,15 @@ package org.radarbase.management.domain; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.envers.Audited; +import org.hibernate.envers.RelationTargetAuditMode; import org.radarbase.management.domain.support.AbstractEntityListener; import javax.persistence.CollectionTable; @@ -22,6 +22,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; @@ -29,6 +30,9 @@ import javax.persistence.Table; import javax.validation.constraints.NotNull; import java.io.Serializable; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -36,6 +40,9 @@ import java.util.Optional; import java.util.Set; +import static org.radarbase.auth.authorization.RoleAuthority.INACTIVE_PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; + /** * A Subject. */ @@ -45,12 +52,15 @@ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @EntityListeners({AbstractEntityListener.class}) public class Subject extends AbstractEntity implements Serializable { - private static final long serialVersionUID = 1L; + private static final Set PARTICIPANT_TYPES = Set.of( + PARTICIPANT.authority(), + INACTIVE_PARTICIPANT.authority()); @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @Column(name = "external_link") @@ -78,6 +88,7 @@ public class Subject extends AbstractEntity implements Serializable { @Column(name = "attribute_value") @CollectionTable(name = "subject_metadata", joinColumns = @JoinColumn(name = "id")) @Cascade(CascadeType.ALL) + @BatchSize(size = 50) private Map attributes = new HashMap<>(); @OneToMany(mappedBy = "subject", orphanRemoval = true, fetch = FetchType.LAZY) @@ -85,6 +96,20 @@ public class Subject extends AbstractEntity implements Serializable { @JsonIgnore private final Set metaTokens = new HashSet<>(); + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "group_id") + @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) + private Group group; + + @Column(name = "date_of_birth") + private LocalDate dateOfBirth; + + @Column(name = "enrollment_date") + private ZonedDateTime enrollmentDate; + + @Column(name = "person_name") + private String personName; + @Override public Long getId() { return id; @@ -172,6 +197,38 @@ public Set getMetaTokens() { return metaTokens; } + public void setGroup(Group group) { + this.group = group; + } + + public Group getGroup() { + return this.group; + } + + public void setDateOfBirth(LocalDate dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public LocalDate getDateOfBirth() { + return this.dateOfBirth; + } + + public void setEnrollmentDate(ZonedDateTime enrollmentDate) { + this.enrollmentDate = enrollmentDate; + } + + public ZonedDateTime getEnrollmentDate() { + return this.enrollmentDate; + } + + public void setPersonName(String personName) { + this.personName = personName; + } + + public String getPersonName() { + return this.personName; + } + /** * Gets the active project of subject. * @@ -182,7 +239,21 @@ public Set getMetaTokens() { */ public Optional getActiveProject() { return this.getUser().getRoles().stream() - .filter(r -> r.getAuthority().getName().equals(PARTICIPANT)) + .filter(r -> r.getAuthority().getName().equals(PARTICIPANT.authority())) + .findFirst() + .map(Role::getProject); + } + + /** + * Get the active project of a subject, and otherwise the + * inactive project. + * @return the project a subject belongs to, if any. + */ + public Optional getAssociatedProject() { + return this.getUser().getRoles().stream() + .filter(r -> PARTICIPANT_TYPES.contains(r.getAuthority().getName())) + .sorted(Comparator.comparing(r -> r.getAuthority().getName()) + .reversed()) .findFirst() .map(Role::getProject); } @@ -217,6 +288,7 @@ public String toString() { + ", user=" + user + ", sources=" + sources + ", attributes=" + attributes + + ", group=" + group + "}"; } } diff --git a/src/main/java/org/radarbase/management/domain/User.java b/src/main/java/org/radarbase/management/domain/User.java index 4e9533686..023e966b3 100644 --- a/src/main/java/org/radarbase/management/domain/User.java +++ b/src/main/java/org/radarbase/management/domain/User.java @@ -49,7 +49,8 @@ public class User extends AbstractEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") - @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000) + @SequenceGenerator(name = "sequenceGenerator", initialValue = 1000, + sequenceName = "hibernate_sequence") private Long id; @NotNull @@ -206,9 +207,11 @@ public void setRoles(Set roles) { this.roles = roles; } + /** Authorities tha ta user has. */ public Set getAuthorities() { return roles.stream() - .map(Role::getAuthority).collect(Collectors.toSet()); + .map(Role::getAuthority) + .collect(Collectors.toSet()); } @Override diff --git a/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPostZuulFilter.java b/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPostZuulFilter.java deleted file mode 100644 index d8a4559a0..000000000 --- a/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPostZuulFilter.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.radarbase.management.filters; - -import static org.radarbase.management.filters.OAuth2TokenRequestPreZuulFilter.REFRESH_TOKEN_COOKIE; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import io.github.jhipster.config.JHipsterConstants; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; -import javax.servlet.http.Cookie; -import org.apache.commons.io.IOUtils; -import org.radarbase.management.config.ManagementPortalProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -/** - * A post-filter for all the request sent to Zuul proxy. This investigates the response body and - * stores the Refresh token in a Cookie and remove it from response body. - */ -@Component -public class OAuth2TokenRequestPostZuulFilter extends ZuulFilter { - private static final Logger logger = LoggerFactory.getLogger( - OAuth2TokenRequestPostZuulFilter.class); - - @Autowired - private ManagementPortalProperties managementPortalProperties; - - @Autowired - private Environment env; - private final ObjectMapper mapper = new ObjectMapper(); - - @Override - public Object run() { - final RequestContext ctx = RequestContext.getCurrentContext(); - logger.debug("in zuul filter " + ctx.getRequest().getRequestURI()); - - final String requestURI = ctx.getRequest().getRequestURI(); - final String requestMethod = ctx.getRequest().getMethod(); - Collection activeProfiles = Arrays.asList(env.getActiveProfiles()); - - try (InputStream is = ctx.getResponseDataStream()) { - String responseBody = IOUtils.toString(is, StandardCharsets.UTF_8); - if (responseBody.contains("refresh_token")) { - final Map responseMap = mapper - .readValue(responseBody, new TypeReference>() { - }); - final String refreshToken = responseMap.get("refresh_token").toString(); - responseMap.remove("refresh_token"); - responseBody = mapper.writeValueAsString(responseMap); - - final Cookie cookie = new Cookie(REFRESH_TOKEN_COOKIE, refreshToken); - cookie.setHttpOnly(true); - cookie.setSecure( - activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)); - cookie.setPath(ctx.getRequest().getContextPath() + "/oauthserver/oauth/token"); - cookie.setMaxAge(this.managementPortalProperties.getFrontend() - .getSessionTimeout()); // 30 minites - ctx.getResponse().addCookie(cookie); - - } - if (requestURI.contains("oauth/token") && requestMethod.equals("DELETE")) { - final Cookie cookie = new Cookie(REFRESH_TOKEN_COOKIE, ""); - cookie.setHttpOnly(true); - cookie.setMaxAge(0); - cookie.setSecure( - activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)); - cookie.setPath(ctx.getRequest().getContextPath() + "/oauthserver/oauth/token"); - ctx.getResponse().addCookie(cookie); - } - ctx.setResponseBody(responseBody); - - } catch (final IOException e) { - logger.error("Error occured in zuul post filter", e); - } - return null; - } - - @Override - public boolean shouldFilter() { - return true; - } - - @Override - public int filterOrder() { - return 10; - } - - @Override - public String filterType() { - return "post"; - } -} diff --git a/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPreZuulFilter.java b/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPreZuulFilter.java deleted file mode 100644 index 00bd10928..000000000 --- a/src/main/java/org/radarbase/management/filters/OAuth2TokenRequestPreZuulFilter.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.radarbase.management.filters; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import java.io.UnsupportedEncodingException; -import javax.ws.rs.HttpMethod; -import org.radarbase.management.config.ManagementPortalProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.codec.Base64; -import org.springframework.stereotype.Component; - -/** - * A pre-filter for all request sent to Zuul proxy. This adds the client credentials and scp - */ -@Component -public class OAuth2TokenRequestPreZuulFilter extends ZuulFilter { - - protected static final String REFRESH_TOKEN_COOKIE = "rft"; - private static final Logger logger = LoggerFactory.getLogger( - OAuth2TokenRequestPreZuulFilter.class); - - @Autowired - private ManagementPortalProperties managementPortalProperties; - - - @Override - public Object run() { - RequestContext ctx = RequestContext.getCurrentContext(); - byte[] encoded; - try { - // get this from properties, this will allow us to use ENV variables for docker - encoded = Base64.encode((managementPortalProperties.getFrontend().getClientId() + ":" - + managementPortalProperties.getFrontend().getClientSecret()) - .getBytes("UTF-8")); - ctx.addZuulRequestHeader("Authorization", "Basic " + new String(encoded)); - - } catch (UnsupportedEncodingException e) { - logger.error("Error occured in pre filter", e); - } - return null; - } - - // private String extractRefreshToken(HttpServletRequest req) { - // final Cookie[] cookies = req.getCookies(); - // if (cookies != null) { - // for (int i = 0; i < cookies.length; i++) { - // if (cookies[i].getName().equalsIgnoreCase(REFRESH_TOKEN_COOKIE)) { - // return cookies[i].getValue(); - // } - // } - // } - // return null; - // } - - @Override - public boolean shouldFilter() { - RequestContext ctx = RequestContext.getCurrentContext(); - String method = ctx.getRequest().getMethod(); - return ctx.getRequest().getRequestURI().contains("/oauth/token") && HttpMethod.POST - .equals(method); - } - - @Override - public int filterOrder() { - return -2; - } - - @Override - public String filterType() { - return "pre"; - } -} diff --git a/src/main/java/org/radarbase/management/repository/AuthorityRepository.java b/src/main/java/org/radarbase/management/repository/AuthorityRepository.java index 9a5ec67c8..577516ae6 100644 --- a/src/main/java/org/radarbase/management/repository/AuthorityRepository.java +++ b/src/main/java/org/radarbase/management/repository/AuthorityRepository.java @@ -18,5 +18,4 @@ public interface AuthorityRepository extends JpaRepository, @Query("select authority from Authority authority where authority.name = :authorityName") Optional findByAuthorityName(@Param("authorityName") String authorityName); - } diff --git a/src/main/java/org/radarbase/management/repository/GroupRepository.java b/src/main/java/org/radarbase/management/repository/GroupRepository.java new file mode 100644 index 000000000..538286b9d --- /dev/null +++ b/src/main/java/org/radarbase/management/repository/GroupRepository.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.repository; + +import org.radarbase.management.domain.Group; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.RepositoryDefinition; +import org.springframework.data.repository.history.RevisionRepository; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +@RepositoryDefinition(domainClass = Group.class, idClass = Long.class) +public interface GroupRepository extends JpaRepository, + RevisionRepository { + @Query("SELECT group FROM Group group " + + "WHERE group.project.id = :project_id " + + "AND group.name = :group_name") + Optional findByProjectIdAndName( + @Param("project_id") Long id, + @Param("group_name") String groupName); + + @Query("SELECT group FROM Group group " + + "LEFT JOIN Project project on group.project = project " + + "WHERE group.project.projectName = :project_name " + + "AND group.name = :group_name") + Optional findByProjectNameAndName( + @Param("project_name") String projectName, + @Param("group_name") String groupName); +} diff --git a/src/main/java/org/radarbase/management/repository/OrganizationRepository.java b/src/main/java/org/radarbase/management/repository/OrganizationRepository.java new file mode 100644 index 000000000..77bac7ebc --- /dev/null +++ b/src/main/java/org/radarbase/management/repository/OrganizationRepository.java @@ -0,0 +1,27 @@ +package org.radarbase.management.repository; + +import java.util.List; +import java.util.Optional; + +import org.radarbase.management.domain.Organization; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.RepositoryDefinition; +import org.springframework.data.repository.history.RevisionRepository; +import org.springframework.data.repository.query.Param; + +/** + * Spring Data JPA repository for the Organization entity. + */ +@RepositoryDefinition(domainClass = Organization.class, idClass = Long.class) +public interface OrganizationRepository extends JpaRepository, + RevisionRepository { + + @Query("select org from Organization org " + + "where org.name = :name") + Optional findOneByName(@Param("name") String name); + + @Query("select distinct org from Organization org left join fetch org.projects project " + + "where project.projectName in (:projectNames)") + List findAllByProjectNames(@Param("projectNames") List projectNames); +} diff --git a/src/main/java/org/radarbase/management/repository/ProjectRepository.java b/src/main/java/org/radarbase/management/repository/ProjectRepository.java index 4b3df771f..b17dd3da0 100644 --- a/src/main/java/org/radarbase/management/repository/ProjectRepository.java +++ b/src/main/java/org/radarbase/management/repository/ProjectRepository.java @@ -25,14 +25,49 @@ public interface ProjectRepository extends JpaRepository, countQuery = "select distinct count(project) from Project project") Page findAllWithEagerRelationships(Pageable pageable); - @Query("select project from Project project left join fetch " - + "project.sourceTypes s left join fetch s.sourceData where project.id =:id") + @Query(value = "select distinct project from Project project " + + "left join fetch project.sourceTypes " + + "WHERE project.projectName in (:projectNames) " + + "OR project.organization.name in (:organizationNames)", + countQuery = "select distinct count(project) from Project project " + + "WHERE project.projectName in (:projectNames) " + + "OR project.organization.name in (:organizationNames)") + Page findAllWithEagerRelationshipsInOrganizationsOrProjects( + Pageable pageable, + @Param("organizationNames") List organizationNames, + @Param("projectNames") List projectNames); + + @Query("select project from Project project " + + "WHERE project.organization.name = :organization_name") + List findAllByOrganizationName( + @Param("organization_name") String organizationName); + + @Query("select project from Project project " + + "left join fetch project.sourceTypes s " + + "left join fetch project.groups " + + "where project.id = :id") Optional findOneWithEagerRelationships(@Param("id") Long id); - @Query("select project from Project project left join fetch " - + "project.sourceTypes where project.projectName =:name") + @Query("select project from Project project " + + "left join fetch project.organization " + + "where project.id = :id") + Optional findByIdWithOrganization(@Param("id") Long id); + + @Query("select project from Project project " + + "left join fetch project.sourceTypes " + + "left join fetch project.groups " + + "where project.projectName = :name") Optional findOneWithEagerRelationshipsByName(@Param("name") String name); + @Query("select project.id from Project project " + + "where project.projectName =:name") + Optional findProjectIdByName(@Param("name") String name); + + @Query("select project from Project project " + + "left join fetch project.groups " + + "where project.projectName = :name") + Optional findOneWithGroupsByName(@Param("name") String name); + @Query("select project.sourceTypes from Project project WHERE project.id = :id") List findSourceTypesByProjectId(@Param("id") Long id); diff --git a/src/main/java/org/radarbase/management/repository/RoleRepository.java b/src/main/java/org/radarbase/management/repository/RoleRepository.java index 8802c97c5..c91c6e9da 100644 --- a/src/main/java/org/radarbase/management/repository/RoleRepository.java +++ b/src/main/java/org/radarbase/management/repository/RoleRepository.java @@ -24,6 +24,16 @@ public interface RoleRepository extends JpaRepository, @Query("select distinct role from Role role left join fetch role.authority") List findAllWithEagerRelationships(); + @Query("select role from Role role join role.authority " + + "where role.organization.id = :organizationId " + + "and role.authority.name = :authorityName") + Optional findOneByOrganizationIdAndAuthorityName( + @Param("organizationId") Long organizationId, + @Param("authorityName") String authorityName); + + @Query("select role from Role role join role.authority " + + "where role.project.id = :projectId " + + "and role.authority.name = :authorityName") Optional findOneByProjectIdAndAuthorityName(@Param("projectId") Long projectId, @Param("authorityName") String authorityName); diff --git a/src/main/java/org/radarbase/management/repository/SourceRepository.java b/src/main/java/org/radarbase/management/repository/SourceRepository.java index f6443c529..f1327649e 100644 --- a/src/main/java/org/radarbase/management/repository/SourceRepository.java +++ b/src/main/java/org/radarbase/management/repository/SourceRepository.java @@ -3,10 +3,12 @@ import java.util.List; import java.util.Optional; import java.util.UUID; + import org.radarbase.management.domain.Source; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.RepositoryDefinition; import org.springframework.data.repository.history.RevisionRepository; import org.springframework.data.repository.query.Param; @@ -14,19 +16,49 @@ /** * Spring Data JPA repository for the Source entity. */ -@SuppressWarnings("unused") @RepositoryDefinition(domainClass = Source.class, idClass = Long.class) public interface SourceRepository extends JpaRepository, RevisionRepository { - List findAllSourcesByAssigned(@Param("assigned") Boolean assigned); + @Override + @Query(value = "select source from Source source " + + "WHERE source.deleted = false", + countQuery = "select count(source) from Source source " + + "WHERE source.deleted = false") + Page findAll(Pageable pageable); + @Query(value = "select source from Source source " + + "WHERE source.deleted = false " + + "AND source.project.id = :projectId", + countQuery = "select count(source) from Source source " + + "WHERE source.deleted = false " + + "AND source.project.id = :projectId") Page findAllSourcesByProjectId(Pageable pageable, @Param("projectId") Long projectId); + @Query(value = "select source from Source source " + + "WHERE source.deleted = false " + + "AND source.project.id = :projectId " + + "AND source.assigned = :assigned", + countQuery = "select count(source) from Source source " + + "WHERE source.deleted = false " + + "AND source.project.id = :projectId " + + "AND source.assigned = :assigned") List findAllSourcesByProjectIdAndAssigned(@Param("projectId") Long projectId, @Param("assigned") Boolean assigned); - Optional findOneBySourceId(UUID sourceId); + @Query(value = "select source from Source source " + + "WHERE source.deleted = false " + + "AND source.sourceId = :sourceId", + countQuery = "select count(source) from Source source " + + "WHERE source.deleted = false " + + "AND source.sourceId = :sourceId") + Optional findOneBySourceId(@Param("sourceId") UUID sourceId); - Optional findOneBySourceName(String sourceName); + @Query(value = "select source from Source source " + + "WHERE source.deleted = false " + + "AND source.sourceName = :sourceName", + countQuery = "select count(source) from Source source " + + "WHERE source.deleted = false " + + "AND source.sourceName = :sourceName") + Optional findOneBySourceName(@Param("sourceName") String sourceName); } diff --git a/src/main/java/org/radarbase/management/repository/SourceTypeRepository.java b/src/main/java/org/radarbase/management/repository/SourceTypeRepository.java index 4892c5be0..fdfaf2006 100644 --- a/src/main/java/org/radarbase/management/repository/SourceTypeRepository.java +++ b/src/main/java/org/radarbase/management/repository/SourceTypeRepository.java @@ -22,9 +22,18 @@ public interface SourceTypeRepository extends JpaRepository, + ".sourceData") List findAllWithEagerRelationships(); + @Query("select case when count(sourceType) > 0 then true else false end " + + "from SourceType sourceType " + + "where sourceType.producer = :producer " + + "and sourceType.model = :model " + + "and sourceType.catalogVersion = :version") + boolean hasOneByProducerAndModelAndVersion( + @Param("producer") String producer, @Param("model") String model, + @Param("version") String version); + @Query("select sourceType from SourceType sourceType left join fetch sourceType.sourceData " - + "where sourceType.producer =:producer " - + "and sourceType.model =:model " + + "where sourceType.producer = :producer " + + "and sourceType.model = :model " + "and sourceType.catalogVersion = :version") Optional findOneWithEagerRelationshipsByProducerAndModelAndVersion( @Param("producer") String producer, @Param("model") String model, diff --git a/src/main/java/org/radarbase/management/repository/SubjectRepository.java b/src/main/java/org/radarbase/management/repository/SubjectRepository.java index 1888ba602..26dfb12e6 100644 --- a/src/main/java/org/radarbase/management/repository/SubjectRepository.java +++ b/src/main/java/org/radarbase/management/repository/SubjectRepository.java @@ -1,37 +1,33 @@ package org.radarbase.management.repository; -import java.util.List; -import java.util.Optional; -import java.util.UUID; import org.radarbase.management.domain.Source; import org.radarbase.management.domain.Subject; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.RepositoryDefinition; import org.springframework.data.repository.history.RevisionRepository; import org.springframework.data.repository.query.Param; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + /** * Spring Data JPA repository for the Subject entity. */ @SuppressWarnings("unused") @RepositoryDefinition(domainClass = Subject.class, idClass = Long.class) public interface SubjectRepository extends JpaRepository, - RevisionRepository { + RevisionRepository, + JpaSpecificationExecutor { - @Query(value = "select distinct subject from Subject subject left join fetch subject.sources", - countQuery = "select distinct count(subject) from Subject subject") - Page findAllWithEagerRelationships(Pageable pageable); - - @Query(value = "select distinct subject from Subject subject left join fetch subject.sources " - + "left join fetch subject.user user " - + "join user.roles roles where roles.project.projectName = :projectName", - countQuery = "select distinct count(subject) from Subject subject " - + "left join subject.user user left join user.roles roles " - + "where roles.project.projectName = :projectName") - Page findAllByProjectName(Pageable pageable, @Param("projectName") String projectName); + @Query("SELECT count(*) from Subject subject " + + "WHERE subject.group.id = :group_id") + long countByGroupId(@Param("group_id") Long groupId); @Query(value = "select distinct subject from Subject subject left join fetch subject.sources " + "left join fetch subject.user user " @@ -49,6 +45,24 @@ Page findAllByProjectNameAndAuthoritiesIn(Pageable pageable, + "WHERE subject.user.login = :login") Optional findOneWithEagerBySubjectLogin(@Param("login") String login); + @Query("select subject from Subject subject " + + "WHERE subject.user.login in :logins") + List findAllBySubjectLogins(@Param("logins") List logins); + + @Modifying + @Query("UPDATE Subject subject " + + "SET subject.group.id = :groupId " + + "WHERE subject.id in :ids") + void setGroupIdByIds( + @Param("groupId") Long groupId, + @Param("ids") List ids); + + @Modifying + @Query("UPDATE Subject subject " + + "SET subject.group.id = null " + + "WHERE subject.id in :ids") + void unsetGroupIdByIds(@Param("ids") List ids); + @Query("select subject.sources from Subject subject WHERE subject.id = :id") List findSourcesBySubjectId(@Param("id") Long id); @@ -71,13 +85,6 @@ Optional findOneByProjectNameAndExternalIdAndAuthoritiesIn(@Param("proj projectName, @Param("externalId") String externalId, @Param("authorities") List authorities); - @Query("select distinct subject from Subject subject left join fetch subject.sources " - + "left join fetch subject.user user " - + "join user.roles roles where roles.authority.name in :authorities " - + "and subject.externalId = :externalId") - List findAllByExternalIdAndAuthoritiesIn(@Param("externalId") String externalId, @Param - ("authorities") List authorities); - @Query("select subject.sources from Subject subject left join subject.sources sources " + "join sources.sourceType sourceType " + "where sourceType.producer = :producer " diff --git a/src/main/java/org/radarbase/management/repository/UserRepository.java b/src/main/java/org/radarbase/management/repository/UserRepository.java index ce3562ed0..8c57b8f65 100644 --- a/src/main/java/org/radarbase/management/repository/UserRepository.java +++ b/src/main/java/org/radarbase/management/repository/UserRepository.java @@ -38,7 +38,7 @@ List findAllByActivatedAndAuthoritiesNot(@Param("activated") boolean activ Optional findOneByLogin(String login); - @EntityGraph(attributePaths = "roles") + @EntityGraph(attributePaths = {"roles", "roles.authority.name"}) Optional findOneWithRolesByLogin(String login); Page findAllByLoginNot(Pageable pageable, String login); diff --git a/src/main/java/org/radarbase/management/repository/filters/PredicateBuilder.java b/src/main/java/org/radarbase/management/repository/filters/PredicateBuilder.java new file mode 100644 index 000000000..7868877b5 --- /dev/null +++ b/src/main/java/org/radarbase/management/repository/filters/PredicateBuilder.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.repository.filters; + +import org.radarbase.management.domain.Subject; +import org.radarbase.management.web.rest.criteria.CriteriaRange; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.MapJoin; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.function.Supplier; + +public class PredicateBuilder { + private final List predicates; + private final CriteriaBuilder builder; + + public PredicateBuilder(CriteriaBuilder builder) { + this.predicates = new ArrayList<>(); + this.builder = builder; + } + + /** Add predicate to query. */ + public void add(Predicate predicate) { + if (predicate == null) { + return; + } + predicates.add(predicate); + } + + public void isNull(Expression expression) { + predicates.add(builder.isNull(expression)); + } + + /** + * Build the predicates as an AND predicate. + */ + public Predicate toAndPredicate() { + if (this.predicates.size() == 1) { + return this.predicates.get(0); + } else if (!this.predicates.isEmpty()) { + return builder.and(this.predicates.toArray(new Predicate[0])); + } else { + return null; + } + } + + /** + * Build the predicates as an AND predicate. + */ + public Predicate toOrPredicate() { + if (this.predicates.size() == 1) { + return this.predicates.get(0); + } else if (!this.predicates.isEmpty()) { + return builder.or(this.predicates.toArray(new Predicate[0])); + } else { + return null; + } + } + + /** + * Add an equal criteria to predicates if value is not null or empty. + * @param path entity path + * @param value value to compare with + * @param type of field. + */ + public void equal(Supplier> path, T value) { + if (isValidValue(value)) { + add(builder.equal(path.get(), value)); + } + } + + /** + * Add an equal criteria to predicates if value is not null or empty. + * @param path entity path + * @param value value to compare with + * @param type of field. + */ + public void equal(Expression path, T value) { + if (isValidValue(value)) { + add(builder.equal(path, value)); + } + } + + /** + * Add a like criteria to predicates if value is not null or empty, matching both sides. + * @param path entity path + * @param value value to compare with + */ + public void likeLower(Supplier> path, String value) { + if (isValidValue(value)) { + add(builder.like(builder.lower(path.get()), + "%" + value.trim().toLowerCase(Locale.ROOT) + "%")); + } + } + + /** + * Add a like criteria to predicates if value is not null or empty, matching both sides. + * @param path entity path + * @param value value to compare with + */ + public void likeLower(Expression path, String value) { + if (isValidValue(value)) { + add(builder.like(builder.lower(path), + "%" + value.trim().toLowerCase(Locale.ROOT) + "%")); + } + } + + /** + * Add a like criteria to predicates if value is not null or empty, matching both sides. + * @param root entity to fetch attributes from. + * @param attributeKey name of the attribute. + * @param attributeValue value to compare with using a like query. + */ + public void attributeLike(Root root, String attributeKey, + String attributeValue) { + if (isValidValue(attributeValue)) { + MapJoin attributesJoin = + root.joinMap("attributes", JoinType.LEFT); + add(builder.and( + builder.equal(attributesJoin.key(), attributeKey), + builder.like(attributesJoin.value(), + "%" + attributeValue + "%"))); + } + } + + public void in(Expression expr, Expression other) { + add(expr.in(other)); + } + + public void in(Expression expr, Collection other) { + add(expr.in(other)); + } + + /** + * Add comparable criteria matching given range. + * @param path entity property path. + * @param range range that should be matched. + */ + public > void range( + Path path, CriteriaRange range) { + if (range == null || range.isEmpty()) { + return; + } + range.validate(); + if (range.getIs() != null) { + add(builder.equal(path, range.getIs())); + } else { + if (range.getFrom() != null && range.getTo() != null) { + add(builder.between(path, range.getFrom(), range.getTo())); + } else if (range.getFrom() != null) { + add(builder.greaterThanOrEqualTo(path, range.getFrom())); + } else if (range.getTo() != null) { + add(builder.lessThanOrEqualTo(path, range.getTo())); + } + } + } + + /** + * Whether given String a proper value. + */ + public boolean isValidValue(Object value) { + if (value == null) { + return false; + } + if (value instanceof String str) { + return !str.isBlank() && !str.equals("null"); + } + return true; + } + + public PredicateBuilder newBuilder() { + return new PredicateBuilder(builder); + } + + public CriteriaBuilder getCriteriaBuilder() { + return builder; + } + + public boolean isEmpty() { + return this.predicates.isEmpty(); + } +} diff --git a/src/main/java/org/radarbase/management/repository/filters/SubjectSpecification.java b/src/main/java/org/radarbase/management/repository/filters/SubjectSpecification.java new file mode 100644 index 000000000..a9b5ed658 --- /dev/null +++ b/src/main/java/org/radarbase/management/repository/filters/SubjectSpecification.java @@ -0,0 +1,203 @@ +package org.radarbase.management.repository.filters; + +import org.radarbase.management.domain.Role; +import org.radarbase.management.domain.Subject; +import org.radarbase.management.domain.User; +import org.radarbase.management.web.rest.criteria.CriteriaRange; +import org.radarbase.management.web.rest.criteria.SubjectAuthority; +import org.radarbase.management.web.rest.criteria.SubjectCriteria; +import org.radarbase.management.web.rest.criteria.SubjectCriteriaLast; +import org.radarbase.management.web.rest.criteria.SubjectSortBy; +import org.radarbase.management.web.rest.criteria.SubjectSortOrder; +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.springframework.data.jpa.domain.Specification; + +import javax.annotation.Nullable; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; + +public class SubjectSpecification implements Specification { + private final CriteriaRange dateOfBirth; + private final CriteriaRange enrollmentDate; + private final Long groupId; + private final String humanReadableIdentifier; + private final SubjectCriteriaLast last; + private final String personName; + private final String projectName; + private final String externalId; + private final String subjectId; + private final List sort; + private final Set authority; + private final List sortLastValues; + + /** + * Subject specification based on criteria. + * @param criteria criteria to use for the specification. + */ + public SubjectSpecification(SubjectCriteria criteria) { + this.authority = criteria.getAuthority().stream() + .map(SubjectAuthority::name) + .collect(Collectors.toSet()); + this.dateOfBirth = criteria.getDateOfBirth(); + this.enrollmentDate = criteria.getEnrollmentDate(); + this.groupId = criteria.getGroupId(); + this.humanReadableIdentifier = criteria.getHumanReadableIdentifier(); + this.last = criteria.getLast(); + this.personName = criteria.getPersonName(); + this.projectName = criteria.getProjectName(); + this.externalId = criteria.getExternalId(); + this.subjectId = criteria.getLogin(); + this.sort = criteria.getParsedSort(); + if (last != null) { + this.sortLastValues = this.sort.stream() + .map(o -> getLastValue(o.getSortBy())) + .collect(Collectors.toList()); + } else { + this.sortLastValues = null; + } + } + + @Override + public Predicate toPredicate(@Nullable Root root, @Nullable CriteriaQuery query, + @Nullable CriteriaBuilder builder) { + if (root == null || query == null || builder == null) { + return null; + } + query.distinct(true); + + root.alias("subject"); + Join userJoin = root.join("user"); + userJoin.alias("user"); + + PredicateBuilder predicates = new PredicateBuilder(builder); + + addRolePredicates(userJoin, predicates); + + predicates.attributeLike(root, "Human-readable-identifier", + humanReadableIdentifier); + predicates.likeLower(root.get("externalId"), externalId); + + predicates.equal(root.get("group"), groupId); + + predicates.range(root.get("dateOfBirth"), dateOfBirth); + predicates.range(root.get("enrollmentDate"), enrollmentDate); + + predicates.likeLower(root.get("personName"), personName); + predicates.likeLower(userJoin.get("login"), subjectId); + + addContentPredicates(predicates, builder, root, query.getResultType()); + + query.orderBy(getSortOrder(root, builder)); + + return predicates.toAndPredicate(); + } + + private Predicate filterLastValues(Root root, CriteriaBuilder builder) { + Predicate[] lastPredicates = new Predicate[sort.size()]; + List> paths = new ArrayList<>(sort.size()); + for (SubjectSortOrder order : sort) { + paths.add(getPropertyPath(order.getSortBy(), root)); + } + for (int i = 0; i < sort.size(); i++) { + Predicate[] lastAndPredicates = i > 0 ? new Predicate[i + 1] : null; + for (int j = 0; j < i; j++) { + lastAndPredicates[j] = builder.equal(paths.get(j), sortLastValues.get(j)); + } + + SubjectSortOrder order = sort.get(i); + Predicate currentSort; + if (order.getDirection().isAscending()) { + currentSort = builder.greaterThan(paths.get(i), sortLastValues.get(i)); + } else { + currentSort = builder.lessThan(paths.get(i), sortLastValues.get(i)); + } + + if (lastAndPredicates != null) { + lastAndPredicates[i] = currentSort; + lastPredicates[i] = builder.and(lastAndPredicates); + } else { + lastPredicates[i] = currentSort; + } + } + if (lastPredicates.length > 1) { + return builder.or(lastPredicates); + } else { + return lastPredicates[0]; + } + } + + private void addContentPredicates(PredicateBuilder predicates, CriteriaBuilder builder, + Root root, Class queryResult) { + // Don't add content for count queries. + if (queryResult == Long.class || queryResult == long.class) { + return; + } + root.fetch("sources", JoinType.LEFT); + root.fetch("user", JoinType.INNER); + + if (last != null) { + predicates.add(filterLastValues(root, builder)); + } + } + + private String getLastValue(SubjectSortBy property) { + String result = switch (property) { + case ID -> last.getId(); + case USER_LOGIN -> last.getLogin(); + case EXTERNAL_ID -> last.getExternalId(); + }; + if (property.isUnique() && result == null) { + throw new BadRequestException("No last value given for sort property " + property, + SUBJECT, ERR_VALIDATION); + } + return result; + } + + + private Path getPropertyPath(SubjectSortBy property, Root root) { + return switch (property) { + case ID -> root.get("id"); + case USER_LOGIN -> root.get("user").get("login"); + case EXTERNAL_ID -> root.get("externalId"); + }; + } + + private void addRolePredicates(Join userJoin, PredicateBuilder predicates) { + Join rolesJoin = userJoin.join("roles"); + rolesJoin.alias("roles"); + + predicates.equal(() -> rolesJoin.get("project").get("projectName"), projectName); + if (!authority.isEmpty() && authority.size() != SubjectAuthority.values().length) { + predicates.add(rolesJoin.get("authority").get("name").in(authority)); + } + } + + private List getSortOrder(Root root, + CriteriaBuilder builder) { + return sort.stream() + .map(order -> { + Path path = getPropertyPath(order.getSortBy(), root); + if (order.getDirection().isAscending()) { + return builder.asc(path); + } else { + return builder.desc(path); + } + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/radarbase/management/repository/filters/UserFilter.java b/src/main/java/org/radarbase/management/repository/filters/UserFilter.java index 818de0e98..af7dc318b 100644 --- a/src/main/java/org/radarbase/management/repository/filters/UserFilter.java +++ b/src/main/java/org/radarbase/management/repository/filters/UserFilter.java @@ -1,74 +1,176 @@ package org.radarbase.management.repository.filters; -import org.apache.commons.lang.StringUtils; -import org.radarbase.management.domain.Authority; +import org.radarbase.auth.authorization.RoleAuthority; +import org.radarbase.management.domain.Organization; import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Role; import org.radarbase.management.domain.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.jpa.domain.Specification; +import javax.annotation.Nonnull; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.From; import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import java.util.ArrayList; +import javax.persistence.criteria.Subquery; import java.util.List; import java.util.Locale; - -import static org.radarbase.auth.authorization.AuthoritiesConstants.INACTIVE_PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class UserFilter implements Specification { + private static final Logger logger = LoggerFactory.getLogger(UserFilter.class); + private String login; private String email; private String projectName; + private String organization; private String authority; + private boolean includeUpperLevels = false; @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { - - List predicates = new ArrayList<>(); - Join roleJoin = root.join("roles"); - Join authorityJoin = roleJoin.join("authority"); - Predicate filterParticipants = builder.and( - builder.not(authorityJoin.get("name").in(PARTICIPANT, INACTIVE_PARTICIPANT))); - predicates.add(filterParticipants); - - if (isValid(login)) { - predicates.add(builder.like( - builder.lower(root.get("login")), - "%" + login.trim().toLowerCase(Locale.US) + "%")); + public Predicate toPredicate(Root root, @Nonnull CriteriaQuery query, + @Nonnull CriteriaBuilder builder) { + PredicateBuilder predicates = new PredicateBuilder(builder); + predicates.likeLower(root.get("login"), login); + predicates.likeLower(root.get("email"), email); + + filterRoles(predicates, root.join("roles", JoinType.LEFT), query); + + query.distinct(true); + var result = predicates.toAndPredicate(); + logger.debug("Filtering users by {}", result); + return result; + } + + private void filterRoles(PredicateBuilder predicates, Join roleJoin, + CriteriaQuery query) { + Stream authoritiesFiltered = Stream.of(RoleAuthority.values()) + .filter(java.util.function.Predicate.not(RoleAuthority::isPersonal)); + boolean allowNoRole = true; + + if (predicates.isValidValue(authority)) { + String authorityUpper = authority.toUpperCase(Locale.ROOT); + authoritiesFiltered = authoritiesFiltered + .filter(r -> r != null && r.authority().contains(authorityUpper)); + allowNoRole = false; } - if (isValid(email)) { - predicates.add(builder.like( - builder.lower(root.get("email")), - "%" + email.trim().toLowerCase(Locale.US) + "%")); + List authoritiesAllowed = authoritiesFiltered.collect(Collectors.toList()); + if (authoritiesAllowed.isEmpty()) { + CriteriaBuilder builder = predicates.getCriteriaBuilder(); + // never match + predicates.add(builder.isTrue(builder.literal(false))); + return; } - if (isValid(projectName)) { - Join projectJoin = roleJoin.join("project"); - predicates.add(builder.like(builder.lower(projectJoin.get("projectName")), - "%" + projectName.trim().toLowerCase(Locale.US) + "%")); + determineScope(predicates, roleJoin, query, authoritiesAllowed, allowNoRole); + } + + private void determineScope( + PredicateBuilder predicates, + Join roleJoin, + CriteriaQuery query, + List authoritiesAllowed, + boolean allowNoRole) { + PredicateBuilder authorityPredicates = predicates.newBuilder(); + + boolean allowNoRoleInScope = allowNoRole; + // Is organization admin + if (predicates.isValidValue(projectName)) { + allowNoRoleInScope = false; + // Is project admin + entitySubquery(RoleAuthority.Scope.PROJECT, roleJoin, + query, authorityPredicates, authoritiesAllowed, + (b, proj) -> b.likeLower(proj.get("projectName"), projectName)); + + // Is organization admin for organization above current project + if (includeUpperLevels) { + entitySubquery(RoleAuthority.Scope.ORGANIZATION, roleJoin, + query, authorityPredicates, authoritiesAllowed, + (b, org) -> b.likeLower( + org.join("projects").get("projectName"), projectName)); + } + } else if (predicates.isValidValue(organization)) { + allowNoRoleInScope = false; + entitySubquery(RoleAuthority.Scope.ORGANIZATION, roleJoin, + query, authorityPredicates, authoritiesAllowed, + (b, org) -> b.likeLower(org.get("name"), organization)); } - if (isValid(authority)) { - Predicate filterByAuthority = builder.and(builder.like( - builder.lower( - authorityJoin.get("name")), - "%" + authority.trim().toLowerCase(Locale.US) + "%"), - filterParticipants); - predicates.add(filterByAuthority); - } else { - predicates.add(filterParticipants); + if (authorityPredicates.isEmpty()) { + // no project or organization filters applied + addAllowedAuthorities(authorityPredicates, roleJoin, authoritiesAllowed, null); + } else if (includeUpperLevels) { + // is sys admin + addAllowedAuthorities(authorityPredicates, roleJoin, authoritiesAllowed, + RoleAuthority.Scope.GLOBAL); + } + if (allowNoRoleInScope) { + authorityPredicates.isNull(roleJoin.get("id")); } - if (predicates.isEmpty()) { - return null; + predicates.add(authorityPredicates.toOrPredicate()); + } + + private boolean addAllowedAuthorities(PredicateBuilder predicates, + Join roleJoin, + List authorities, + RoleAuthority.Scope scope) { + + Stream authorityStream = authorities.stream(); + if (scope != null) { + authorityStream = authorityStream.filter(r -> r.scope() == scope); + } + List authorityNames = authorityStream + .map(RoleAuthority::authority) + .collect(Collectors.toList()); + + if (!authorityNames.isEmpty()) { + predicates.in(roleJoin.get("authority").get("name"), authorityNames); + return true; } else { - query.distinct(true); - return builder.and(predicates.toArray(new Predicate[0])); + return false; + } + } + + /** Create a subquery to filter the roles. */ + private void entitySubquery(RoleAuthority.Scope scope, + Join roleJoin, + CriteriaQuery query, + PredicateBuilder predicates, + List allowedRoles, + BiConsumer> queryMatch) { + PredicateBuilder authorityPredicates = predicates.newBuilder(); + + if (!addAllowedAuthorities(authorityPredicates, roleJoin, allowedRoles, scope)) { + return; } + + Subquery subQuery = query.subquery(Long.class); + subQuery.distinct(true); + Root orgRoot = subQuery.from((Class) switch (scope) { + case PROJECT -> Project.class; + case ORGANIZATION -> Organization.class; + default -> throw new IllegalStateException("Unknown role scope " + scope); + }); + subQuery.select(orgRoot.get("id")); + PredicateBuilder subqueryPredicates = predicates.newBuilder(); + queryMatch.accept(subqueryPredicates, orgRoot); + subQuery.where(subqueryPredicates.toAndPredicate()); + + authorityPredicates.in(roleJoin.get( switch (scope) { + case ORGANIZATION -> "organization"; + case PROJECT -> "project"; + default -> throw new IllegalStateException("Unknown role scope " + scope); + }).get("id"), subQuery); + + predicates.add(authorityPredicates.toAndPredicate()); } public String getLogin() { @@ -95,6 +197,14 @@ public void setProjectName(String projectName) { this.projectName = projectName; } + public String getOrganization() { + return organization; + } + + public void setOrganization(String organization) { + this.organization = organization; + } + public String getAuthority() { return authority; } @@ -103,7 +213,11 @@ public void setAuthority(String authority) { this.authority = authority; } - private static boolean isValid(String str) { - return StringUtils.isNotBlank(str) && !str.equals("null"); + public boolean isIncludeUpperLevels() { + return includeUpperLevels; + } + + public void setIncludeUpperLevels(boolean includeUpperLevels) { + this.includeUpperLevels = includeUpperLevels; } } diff --git a/src/main/java/org/radarbase/management/security/ClaimsTokenEnhancer.java b/src/main/java/org/radarbase/management/security/ClaimsTokenEnhancer.java index 748a6eff6..cf6b39cc1 100644 --- a/src/main/java/org/radarbase/management/security/ClaimsTokenEnhancer.java +++ b/src/main/java/org/radarbase/management/security/ClaimsTokenEnhancer.java @@ -1,12 +1,8 @@ package org.radarbase.management.security; -import java.time.Instant; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - +import org.radarbase.auth.authorization.Permission; import org.radarbase.auth.token.JwtRadarToken; +import org.radarbase.management.domain.Role; import org.radarbase.management.domain.Source; import org.radarbase.management.repository.SubjectRepository; import org.radarbase.management.repository.UserRepository; @@ -17,12 +13,22 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.actuate.audit.AuditEvent; import org.springframework.boot.actuate.audit.AuditEventRepository; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.security.oauth2.provider.token.TokenEnhancer; +import java.security.Principal; +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + public class ClaimsTokenEnhancer implements TokenEnhancer, InitializingBean { private static final Logger logger = LoggerFactory.getLogger(ClaimsTokenEnhancer.class); @@ -35,7 +41,6 @@ public class ClaimsTokenEnhancer implements TokenEnhancer, InitializingBean { @Autowired private AuditEventRepository auditEventRepository; - @Value("${spring.application.name}") private String appName; @@ -44,24 +49,47 @@ public class ClaimsTokenEnhancer implements TokenEnhancer, InitializingBean { @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { - logger.debug("Enhancing token {} with authentication {}" , accessToken, authentication); + logger.debug("Enhancing token of authentication {}" , authentication); Map additionalInfo = new HashMap<>(); - String userName = SecurityUtils.getUserName(authentication); + String userName = authentication.getName(); - if (userName != null) { + if (authentication.getPrincipal() instanceof Principal + || authentication.getPrincipal() instanceof UserDetails) { // add the 'sub' claim in accordance with JWT spec additionalInfo.put("sub", userName); userRepository.findOneByLogin(userName) .ifPresent(user -> { - List roles = user.getRoles().stream() - .filter(role -> role.getProject() != null) - .map(role -> role.getProject().getProjectName() + ":" - + role.getAuthority().getName()) + var roles = user.getRoles().stream() + .map(role -> { + var auth = role.getAuthority().getName(); + return switch (role.getRole().scope()) { + case GLOBAL -> auth; + case ORGANIZATION -> role.getOrganization().getName() + + ":" + auth; + case PROJECT -> role.getProject().getProjectName() + + ":" + auth; + }; + }) .collect(Collectors.toList()); additionalInfo.put(JwtRadarToken.ROLES_CLAIM, roles); + + // Do not grant scopes that cannot be given to a user. + Set currentScopes = accessToken.getScope(); + Set newScopes = currentScopes.stream() + .filter(scope -> { + Permission permission = Permission.ofScope(scope); + return user.getRoles().stream() + .map(Role::getRole) + .anyMatch(permission::isRoleAllowed); + }) + .collect(Collectors.toCollection(TreeSet::new)); + + if (!newScopes.equals(currentScopes)) { + ((DefaultOAuth2AccessToken) accessToken).setScope(newScopes); + } }); List assignedSources = subjectRepository.findSourcesBySubjectLogin(userName); @@ -86,7 +114,7 @@ public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, Map auditData = auditData(accessToken, authentication); auditEventRepository.add(new AuditEvent(userName, GRANT_TOKEN_EVENT, auditData)); - logger.info("[{}] for {}: {}", GRANT_TOKEN_EVENT, userName, auditData.toString()); + logger.info("[{}] for {}: {}", GRANT_TOKEN_EVENT, userName, auditData); return accessToken; } diff --git a/src/main/java/org/radarbase/management/security/Http401UnauthorizedEntryPoint.java b/src/main/java/org/radarbase/management/security/Http401UnauthorizedEntryPoint.java new file mode 100644 index 000000000..d39bf8c80 --- /dev/null +++ b/src/main/java/org/radarbase/management/security/Http401UnauthorizedEntryPoint.java @@ -0,0 +1,48 @@ +/* + * Copyright 2016-2017 the original author or authors from the JHipster project. + * + * This file is part of the JHipster project, see http://www.jhipster.tech/ + * for more information. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarbase.management.security; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Returns a 401 error code (Unauthorized) to the client. + */ +public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint { + private static final Logger log = LoggerFactory.getLogger(Http401UnauthorizedEntryPoint.class); + + /** + * Always returns a 401 error code to the client. + */ + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException arg2) + throws IOException { + + log.debug("Pre-authenticated entry point called. Rejecting access"); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied"); + } +} diff --git a/src/main/java/org/radarbase/management/security/JwtAuthenticationFilter.java b/src/main/java/org/radarbase/management/security/JwtAuthenticationFilter.java index 3ea86cac6..7c513fe5a 100644 --- a/src/main/java/org/radarbase/management/security/JwtAuthenticationFilter.java +++ b/src/main/java/org/radarbase/management/security/JwtAuthenticationFilter.java @@ -2,40 +2,74 @@ import org.radarbase.auth.authentication.TokenValidator; import org.radarbase.auth.exception.TokenValidationException; +import org.radarbase.auth.token.AuthorityReference; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.repository.UserRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.cors.CorsUtils; -import org.springframework.web.filter.GenericFilterBean; +import org.springframework.web.filter.OncePerRequestFilter; +import javax.annotation.Nonnull; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * Created by dverbeec on 29/09/2017. */ -public class JwtAuthenticationFilter extends GenericFilterBean { - - private static final Logger log = LoggerFactory.getLogger(JwtAuthenticationFilter.class); +public class JwtAuthenticationFilter extends OncePerRequestFilter { + private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class); private final TokenValidator validator; + private final AuthenticationManager authenticationManager; public static final String TOKEN_ATTRIBUTE = "jwt"; private final List ignoreUrls; + private final UserRepository userRepository; + private final boolean isOptional; + + /** + * Authentication filter using given validator. Authentication is mandatory. + * @param validator validates the JWT token. + * @param authenticationManager authentication manager to pass valid authentication to. + * @param userRepository user repository to retrieve user details from. + */ + public JwtAuthenticationFilter(TokenValidator validator, + AuthenticationManager authenticationManager, + UserRepository userRepository) { + this(validator, authenticationManager, userRepository, false); + } - public JwtAuthenticationFilter( - TokenValidator validator - ) { + /** + * Authentication filter using given validator. + * @param validator validates the JWT token. + * @param authenticationManager authentication manager to pass valid authentication to. + * @param userRepository user repository to retrieve user details from. + * @param isOptional do not fail if no authentication is provided + */ + public JwtAuthenticationFilter(TokenValidator validator, + AuthenticationManager authenticationManager, + UserRepository userRepository, + boolean isOptional) { this.validator = validator; + this.authenticationManager = authenticationManager; + this.userRepository = userRepository; this.ignoreUrls = new ArrayList<>(); + this.isOptional = isOptional; } /** @@ -52,43 +86,93 @@ public JwtAuthenticationFilter skipUrlPattern(HttpMethod method, String... antPa } @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws - IOException, ServletException { - if (CorsUtils.isPreFlightRequest((HttpServletRequest) request)) { - log.debug("Skipping JWT check for preflight request"); - chain.doFilter(request, response); + protected void doFilterInternal(@Nonnull HttpServletRequest httpRequest, + @Nonnull HttpServletResponse httpResponse, @Nonnull FilterChain chain) + throws IOException, ServletException { + if (CorsUtils.isPreFlightRequest(httpRequest)) { + logger.debug("Skipping JWT check for preflight request"); + chain.doFilter(httpRequest, httpResponse); return; } - HttpServletRequest httpRequest = (HttpServletRequest) request; - AntPathRequestMatcher ignored = ignoreUrls.stream() - .filter(pattern -> pattern.matches(httpRequest)) - .findAny() - .orElse(null); + HttpSession session = httpRequest.getSession(false); + SessionRadarToken token = null; + if (session != null) { + token = SessionRadarToken.from((RadarToken) session.getAttribute(TOKEN_ATTRIBUTE)); + } + if (token == null) { + try { + token = SessionRadarToken.from(validator.validateAccessToken(getToken(httpRequest, + httpResponse))); + } catch (TokenValidationException ex) { + if (isOptional) { + logger.debug("Skipping optional token: {}", ex.getMessage()); + } else { + logger.error("Failed to validate token: {}", ex.getMessage()); + httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + httpResponse.setHeader( + HttpHeaders.WWW_AUTHENTICATE, OAuth2AccessToken.BEARER_TYPE); + httpResponse.getOutputStream().print( + "{\"error\": \"" + "Unauthorized" + ",\n" + + "\"status\": \"" + HttpServletResponse.SC_UNAUTHORIZED + + "\",\n" + + "\"message\": \"" + ex.getMessage() + "\",\n" + + "\"path\": \"" + httpRequest.getRequestURI() + "\n" + + "\"}"); + return; + } + } + } else if (!token.isClientCredentials()) { + var user = userRepository.findOneByLogin(token.getUsername()); + if (user.isPresent()) { + var roles = user.get().getRoles().stream() + .map(role -> { + var auth = role.getRole(); + return switch (role.getRole().scope()) { + case GLOBAL -> new AuthorityReference(auth); + case ORGANIZATION -> new AuthorityReference(auth, + role.getOrganization().getName()); + case PROJECT -> new AuthorityReference(auth, + role.getProject().getProjectName()); + }; + }) + .collect(Collectors.toSet()); + token = token.withRoles(roles); + } else { + session.removeAttribute(TOKEN_ATTRIBUTE); + httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + httpResponse.setHeader(HttpHeaders.WWW_AUTHENTICATE, OAuth2AccessToken.BEARER_TYPE); + httpResponse.getOutputStream().print( + "{\"error\": \"" + "Unauthorized" + ",\n" + + "\"status\": \"" + HttpServletResponse.SC_UNAUTHORIZED + ",\n" + + "\"message\": \"User not found\",\n" + + "\"path\": \"" + httpRequest.getRequestURI() + "\n" + + "\"}"); + return; + } + } - if (ignored != null) { - log.debug("Skipping JWT check for {} request", ignored); - chain.doFilter(request, response); - return; + if (token != null) { + httpRequest.setAttribute(TOKEN_ATTRIBUTE, token); + RadarAuthentication authentication = new RadarAuthentication(token); + authenticationManager.authenticate(authentication); + SecurityContextHolder.getContext().setAuthentication(authentication); } + chain.doFilter(httpRequest, httpResponse); + } - try { - request.setAttribute(TOKEN_ATTRIBUTE, - validator.validateAccessToken(getToken(request, response))); - log.debug("Request authenticated successfully"); - chain.doFilter(request, response); - } catch (TokenValidationException ex) { - log.error(ex.getMessage()); - HttpServletResponse res = (HttpServletResponse) response; - res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - res.setHeader(HttpHeaders.WWW_AUTHENTICATE, OAuth2AccessToken.BEARER_TYPE); - res.getOutputStream().println( - "{\"error\": \"" + "Unauthorized" + ",\n" - + "\"status\": \"" + HttpServletResponse.SC_UNAUTHORIZED + ",\n" - + "\"message\": \"" + ex.getMessage() + ",\n" - + "\"path\": \"" + ((HttpServletRequest) request).getRequestURI() + "\n" - + "\"}"); + @Override + protected boolean shouldNotFilter(@Nonnull HttpServletRequest httpRequest) { + Optional shouldNotFilterUrl = ignoreUrls.stream() + .filter(pattern -> pattern.matches(httpRequest)) + .findAny(); + + if (shouldNotFilterUrl.isPresent()) { + logger.debug("Skipping JWT check for {} request", shouldNotFilterUrl.get()); + return true; } + + return false; } private String getToken(ServletRequest request, ServletResponse response) { @@ -99,11 +183,10 @@ private String getToken(ServletRequest request, ServletResponse response) { // Check if the HTTP Authorization header is present and formatted correctly if (authorizationHeader == null || !authorizationHeader .startsWith(OAuth2AccessToken.BEARER_TYPE)) { - log.error("No authorization header provided in the request"); res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); res.setHeader(HttpHeaders.WWW_AUTHENTICATE, OAuth2AccessToken.BEARER_TYPE); throw new TokenValidationException("No " + OAuth2AccessToken.BEARER_TYPE + " token " - + "present in the request."); + + "present in the request to " + req.getServletPath()); } // Extract the token from the HTTP Authorization header diff --git a/src/main/java/org/radarbase/management/security/RadarAuthentication.java b/src/main/java/org/radarbase/management/security/RadarAuthentication.java new file mode 100644 index 000000000..0262f0f94 --- /dev/null +++ b/src/main/java/org/radarbase/management/security/RadarAuthentication.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.security; + +import org.radarbase.auth.token.RadarToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +import javax.annotation.Nonnull; +import java.security.Principal; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class RadarAuthentication implements Authentication, Principal { + private final RadarToken token; + private final List authorities; + private boolean isAuthenticated; + + /** Instantiate authentication via a token. */ + public RadarAuthentication(@Nonnull RadarToken token) { + this.token = token; + isAuthenticated = true; + authorities = token.getAuthorities().stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + } + + @Override + public String getName() { + if (token.isClientCredentials()) { + return token.getClientId(); + } else { + return token.getUsername(); + } + } + + @Override + public Collection getAuthorities() { + return authorities; + } + + @Override + public Object getCredentials() { + return token; + } + + @Override + public Object getDetails() { + return null; + } + + @Override + public Object getPrincipal() { + if (token.isClientCredentials()) { + return null; + } else { + return this; + } + } + + @Override + public boolean isAuthenticated() { + return isAuthenticated; + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + this.isAuthenticated = isAuthenticated; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + RadarAuthentication that = (RadarAuthentication) o; + + return isAuthenticated == that.isAuthenticated + && Objects.equals(token, that.token); + } + + @Override + public int hashCode() { + int result = token != null ? token.hashCode() : 0; + result = 31 * result + (isAuthenticated ? 1 : 0); + return result; + } + + @Override + public String toString() { + return "RadarAuthentication{" + "token=" + token + + ", authenticated=" + isAuthenticated() + + '}'; + } +} diff --git a/src/main/java/org/radarbase/management/security/RadarAuthenticationProvider.java b/src/main/java/org/radarbase/management/security/RadarAuthenticationProvider.java new file mode 100644 index 000000000..cb0ca63b2 --- /dev/null +++ b/src/main/java/org/radarbase/management/security/RadarAuthenticationProvider.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.security; + +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +public class RadarAuthenticationProvider implements AuthenticationProvider { + @Override + public Authentication authenticate(Authentication authentication) + throws AuthenticationException { + if (authentication.isAuthenticated()) { + return authentication; + } + return null; + } + + @Override + public boolean supports(Class authentication) { + return authentication.equals(RadarAuthentication.class); + } +} diff --git a/src/main/java/org/radarbase/management/security/SecurityUtils.java b/src/main/java/org/radarbase/management/security/SecurityUtils.java index 8d48499d3..3c498df87 100644 --- a/src/main/java/org/radarbase/management/security/SecurityUtils.java +++ b/src/main/java/org/radarbase/management/security/SecurityUtils.java @@ -1,19 +1,14 @@ package org.radarbase.management.security; -import org.radarbase.auth.token.RadarToken; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; -import javax.servlet.ServletRequest; - /** * Utility class for Spring Security. */ public final class SecurityUtils { - private SecurityUtils() { } @@ -38,38 +33,17 @@ public static String getUserName(Authentication authentication) { return null; } - if (authentication.getPrincipal() instanceof UserDetails) { - UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); - return springSecurityUser.getUsername(); - } else if (authentication.getPrincipal() instanceof String) { + Object principal = authentication.getPrincipal(); + if (principal == null) { + return null; + } else if (principal instanceof UserDetails) { + return ((UserDetails) authentication.getPrincipal()).getUsername(); + } else if (principal instanceof String) { return (String) authentication.getPrincipal(); + } else if (principal instanceof Authentication) { + return ((Authentication)principal).getName(); } else { return null; } } - - /** - * Parse the {@code "jwt"} attribute from given request. - * - * @param request servlet request - * @return decoded JWT - * @throws AccessDeniedException if the {@code "jwt"} attribute is missing or does not contain a - * decoded JWT - */ - public static RadarToken getJWT(ServletRequest request) { - Object token = request.getAttribute(JwtAuthenticationFilter.TOKEN_ATTRIBUTE); - if (token == null) { - // should not happen, the JwtAuthenticationFilter would throw an exception first if it - // can not decode the authorization header into a valid JWT - throw new AccessDeniedException("No token was found in the request context."); - } - if (!(token instanceof RadarToken)) { - // should not happen, the JwtAuthenticationFilter will only set a DecodedJWT object - throw new AccessDeniedException("Expected token to be of type org.radarbase" - + ".auth.token.RadarToken but was " + token.getClass().getName()); - } - return (RadarToken) token; - } - - } diff --git a/src/main/java/org/radarbase/management/security/SessionRadarToken.java b/src/main/java/org/radarbase/management/security/SessionRadarToken.java new file mode 100644 index 000000000..1c5c0359f --- /dev/null +++ b/src/main/java/org/radarbase/management/security/SessionRadarToken.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.security; + +import org.radarbase.auth.token.AbstractRadarToken; +import org.radarbase.auth.token.AuthorityReference; +import org.radarbase.auth.token.RadarToken; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Set; + +public class SessionRadarToken extends AbstractRadarToken implements Serializable { + private final Set roles; + private final String subject; + private final String token; + private final List scopes; + private final List audience; + private final List authorities; + private final List sources; + private final String grantType; + private final Date issuedAt; + private final Date expiresAt; + private final String issuer; + private final String clientId; + private final String type; + private final String username; + + /** Instantiate a serializable session token by copying an existing RadarToken. */ + public SessionRadarToken(RadarToken token) { + this(token, token.getRoles()); + } + + /** Instantiate a serializable session token by copying an existing RadarToken. */ + private SessionRadarToken(RadarToken token, Set roles) { + this.roles = Set.copyOf(roles); + this.subject = token.getSubject(); + this.token = token.getToken(); + this.scopes = List.copyOf(token.getScopes()); + this.audience = List.copyOf(token.getAudience()); + this.authorities = List.copyOf(token.getAuthorities()); + this.sources = List.copyOf(token.getSources()); + this.grantType = token.getGrantType(); + this.issuedAt = token.getIssuedAt(); + this.expiresAt = token.getExpiresAt(); + this.issuer = token.getIssuer(); + this.clientId = token.getClientId(); + this.type = token.getType(); + this.username = token.getUsername(); + } + + @Override + public Set getRoles() { + return roles; + } + + @Override + public List getAuthorities() { + return authorities; + } + + @Override + public List getScopes() { + return scopes; + } + + @Override + public List getSources() { + return sources; + } + + @Override + public String getGrantType() { + return grantType; + } + + @Override + public String getSubject() { + return subject; + } + + @Override + public Date getIssuedAt() { + return issuedAt; + } + + @Override + public Date getExpiresAt() { + return expiresAt; + } + + @Override + public List getAudience() { + return audience; + } + + @Override + public String getToken() { + return token; + } + + @Override + public String getIssuer() { + return issuer; + } + + @Override + public String getType() { + return type; + } + + @Override + public String getClientId() { + return clientId; + } + + @Override + public String getClaimString(String name) { + return null; + } + + @Override + public List getClaimList(String name) { + return List.of(); + } + + @Override + public String getUsername() { + return username; + } + + public SessionRadarToken withRoles(Set roles) { + return new SessionRadarToken(this, roles); + } + + /** + * Create a new token. + * @return null if provided null, a session radar token otherwise. + */ + public static SessionRadarToken from(RadarToken token) { + if (token == null) { + return null; + } else { + return new SessionRadarToken(token); + } + } +} diff --git a/src/main/java/org/radarbase/management/security/SpringSecurityAuditorAware.java b/src/main/java/org/radarbase/management/security/SpringSecurityAuditorAware.java index 2cdea1d43..4a9a7fead 100644 --- a/src/main/java/org/radarbase/management/security/SpringSecurityAuditorAware.java +++ b/src/main/java/org/radarbase/management/security/SpringSecurityAuditorAware.java @@ -1,8 +1,11 @@ package org.radarbase.management.security; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; +import javax.annotation.Nonnull; import java.util.Optional; /** @@ -10,9 +13,13 @@ */ @Component public class SpringSecurityAuditorAware implements AuditorAware { + @Autowired + private Optional authentication; @Override + @Nonnull public Optional getCurrentAuditor() { - return Optional.ofNullable(SecurityUtils.getCurrentUserLogin()); + return authentication.map(Authentication::getName) + .filter(n -> !n.isEmpty()); } } diff --git a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtAccessTokenConverter.java b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtAccessTokenConverter.java index b374a7e32..5c17d0fe6 100644 --- a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtAccessTokenConverter.java +++ b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtAccessTokenConverter.java @@ -1,24 +1,18 @@ package org.radarbase.management.security.jwt; -import java.time.Instant; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.exceptions.SignatureVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; import org.radarbase.auth.authentication.AlgorithmLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.security.jwt.Jwt; -import org.springframework.security.jwt.JwtHelper; import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; @@ -26,14 +20,22 @@ import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2RefreshToken; import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; -import org.springframework.security.oauth2.common.util.JsonParser; -import org.springframework.security.oauth2.common.util.JsonParserFactory; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.AccessTokenConverter; import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.JwtClaimsSetVerifier; import org.springframework.util.Assert; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.Base64; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + /** * Implementation of {@link JwtAccessTokenConverter} for the RADAR-base ManagementPortal platform. * @@ -44,7 +46,7 @@ public class ManagementPortalJwtAccessTokenConverter implements JwtAccessTokenCo public static final String RES_MANAGEMENT_PORTAL = "res_ManagementPortal"; - private final JsonParser jsonParser = JsonParserFactory.create(); + private final ObjectReader jsonParser = new ObjectMapper().readerFor(Map.class); private static final Logger logger = LoggerFactory.getLogger(ManagementPortalJwtAccessTokenConverter.class); @@ -163,7 +165,6 @@ public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, // add additional information for refresh-token OAuth2RefreshToken refreshToken = accessToken.getRefreshToken(); if (refreshToken != null) { - DefaultOAuth2AccessToken refreshTokenToEnhance = new DefaultOAuth2AccessToken(accessToken); refreshTokenToEnhance.setValue(refreshToken.getValue()); @@ -173,16 +174,6 @@ public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, // set info of access token to refresh-token and add token-id and access-token-id for // reference. - try { - Map claims = jsonParser - .parseMap(JwtHelper.decode(refreshToken.getValue()).getClaims()); - if (claims.containsKey(TOKEN_ID)) { - refreshTokenToEnhance.setValue(claims.get(TOKEN_ID).toString()); - } - } catch (IllegalArgumentException e) { - logger.debug("Could not decode refresh token ", e); - } - Map refreshTokenInfo = new HashMap<>(accessToken.getAdditionalInformation()); refreshTokenInfo.put(TOKEN_ID, refreshTokenToEnhance.getValue()); @@ -242,19 +233,26 @@ public String encode(OAuth2AccessToken accessToken, OAuth2Authentication authent @Override public Map decode(String token) { - Jwt jwt = JwtHelper.decode(token); - String claimsStr = jwt.getClaims(); - Map claims = jsonParser.parseMap(claimsStr); - if (claims.containsKey(EXP) && claims.get(EXP) instanceof Integer) { - Integer intValue = (Integer) claims.get(EXP); - claims.put(EXP, Long.valueOf(intValue)); - } - if (this.getJwtClaimsSetVerifier() != null) { - this.getJwtClaimsSetVerifier().verify(claims); - } + DecodedJWT jwt = JWT.decode(token); + List verifierToUse; + Map claims; + try { + String decodedPayload = new String(Base64.getUrlDecoder().decode(jwt.getPayload()), + StandardCharsets.UTF_8); + claims = jsonParser.readValue(decodedPayload); + if (claims.containsKey(EXP) && claims.get(EXP) instanceof Integer) { + Integer intValue = (Integer) claims.get(EXP); + claims.put(EXP, Long.valueOf(intValue)); + } + if (this.getJwtClaimsSetVerifier() != null) { + this.getJwtClaimsSetVerifier().verify(claims); + } - List verifierToUse = claims.get(ACCESS_TOKEN_ID) != null - ? refreshTokenVerifiers : verifiers; + verifierToUse = claims.get(ACCESS_TOKEN_ID) != null + ? refreshTokenVerifiers : verifiers; + } catch (JsonProcessingException ex) { + throw new InvalidTokenException("Invalid token", ex); + } for (JWTVerifier verifier : verifierToUse) { try { @@ -264,11 +262,10 @@ public Map decode(String token) { logger.warn("Client presented a token with an incorrect signature"); } catch (JWTVerificationException ex) { logger.debug("Verifier {} with implementation {} did not accept token: {}", - verifier.toString(), verifier.getClass().toString(), ex.getMessage()); + verifier, verifier.getClass(), ex.getMessage()); } } throw new InvalidTokenException("No registered validator could authenticate this token"); } - } diff --git a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtTokenStore.java b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtTokenStore.java index e4d33ff5f..02bc31ff8 100644 --- a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtTokenStore.java +++ b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalJwtTokenStore.java @@ -6,8 +6,6 @@ import java.util.Date; import java.util.HashSet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; @@ -37,10 +35,6 @@ * @author nivethika */ public class ManagementPortalJwtTokenStore implements TokenStore { - - private static final Logger logger = - LoggerFactory.getLogger(ManagementPortalJwtTokenStore.class); - private final JwtAccessTokenConverter jwtAccessTokenConverter; private ApprovalStore approvalStore; @@ -95,7 +89,6 @@ public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authe @Override public OAuth2AccessToken readAccessToken(String tokenValue) { - logger.debug("Access token is {}", tokenValue); OAuth2AccessToken accessToken = convertAccessToken(tokenValue); if (jwtAccessTokenConverter.isRefreshToken(accessToken)) { diff --git a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalOauthKeyStoreHandler.java b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalOauthKeyStoreHandler.java index f4153d19f..0ae7dea83 100644 --- a/src/main/java/org/radarbase/management/security/jwt/ManagementPortalOauthKeyStoreHandler.java +++ b/src/main/java/org/radarbase/management/security/jwt/ManagementPortalOauthKeyStoreHandler.java @@ -1,8 +1,26 @@ package org.radarbase.management.security.jwt; -import static org.radarbase.management.security.jwt.ManagementPortalJwtAccessTokenConverter.RES_MANAGEMENT_PORTAL; - import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import org.radarbase.auth.authentication.TokenValidator; +import org.radarbase.auth.config.TokenValidatorConfig; +import org.radarbase.auth.security.jwk.JavaWebKeySet; +import org.radarbase.management.config.ManagementPortalProperties; +import org.radarbase.management.security.jwt.algorithm.EcdsaJwtAlgorithm; +import org.radarbase.management.security.jwt.algorithm.JwtAlgorithm; +import org.radarbase.management.security.jwt.algorithm.RsaJwtAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.servlet.ServletContext; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -25,30 +43,10 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import javax.servlet.ServletContext; -import org.radarbase.auth.authentication.AlgorithmLoader; -import org.radarbase.auth.authentication.TokenValidator; -import org.radarbase.auth.config.TokenValidatorConfig; -import org.radarbase.auth.config.TokenVerifierPublicKeyConfig; -import org.radarbase.auth.security.jwk.JavaWebKeySet; -import org.radarbase.management.config.ManagementPortalProperties; -import org.radarbase.management.security.jwt.algorithm.EcdsaJwtAlgorithm; -import org.radarbase.management.security.jwt.algorithm.JwtAlgorithm; -import org.radarbase.management.security.jwt.algorithm.RsaJwtAlgorithm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; +import static java.util.Objects.requireNonNull; +import static org.radarbase.management.security.jwt.ManagementPortalJwtAccessTokenConverter.RES_MANAGEMENT_PORTAL; /** * Similar to Spring's @@ -77,13 +75,9 @@ public class ManagementPortalOauthKeyStoreHandler { private final String managementPortalBaseUrl; - private final TokenValidatorConfig deprecatedValidatedConfig; - private final List verifiers; private final List refreshTokenVerifiers; - private final AlgorithmLoader algorithmLoader = new AlgorithmLoader(); - /** * Keystore factory. This tries to load the first valid keystore listed in resources. * @@ -105,46 +99,23 @@ public ManagementPortalOauthKeyStoreHandler( this.store = loadedStore.getValue(); this.verifierPublicKeyAliasList = loadVerifiersPublicKeyAliasList(); - if (managementPortalProperties.getOauth().getEnablePublicKeyVerifiers()) { - this.deprecatedValidatedConfig = TokenVerifierPublicKeyConfig.readFromFileOrClasspath(); - } else { - this.deprecatedValidatedConfig = null; - } - this.managementPortalBaseUrl = "http://localhost:" + environment.getProperty("server.port") + servletContext.getContextPath(); logger.info("Using Management Portal base-url {}", this.managementPortalBaseUrl); - List algorithms = Stream.concat( - loadAlgorithmsFromAlias(), - loadDeprecatedAlgorithms()) + List algorithms = loadAlgorithmsFromAlias() .filter(Objects::nonNull) - .collect(Collectors.toList()); + .toList(); verifiers = algorithms.stream() .map(algo -> JWT.require(algo).withAudience(RES_MANAGEMENT_PORTAL).build()) - .collect(Collectors.toList()); + .toList(); // No need to check audience with a refresh token: it can be used // to refresh tokens intended for other resources. refreshTokenVerifiers = algorithms.stream() .map(algo -> JWT.require(algo).build()) - .collect(Collectors.toList()); - } - - /** - * Load deprecated verifiers if configured to load. This may yield no results. - * @return deprecated verifiers in a stream. - */ - @SuppressWarnings("deprecation") - private Stream loadDeprecatedAlgorithms() { - if (deprecatedValidatedConfig == null) { - return Stream.empty(); - } - - return deprecatedValidatedConfig.getPublicKeys() - .stream() - .map(algorithmLoader::loadDeprecatedAlgorithmFromPublicKey); + .toList(); } private static void checkOAuthConfig(ManagementPortalProperties managementPortalProperties) { @@ -178,7 +149,7 @@ private Map.Entry loadStore() { continue; } try { - String fileName = resource.getFilename().toLowerCase(Locale.US); + String fileName = requireNonNull(resource.getFilename()).toLowerCase(Locale.ROOT); String type = fileName.endsWith(".pfx") || fileName.endsWith(".p12") ? "PKCS12" : "jks"; KeyStore localStore = KeyStore.getInstance(type); @@ -213,7 +184,7 @@ public JavaWebKeySet loadJwks() { .map(ManagementPortalOauthKeyStoreHandler::getJwtAlgorithm) .filter(Objects::nonNull) .map(JwtAlgorithm::getJwk) - .collect(Collectors.toList())); + .toList()); } /** @@ -345,7 +316,6 @@ public TokenValidator getTokenValidator() { private TokenValidatorConfig getKeystoreConfigsForVerifiers() { return new TokenValidatorConfig() { - @Override public List getPublicKeyEndpoints() { try { @@ -361,16 +331,6 @@ public List getPublicKeyEndpoints() { public String getResourceName() { return RES_MANAGEMENT_PORTAL; } - - // management-portal should support old verifiers to verify refresh-tokens, if - // configured. otherwise, use the token_key endpoint only. - @Override - @SuppressWarnings("deprecation") - public List getPublicKeys() { - return deprecatedValidatedConfig != null - ? deprecatedValidatedConfig.getPublicKeys() - : Collections.emptyList(); - } }; } diff --git a/src/main/java/org/radarbase/management/security/jwt/algorithm/AsymmetricalJwtAlgorithm.java b/src/main/java/org/radarbase/management/security/jwt/algorithm/AsymmetricalJwtAlgorithm.java index b98df6cd2..d3676dd52 100644 --- a/src/main/java/org/radarbase/management/security/jwt/algorithm/AsymmetricalJwtAlgorithm.java +++ b/src/main/java/org/radarbase/management/security/jwt/algorithm/AsymmetricalJwtAlgorithm.java @@ -1,9 +1,9 @@ package org.radarbase.management.security.jwt.algorithm; import java.security.KeyPair; +import java.util.Base64; import org.radarbase.auth.security.jwk.JavaWebKey; -import org.springframework.security.crypto.codec.Base64; public abstract class AsymmetricalJwtAlgorithm implements JwtAlgorithm { @@ -25,7 +25,7 @@ protected AsymmetricalJwtAlgorithm(KeyPair keyPair) { @Override public String getVerifierKeyEncodedString() { return getEncodedStringHeader() + '\n' - + new String(Base64.encode(keyPair.getPublic().getEncoded())) + + new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())) + '\n' + getEncodedStringFooter(); } diff --git a/src/main/java/org/radarbase/management/service/GroupService.java b/src/main/java/org/radarbase/management/service/GroupService.java new file mode 100644 index 000000000..01b08d551 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/GroupService.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.service; + +import org.radarbase.management.domain.Group; +import org.radarbase.management.domain.Project; +import org.radarbase.management.domain.Subject; +import org.radarbase.management.repository.GroupRepository; +import org.radarbase.management.repository.ProjectRepository; +import org.radarbase.management.repository.SubjectRepository; +import org.radarbase.management.service.dto.GroupDTO; +import org.radarbase.management.service.mapper.GroupMapper; +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.radarbase.management.web.rest.errors.ConflictException; +import org.radarbase.management.web.rest.errors.NotFoundException; +import org.radarbase.management.web.rest.vm.GroupPatchOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.radarbase.management.web.rest.errors.EntityName.GROUP; +import static org.radarbase.management.web.rest.errors.EntityName.PROJECT; +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_GROUP_EXISTS; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_GROUP_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PROJECT_NAME_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; + +/** + * Service to manage project groups. + */ +@Service +public class GroupService { + @Autowired + private GroupRepository groupRepository; + + @Autowired + private ProjectRepository projectRepository; + + @Autowired + private SubjectRepository subjectRepository; + + @Autowired + private GroupMapper groupMapper; + + /** + * Get the group by name. + * @param projectName project name + * @param groupName group name + * @return group + * @throws NotFoundException if the project or group is not found. + */ + @Transactional + public GroupDTO getGroup(String projectName, String groupName) { + return groupMapper.groupToGroupDTOFull(groupRepository.findByProjectNameAndName(projectName, + groupName) + .orElseThrow(() -> new NotFoundException( + "Group " + groupName + " not found in project " + projectName, + GROUP, ERR_GROUP_NOT_FOUND))); + } + + /** + * Delete the group by name. + * @param projectName project name + * @param groupName group name + * @param unlinkSubjects unset group for each linked subject + * @throws NotFoundException if the project or group is not found. + */ + @Transactional + public void deleteGroup(String projectName, String groupName, boolean unlinkSubjects) { + Group group = groupRepository.findByProjectNameAndName(projectName, groupName) + .orElseThrow(() -> new NotFoundException( + "Group " + groupName + " not found in project " + projectName, + GROUP, ERR_GROUP_NOT_FOUND)); + + if (!unlinkSubjects) { + var subjectCount = subjectRepository.countByGroupId(group.getId()); + if (subjectCount > 0) { + var msg = "Group " + groupName + " has subjects. " + + "Add `unlinkSubjects=true` query param to confirm deletion"; + throw new ConflictException(msg, GROUP, ERR_VALIDATION); + } + } + groupRepository.delete(group); + } + + /** + * Create the group. + * @param projectName project name + * @param groupDto group values + * @throws NotFoundException if the project is not found. + * @throws ConflictException if the group name already exists. + */ + @Transactional + public GroupDTO createGroup(String projectName, GroupDTO groupDto) { + Project project = projectRepository.findOneWithGroupsByName(projectName) + .orElseThrow(() -> new NotFoundException( + "Project with name " + projectName + " not found", + PROJECT, ERR_PROJECT_NAME_NOT_FOUND)); + + if (project.getGroups().stream() + .anyMatch(g -> g.getName().equals(groupDto.getName()))) { + throw new ConflictException( + "Group " + groupDto.getName() + " already exists in project " + projectName, + GROUP, ERR_GROUP_EXISTS); + } + Group group = groupMapper.groupDTOToGroup(groupDto); + group.setProject(project); + + GroupDTO groupDtoResult = groupMapper.groupToGroupDTOFull(groupRepository.save(group)); + project.getGroups().add(group); + projectRepository.save(project); + return groupDtoResult; + } + + /** + * List all groups in a project. + * @param projectName project name + * @throws NotFoundException if the project is not found. + */ + public List listGroups(String projectName) { + Project project = projectRepository.findOneWithGroupsByName(projectName) + .orElseThrow(() -> new NotFoundException( + "Project with name " + projectName + " not found", + PROJECT, ERR_PROJECT_NAME_NOT_FOUND)); + return groupMapper.groupToGroupDTOs(project.getGroups()); + } + + /** + * Add subjects to group. + * @param projectName project name + * @param groupName group name + * @param subjectsToAdd patch items for subjects to be added + * @param subjectsToRemove patch items for subjects to be removed + * @throws NotFoundException if the project or group is not found. + */ + @Transactional + public void updateGroupSubjects( + String projectName, String groupName, + List subjectsToAdd, + List subjectsToRemove + ) { + Group group = groupRepository + .findByProjectNameAndName(projectName, groupName) + .orElseThrow(() -> new NotFoundException( + "Group " + groupName + " not found in project " + projectName, + GROUP, ERR_GROUP_NOT_FOUND)); + + List entitiesToAdd = getSubjectEntities(projectName, subjectsToAdd); + List entitiesToRemove = getSubjectEntities(projectName, subjectsToRemove); + + if (!entitiesToAdd.isEmpty()) { + List idsToAdd = entitiesToAdd.stream() + .map(Subject::getId).collect(Collectors.toList()); + subjectRepository.setGroupIdByIds(group.getId(), idsToAdd); + } + + if (!entitiesToRemove.isEmpty()) { + List idsToRemove = entitiesToRemove.stream() + .map(Subject::getId).collect(Collectors.toList()); + subjectRepository.unsetGroupIdByIds(idsToRemove); + } + } + + private List getSubjectEntities( + String projectName, + List subjectsToModify + ) { + List logins = new ArrayList<>(); + List ids = new ArrayList<>(); + + extractSubjectIdentities(subjectsToModify, logins, ids); + + List subjectEntities = new ArrayList<>(subjectsToModify.size()); + if (!ids.isEmpty()) { + subjectEntities.addAll(subjectRepository.findAllById(ids)); + } + if (!logins.isEmpty()) { + subjectEntities.addAll(subjectRepository.findAllBySubjectLogins(logins)); + } + + for (Subject s : subjectEntities) { + String login = s.getUser().getLogin(); + if (s.getActiveProject().isEmpty()) { + throw new BadRequestException( + "Subject " + login + " is not assigned to a project", + SUBJECT, ERR_VALIDATION); + } + if (!projectName.equals(s.getActiveProject().get().getProjectName())) { + throw new BadRequestException( + "Subject " + login + " belongs to a different project", + SUBJECT, ERR_VALIDATION); + } + } + + return subjectEntities; + } + + private void extractSubjectIdentities( + List subjectsToModify, + List logins, + List ids + ) { + // Each item should specify either a login or an ID, + // since having both will require an extra validation step + // to reject e.g. {id: 1, login: "subject-id-42"}. + // Whether the IDs and logins exist and belong to the project + // should be checked later + for (var item : subjectsToModify) { + String login = item.getLogin(); + Long id = item.getId(); + if (id == null && login == null) { + throw new BadRequestException( + "Subject identification must be specified", + GROUP, ERR_VALIDATION); + } + if (id != null && login != null) { + throw new BadRequestException( + "Subject identification must be specify either ID or Login. " + + "Do not provide both values to avoid potential confusion.", + GROUP, ERR_VALIDATION); + } + + if (id != null) { + ids.add(id); + } + if (login != null) { + logins.add(login); + } + } + } +} diff --git a/src/main/java/org/radarbase/management/service/MailService.java b/src/main/java/org/radarbase/management/service/MailService.java index 8999a9aeb..5dbcb30d6 100644 --- a/src/main/java/org/radarbase/management/service/MailService.java +++ b/src/main/java/org/radarbase/management/service/MailService.java @@ -1,10 +1,10 @@ package org.radarbase.management.service; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Locale; import javax.mail.internet.MimeMessage; -import org.apache.commons.lang3.CharEncoding; import org.radarbase.management.config.ManagementPortalProperties; import org.radarbase.management.domain.User; import org.slf4j.Logger; @@ -63,7 +63,7 @@ public void sendEmail(String to, String subject, String content, boolean isMulti MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, - CharEncoding.UTF_8); + StandardCharsets.UTF_8.name()); message.setTo(to); message.setFrom(managementPortalProperties.getMail().getFrom()); message.setSubject(subject); diff --git a/src/main/java/org/radarbase/management/service/MetaTokenService.java b/src/main/java/org/radarbase/management/service/MetaTokenService.java index 2204aa298..0c20fcbed 100644 --- a/src/main/java/org/radarbase/management/service/MetaTokenService.java +++ b/src/main/java/org/radarbase/management/service/MetaTokenService.java @@ -1,11 +1,16 @@ package org.radarbase.management.service; +import org.radarbase.auth.exception.NotAuthorizedException; import org.radarbase.management.config.ManagementPortalProperties; import org.radarbase.management.domain.MetaToken; +import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Subject; import org.radarbase.management.repository.MetaTokenRepository; +import org.radarbase.management.service.dto.ClientPairInfoDTO; import org.radarbase.management.service.dto.TokenDTO; +import org.radarbase.management.web.rest.errors.BadRequestException; import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.errors.InvalidStateException; import org.radarbase.management.web.rest.errors.NotFoundException; import org.radarbase.management.web.rest.errors.RequestGoneException; import org.slf4j.Logger; @@ -17,13 +22,20 @@ import javax.validation.ConstraintViolationException; import java.net.MalformedURLException; +import java.net.URISyntaxException; import java.net.URL; +import java.time.Duration; import java.time.Instant; +import java.time.format.DateTimeParseException; import java.util.Collections; import static org.radarbase.management.domain.MetaToken.LONG_ID_LENGTH; import static org.radarbase.management.domain.MetaToken.SHORT_ID_LENGTH; +import static org.radarbase.management.web.rest.MetaTokenResource.DEFAULT_META_TOKEN_TIMEOUT; +import static org.radarbase.management.web.rest.MetaTokenResource.DEFAULT_PERSISTENT_META_TOKEN_TIMEOUT; import static org.radarbase.management.web.rest.errors.EntityName.META_TOKEN; +import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PERSISTENT_TOKEN_DISABLED; /** * Created by nivethika. @@ -130,7 +142,76 @@ public MetaToken saveUniqueToken(Subject subject, String clientId, Boolean log.warn("Unique constraint violation catched... Trying to save with new tokenName"); return saveUniqueToken(subject, clientId, fetched, expiryTime, persistent); } + } + + /** + * Creates meta token for oauth-subject pair. + * @param subject to create token for + * @param clientId using which client id + * @param persistent whether to persist the token after it is has been fetched + * @return {@link ClientPairInfoDTO} to return. + * @throws URISyntaxException when token URI cannot be formed properly. + * @throws MalformedURLException when token URL cannot be formed properly. + */ + public ClientPairInfoDTO createMetaToken(Subject subject, String clientId, boolean persistent) + throws URISyntaxException, MalformedURLException, NotAuthorizedException { + Duration timeout = getMetaTokenTimeout(persistent, subject.getActiveProject() + .orElseThrow(() -> new NotAuthorizedException( + "Cannot calculate meta-token duration without configured project"))); + + // tokenName should be generated + MetaToken metaToken = saveUniqueToken(subject, clientId, false, + Instant.now().plus(timeout), persistent); + + if (metaToken.getId() != null && metaToken.getTokenName() != null) { + // get base url from settings + String baseUrl = managementPortalProperties.getCommon().getManagementPortalBaseUrl(); + // create complete uri string + String tokenUrl = baseUrl + ResourceUriService.getUri(metaToken).getPath(); + // create response + return new ClientPairInfoDTO(new URL(baseUrl), metaToken.getTokenName(), + new URL(tokenUrl), timeout); + } else { + throw new InvalidStateException("Could not create a valid token", OAUTH_CLIENT, + "error.couldNotCreateToken"); + } + } + + /** + * Gets the meta-token timeout from config file. If the config is not mentioned or in wrong + * format, it will return default value. + * + * @return meta-token timeout duration. + * @throws BadRequestException if a persistent token is requested but it is not configured. + */ + public Duration getMetaTokenTimeout(boolean persistent, Project project) { + String timeoutConfig; + Duration defaultTimeout; + + if (persistent) { + timeoutConfig = managementPortalProperties.getOauth().getPersistentMetaTokenTimeout(); + if (timeoutConfig == null || timeoutConfig.isEmpty()) { + throw new BadRequestException( + "Cannot create persistent token: not supported in configuration.", + META_TOKEN, ERR_PERSISTENT_TOKEN_DISABLED); + } + defaultTimeout = DEFAULT_PERSISTENT_META_TOKEN_TIMEOUT; + } else { + timeoutConfig = managementPortalProperties.getOauth().getMetaTokenTimeout(); + defaultTimeout = DEFAULT_META_TOKEN_TIMEOUT; + if (timeoutConfig == null || timeoutConfig.isEmpty()) { + return defaultTimeout; + } + } + try { + return Duration.parse(timeoutConfig); + } catch (DateTimeParseException e) { + // if the token timeout cannot be read, log the error and use the default value. + log.warn("Cannot parse meta-token timeout config. Using default value {}", + defaultTimeout, e); + return defaultTimeout; + } } /** diff --git a/src/main/java/org/radarbase/management/service/OAuthClientService.java b/src/main/java/org/radarbase/management/service/OAuthClientService.java index 4764e321a..da1e6ffac 100644 --- a/src/main/java/org/radarbase/management/service/OAuthClientService.java +++ b/src/main/java/org/radarbase/management/service/OAuthClientService.java @@ -1,40 +1,12 @@ package org.radarbase.management.service; -import static org.radarbase.management.web.rest.MetaTokenResource.DEFAULT_META_TOKEN_TIMEOUT; -import static org.radarbase.management.web.rest.MetaTokenResource.DEFAULT_PERSISTENT_META_TOKEN_TIMEOUT; -import static org.radarbase.management.web.rest.errors.EntityName.META_TOKEN; -import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PERSISTENT_TOKEN_DISABLED; -import static org.springframework.security.oauth2.common.util.OAuth2Utils.GRANT_TYPE; - -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.time.Duration; -import java.time.Instant; -import java.time.format.DateTimeParseException; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import org.radarbase.auth.exception.NotAuthorizedException; -import org.radarbase.management.config.ManagementPortalProperties; -import org.radarbase.management.domain.MetaToken; -import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Subject; import org.radarbase.management.domain.User; import org.radarbase.management.service.dto.ClientDetailsDTO; -import org.radarbase.management.service.dto.ClientPairInfoDTO; import org.radarbase.management.service.mapper.ClientDetailsMapper; -import org.radarbase.management.web.rest.errors.BadRequestException; import org.radarbase.management.web.rest.errors.ConflictException; import org.radarbase.management.web.rest.errors.ErrorConstants; import org.radarbase.management.web.rest.errors.InvalidRequestException; -import org.radarbase.management.web.rest.errors.InvalidStateException; import org.radarbase.management.web.rest.errors.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,6 +24,17 @@ import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.stereotype.Service; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; +import static org.springframework.security.oauth2.common.util.OAuth2Utils.GRANT_TYPE; + /** * The service layer to handle OAuthClient and Token related functions. * Created by nivethika on 03/08/2018. @@ -69,12 +52,6 @@ public class OAuthClientService { @Autowired private ClientDetailsMapper clientDetailsMapper; - @Autowired - private MetaTokenService metaTokenService; - - @Autowired - private ManagementPortalProperties managementPortalProperties; - @Autowired private AuthorizationServerEndpointsConfiguration authorizationServerEndpointsConfiguration; @@ -176,77 +153,6 @@ public ClientDetails createClientDetail(ClientDetailsDTO clientDetailsDto) { } - /** - * Creates meta token for oauth-subject pair. - * @param subject to create token for - * @param clientId using which client id - * @param persistent whether to persist the token after it is has been fetched - * @return {@link ClientPairInfoDTO} to return. - * @throws URISyntaxException when token URI cannot be formed properly. - * @throws MalformedURLException when token URL cannot be formed properly. - */ - public ClientPairInfoDTO createMetaToken(Subject subject, String clientId, boolean persistent) - throws URISyntaxException, MalformedURLException, NotAuthorizedException { - Duration timeout = getMetaTokenTimeout(persistent, subject.getActiveProject() - .orElseThrow(() -> new NotAuthorizedException( - "Cannot calculate meta-token duration without configured project"))); - - // tokenName should be generated - MetaToken metaToken = metaTokenService - .saveUniqueToken(subject, clientId, false, - Instant.now().plus(timeout), persistent); - - if (metaToken.getId() != null && metaToken.getTokenName() != null) { - // get base url from settings - String baseUrl = managementPortalProperties.getCommon().getManagementPortalBaseUrl(); - // create complete uri string - String tokenUrl = baseUrl + ResourceUriService.getUri(metaToken).getPath(); - // create response - return new ClientPairInfoDTO(new URL(baseUrl), metaToken.getTokenName(), - new URL(tokenUrl), timeout); - } else { - throw new InvalidStateException("Could not create a valid token", OAUTH_CLIENT, - "error.couldNotCreateToken"); - } - } - - /** - * Gets the meta-token timeout from config file. If the config is not mentioned or in wrong - * format, it will return default value. - * - * @return meta-token timeout duration. - * @throws BadRequestException if a persistent token is requested but it is not configured. - */ - public Duration getMetaTokenTimeout(boolean persistent, Project project) { - String timeoutConfig; - Duration defaultTimeout; - - if (persistent) { - timeoutConfig = managementPortalProperties.getOauth().getPersistentMetaTokenTimeout(); - if (timeoutConfig == null || timeoutConfig.isEmpty()) { - throw new BadRequestException( - "Cannot create persistent token: not supported in configuration.", - META_TOKEN, ERR_PERSISTENT_TOKEN_DISABLED); - } - defaultTimeout = DEFAULT_PERSISTENT_META_TOKEN_TIMEOUT; - } else { - timeoutConfig = managementPortalProperties.getOauth().getMetaTokenTimeout(); - defaultTimeout = DEFAULT_META_TOKEN_TIMEOUT; - if (timeoutConfig == null || timeoutConfig.isEmpty()) { - return defaultTimeout; - } - } - - try { - return Duration.parse(timeoutConfig); - } catch (DateTimeParseException e) { - // if the token timeout cannot be read, log the error and use the default value. - log.warn("Cannot parse meta-token timeout config. Using default value {}", - defaultTimeout, e); - return defaultTimeout; - } - } - /** * Internally creates an {@link OAuth2AccessToken} token using authorization-code flow. This * method bypasses the usual authorization code flow mechanism, so it should only be used where diff --git a/src/main/java/org/radarbase/management/service/OrganizationService.java b/src/main/java/org/radarbase/management/service/OrganizationService.java new file mode 100644 index 000000000..4dabf831e --- /dev/null +++ b/src/main/java/org/radarbase/management/service/OrganizationService.java @@ -0,0 +1,187 @@ +package org.radarbase.management.service; + +import org.radarbase.auth.authorization.Permission; +import org.radarbase.auth.authorization.RoleAuthority; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.domain.Organization; +import org.radarbase.management.repository.OrganizationRepository; +import org.radarbase.management.repository.ProjectRepository; +import org.radarbase.management.service.dto.OrganizationDTO; +import org.radarbase.management.service.dto.ProjectDTO; +import org.radarbase.management.service.mapper.OrganizationMapper; +import org.radarbase.management.service.mapper.ProjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.radarbase.auth.authorization.Permission.ORGANIZATION_READ; + +/** + * Service Implementation for managing Organization. + */ +@Service +@Transactional +public class OrganizationService { + + private static final Logger log = LoggerFactory.getLogger(OrganizationService.class); + + @Autowired + private OrganizationRepository organizationRepository; + + @Autowired + private ProjectRepository projectRepository; + + @Autowired + private OrganizationMapper organizationMapper; + + @Autowired + private RadarToken token; + + @Autowired + private ProjectMapper projectMapper; + + /** + * Save an organization. + * + * @param organizationDto the entity to save + * @return the persisted entity + */ + public OrganizationDTO save(OrganizationDTO organizationDto) { + log.debug("Request to save Organization : {}", organizationDto); + var org = organizationMapper.organizationDTOToOrganization(organizationDto); + org = organizationRepository.save(org); + return organizationMapper.organizationToOrganizationDTO(org); + } + + /** + * Get all the organizations. + * + * @return the list of entities + */ + @Transactional(readOnly = true) + public List findAll() { + List organizationsOfUser; + + if (token.hasGlobalPermission(ORGANIZATION_READ)) { + organizationsOfUser = organizationRepository.findAll(); + } else { + List projectNames = token.getReferentsWithPermission( + RoleAuthority.Scope.PROJECT, ORGANIZATION_READ) + .collect(Collectors.toList()); + + Stream organizationsOfProject = projectNames.isEmpty() + ? Stream.of() + : organizationRepository.findAllByProjectNames(projectNames).stream(); + + Stream organizationsOfRole = token.getReferentsWithPermission( + RoleAuthority.Scope.ORGANIZATION, ORGANIZATION_READ) + .flatMap(name -> organizationRepository.findOneByName(name).stream()) + .filter(Objects::nonNull); + + organizationsOfUser = Stream.concat(organizationsOfRole, organizationsOfProject) + .distinct() + .collect(Collectors.toList()); + } + + return organizationMapper.organizationsToOrganizationDTOs(organizationsOfUser); + } + + /** + * Get one organization by name. + * + * @param name the name of the entity + * @return the entity + */ + @Transactional(readOnly = true) + public Optional findByName(String name) { + log.debug("Request to get Organization by name: {}", name); + return organizationRepository.findOneByName(name) + .map(organizationMapper::organizationToOrganizationDTO); + } + + /** + * Get all projects belonging to the organization. + * + * @return the list of projects + */ + @Transactional(readOnly = true) + public List findAllProjectsByOrganizationName(String organizationName) { + return projectRepository.findAllByOrganizationName(organizationName).stream() + .filter(project -> token.hasPermissionOnOrganizationAndProject( + ORGANIZATION_READ, organizationName, project.getProjectName())) + .map(projectMapper::projectToProjectDTO) + .collect(Collectors.toList()); + } + + /** + * Checks the permission of a project, also taking into + * account the organization that a project belongs to. + * @param permission permission to check + * @param projectName project name to check + * @throws NotAuthorizedException if the current user is not authorized. + */ + public void checkPermissionByProject(Permission permission, String projectName) + throws NotAuthorizedException { + if (!token.hasPermissionOnProject(permission, projectName) + && !hasPermissionOnOrganization(permission, projectName)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s in project %s", token.getUsername(), permission, + projectName)); + } + } + + /** + * Checks the permission of a subject, also taking into + * account the organization that a project belongs to. + * @param permission permission to check + * @param projectName project name to check + * @param subject subject login to check + * @throws NotAuthorizedException if the current user is not authorized. + */ + public void checkPermissionBySubject(Permission permission, String projectName, String subject) + throws NotAuthorizedException { + if (!token.hasPermissionOnSubject(permission, projectName, subject) + && !hasPermissionOnOrganization(permission, projectName)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s on subject %s in project %s ", token.getUsername(), + permission, subject, projectName)); + } + } + + /** + * Checks the permission of a source, also taking into + * account the organization that a project belongs to. + * @param permission permission to check + * @param projectName project name to check + * @param subject subject login to check + * @param sourceId sourceId to check + * @throws NotAuthorizedException if the current user is not authorized. + */ + public void checkPermissionBySource(Permission permission, String projectName, String subject, + String sourceId) + throws NotAuthorizedException { + if (!token.hasPermissionOnSource(permission, projectName, subject, sourceId) + && !hasPermissionOnOrganization(permission, projectName)) { + throw new NotAuthorizedException(String.format("Client %s does not have " + + "permission %s on subject %s and source %s in project %s ", + token.getUsername(), permission, subject, sourceId, projectName)); + } + } + + private boolean hasPermissionOnOrganization(Permission permission, String projectName) { + if (projectName == null) { + return false; + } + return organizationRepository.findAllByProjectNames(List.of(projectName)).stream() + .anyMatch(o -> token.hasPermissionOnOrganization(permission, o.getName())); + } +} diff --git a/src/main/java/org/radarbase/management/service/PasswordService.java b/src/main/java/org/radarbase/management/service/PasswordService.java new file mode 100644 index 000000000..a4299cd23 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/PasswordService.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.service; + +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.security.SecureRandom; +import java.util.Locale; +import java.util.Random; + +import static org.radarbase.management.web.rest.errors.EntityName.USER; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PASSWORD_TOO_LONG; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PASSWORD_TOO_WEAK; + +@Service +public class PasswordService { + public static final int[] NUMERIC; + public static final int[] ALPHANUMERIC; + private static final int[] LOWER; + private static final int[] UPPER; + + static { + String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + String lower = upper.toLowerCase(Locale.ROOT); + String digits = "0123456789"; + UPPER = upper.chars().toArray(); + LOWER = lower.chars().toArray(); + NUMERIC = digits.chars().toArray(); + ALPHANUMERIC = (upper + lower + digits).chars().toArray(); + } + + private final PasswordEncoder passwordEncoder; + private final Random random = new SecureRandom(); + + public PasswordService(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + /** + * Encodes a plaintext password. + * @param password password to encode. + * @return encoded password. + */ + public String encode(String password) { + return passwordEncoder.encode(password); + } + + /** + * Generates a random password that is already encoded. + * @return encoded password. + */ + public String generateEncodedPassword() { + return encode(generateString(ALPHANUMERIC, 30)); + } + + /** + * Generates a random numeric reset key. + * @return reset key. + */ + public String generateResetKey() { + return generateString(NUMERIC, 20); + } + + private String generateString(int[] allowedCharacters, int length) { + return random.ints(0, allowedCharacters.length) + .map(i -> allowedCharacters[i]) + .limit(length) + .collect(() -> new StringBuilder(length), + StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + } + + /** + * Check that given password is strong enough, based on complexity and length. + * @param password password to check. + * @throws BadRequestException if the password is too weak or too long. + */ + public void checkPasswordStrength(String password) { + if (isPasswordWeak(password)) { + throw new BadRequestException("Weak password. Use a password with more variety of" + + "numeric, alphabetical and symbol characters.", USER, ERR_PASSWORD_TOO_WEAK); + } else if (password.length() > 100) { + throw new BadRequestException("Password too long", USER, ERR_PASSWORD_TOO_LONG); + } + } + + /** Check whether given password is too weak. */ + private boolean isPasswordWeak(String password) { + return password.length() < 8 + || noneInRange(password, UPPER[0], UPPER[UPPER.length - 1]) + || noneInRange(password, LOWER[0], LOWER[LOWER.length - 1]) + || noneInRange(password, NUMERIC[0], NUMERIC[NUMERIC.length - 1]); + } + + private boolean noneInRange(String str, int startInclusive, int endInclusive) { + return str.chars().noneMatch(c -> c >= startInclusive && c < endInclusive); + } +} diff --git a/src/main/java/org/radarbase/management/service/ProjectService.java b/src/main/java/org/radarbase/management/service/ProjectService.java index 7726698ff..15c2451c2 100644 --- a/src/main/java/org/radarbase/management/service/ProjectService.java +++ b/src/main/java/org/radarbase/management/service/ProjectService.java @@ -1,8 +1,7 @@ package org.radarbase.management.service; - -import static org.radarbase.management.web.rest.errors.EntityName.PROJECT; - +import org.radarbase.auth.authorization.RoleAuthority; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.Project; import org.radarbase.management.domain.SourceType; import org.radarbase.management.repository.ProjectRepository; @@ -10,8 +9,8 @@ import org.radarbase.management.service.dto.SourceTypeDTO; import org.radarbase.management.service.mapper.ProjectMapper; import org.radarbase.management.service.mapper.SourceTypeMapper; -import org.radarbase.management.web.rest.errors.NotFoundException; import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.errors.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +21,10 @@ import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; + +import static org.radarbase.auth.authorization.Permission.PROJECT_READ; +import static org.radarbase.management.web.rest.errors.EntityName.PROJECT; /** * Service Implementation for managing Project. @@ -41,6 +44,9 @@ public class ProjectService { @Autowired private SourceTypeMapper sourceTypeMapper; + @Autowired + private RadarToken token; + /** * Save a project. @@ -62,9 +68,25 @@ public ProjectDTO save(ProjectDTO projectDto) { */ @Transactional(readOnly = true) public Page findAll(Boolean fetchMinimal, Pageable pageable) { - Page projects = projectRepository.findAllWithEagerRelationships(pageable); + Page projects; + + if (token.hasGlobalPermission(PROJECT_READ)) { + projects = projectRepository.findAllWithEagerRelationships(pageable); + } else { + List projectNames = token.getReferentsWithPermission( + RoleAuthority.Scope.PROJECT, PROJECT_READ) + .collect(Collectors.toList()); + + List organizationNames = token.getReferentsWithPermission( + RoleAuthority.Scope.ORGANIZATION, PROJECT_READ) + .collect(Collectors.toList()); + + projects = projectRepository.findAllWithEagerRelationshipsInOrganizationsOrProjects( + pageable, organizationNames, projectNames); + } + if (!fetchMinimal) { - return projects.map(projectMapper::projectToProjectDTOReduced); + return projects.map(projectMapper::projectToProjectDTO); } else { return projects.map(projectMapper::projectToMinimalProjectDetailsDTO); } @@ -97,7 +119,8 @@ public ProjectDTO findOneByName(String name) { log.debug("Request to get Project by name: {}", name); return projectRepository.findOneWithEagerRelationshipsByName(name) .map(projectMapper::projectToProjectDTO) - .orElseThrow(() -> new NotFoundException("Project not found with projectName", + .orElseThrow(() -> new NotFoundException( + "Project not found with projectName " + name, PROJECT, ErrorConstants.ERR_PROJECT_NAME_NOT_FOUND, Collections.singletonMap("projectName", name))); } diff --git a/src/main/java/org/radarbase/management/service/ResourceUriService.java b/src/main/java/org/radarbase/management/service/ResourceUriService.java index c8dd4077a..f16481f85 100644 --- a/src/main/java/org/radarbase/management/service/ResourceUriService.java +++ b/src/main/java/org/radarbase/management/service/ResourceUriService.java @@ -5,6 +5,7 @@ import org.radarbase.management.domain.User; import org.radarbase.management.service.dto.ClientDetailsDTO; import org.radarbase.management.service.dto.MinimalSourceDetailsDTO; +import org.radarbase.management.service.dto.OrganizationDTO; import org.radarbase.management.service.dto.ProjectDTO; import org.radarbase.management.service.dto.RoleDTO; import org.radarbase.management.service.dto.SourceDTO; @@ -25,6 +26,16 @@ private ResourceUriService() { // utility class } + /** + * Get the API location for the given resource. + * @param resource the resource + * @return the API location + * @throws URISyntaxException See {@link URI#URI(String)} + */ + public static URI getUri(OrganizationDTO resource) throws URISyntaxException { + return new URI(HeaderUtil.buildPath("api", "organizations", resource.getName())); + } + /** * Get the API location for the given resource. * @param resource the resource diff --git a/src/main/java/org/radarbase/management/service/RoleService.java b/src/main/java/org/radarbase/management/service/RoleService.java index 88d707695..83d37d8c2 100644 --- a/src/main/java/org/radarbase/management/service/RoleService.java +++ b/src/main/java/org/radarbase/management/service/RoleService.java @@ -3,21 +3,31 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; import java.util.stream.Collectors; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.management.domain.Authority; import org.radarbase.management.domain.Role; import org.radarbase.management.domain.User; +import org.radarbase.management.repository.AuthorityRepository; +import org.radarbase.management.repository.OrganizationRepository; +import org.radarbase.management.repository.ProjectRepository; import org.radarbase.management.repository.RoleRepository; import org.radarbase.management.service.dto.RoleDTO; import org.radarbase.management.service.mapper.RoleMapper; +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.errors.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static org.radarbase.management.web.rest.errors.EntityName.USER; + /** * Service Implementation for managing Project. */ @@ -30,6 +40,15 @@ public class RoleService { @Autowired private RoleRepository roleRepository; + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private OrganizationRepository organizationRepository; + + @Autowired + private ProjectRepository projectRepository; + @Autowired private RoleMapper roleMapper; @@ -67,15 +86,16 @@ public List findAll() { } List currentUserAuthorities = currentUser.getAuthorities().stream() .map(Authority::getName).collect(Collectors.toList()); - if (currentUserAuthorities.contains(AuthoritiesConstants.SYS_ADMIN)) { + + if (currentUserAuthorities.contains(RoleAuthority.SYS_ADMIN.authority())) { log.debug("Request to get all Roles"); return roleRepository.findAll().stream() .map(roleMapper::roleToRoleDTO) .collect(Collectors.toList()); - } else if (currentUserAuthorities.contains(AuthoritiesConstants.PROJECT_ADMIN)) { + } else if (currentUserAuthorities.contains(RoleAuthority.PROJECT_ADMIN.authority())) { log.debug("Request to get project admin's project Projects"); return currentUser.getRoles().stream() - .filter(role -> AuthoritiesConstants.PROJECT_ADMIN + .filter(role -> RoleAuthority.PROJECT_ADMIN.authority() .equals(role.getAuthority().getName())) .map(r -> r.getProject().getProjectName()) .distinct() @@ -97,7 +117,7 @@ public List findSuperAdminRoles() { log.debug("Request to get admin Roles"); return roleRepository - .findRolesByAuthorityName(AuthoritiesConstants.SYS_ADMIN).stream() + .findRolesByAuthorityName(RoleAuthority.SYS_ADMIN.authority()).stream() .map(roleMapper::roleToRoleDTO) .collect(Collectors.toCollection(LinkedList::new)); } @@ -125,6 +145,91 @@ public void delete(Long id) { roleRepository.deleteById(id); } + /** + * Get the predefined role authority from a RoleDTO. + * @param roleDto roleDto to parse + * @return role authority + * @throws BadRequestException if the roleauthority is not found or does not correctly + * specify an organization or project ID. + */ + public static RoleAuthority getRoleAuthority(RoleDTO roleDto) { + RoleAuthority authority; + try { + authority = RoleAuthority.valueOfAuthority(roleDto.getAuthorityName()); + } catch (IllegalArgumentException ex) { + throw new BadRequestException("Authority not found with " + + "authorityName", USER, ErrorConstants.ERR_INVALID_AUTHORITY, + Collections.singletonMap("authorityName", + roleDto.getAuthorityName())); + } + if (authority.scope() == RoleAuthority.Scope.ORGANIZATION + && roleDto.getOrganizationId() == null) { + throw new BadRequestException("Authority with " + + "authorityName should have organization ID", + USER, ErrorConstants.ERR_INVALID_AUTHORITY, + Collections.singletonMap("authorityName", roleDto.getAuthorityName())); + } + if (authority.scope() == RoleAuthority.Scope.PROJECT + && roleDto.getProjectId() == null) { + throw new BadRequestException("Authority with " + + "authorityName should have project ID", + USER, ErrorConstants.ERR_INVALID_AUTHORITY, + Collections.singletonMap("authorityName", roleDto.getAuthorityName())); + } + return authority; + } + + /** + * Get or create given global role. + * @param role to get or create + * @return role from database + */ + public Role getGlobalRole(RoleAuthority role) { + return roleRepository.findRolesByAuthorityName(role.authority()).stream() + .findAny() + .orElseGet(() -> createNewRole(role, r -> { })); + } + + /** + * Get or create given organization role. + * @param role to get or create + * @param organizationId organization ID + * @return role from database + */ + public Role getOrganizationRole(RoleAuthority role, Long organizationId) { + return roleRepository.findOneByOrganizationIdAndAuthorityName( + organizationId, role.authority()) + .orElseGet(() -> createNewRole(role, r -> { + r.setOrganization(organizationRepository.findById(organizationId) + .orElseThrow(() -> new NotFoundException( + "Cannot find organization for authority", + USER, ErrorConstants.ERR_INVALID_AUTHORITY, + Map.of("authorityName", role.authority(), + "projectId", + organizationId.toString())))); + })); + } + + /** + * Get or create given project role. + * @param role to get or create + * @param projectId organization ID + * @return role from database + */ + public Role getProjectRole(RoleAuthority role, Long projectId) { + return roleRepository.findOneByProjectIdAndAuthorityName( + projectId, role.authority()) + .orElseGet(() -> createNewRole(role, r -> { + r.setProject(projectRepository.findByIdWithOrganization(projectId) + .orElseThrow(() -> new NotFoundException( + "Cannot find project for authority", + USER, ErrorConstants.ERR_INVALID_AUTHORITY, + Map.of("authorityName", role.authority(), + "projectId", + projectId.toString())))); + })); + } + /** * Get all roles related to a project. * @param projectName the project name @@ -138,6 +243,18 @@ public List getRolesByProject(String projectName) { .collect(Collectors.toCollection(LinkedList::new)); } + private Authority getAuthority(RoleAuthority role) { + return authorityRepository.findByAuthorityName(role.authority()) + .orElseGet(() -> authorityRepository.saveAndFlush(new Authority(role))); + } + + private Role createNewRole(RoleAuthority role, Consumer apply) { + Role newRole = new Role(); + newRole.setAuthority(getAuthority(role)); + apply.accept(newRole); + return roleRepository.save(newRole); + } + /** * Get the role related to the given project with the given authority name. * @param projectName the project name diff --git a/src/main/java/org/radarbase/management/service/SourceDataService.java b/src/main/java/org/radarbase/management/service/SourceDataService.java index 623ce8605..7354d19f2 100644 --- a/src/main/java/org/radarbase/management/service/SourceDataService.java +++ b/src/main/java/org/radarbase/management/service/SourceDataService.java @@ -63,11 +63,10 @@ public SourceDataDTO save(SourceDataDTO sourceDataDto) { @Transactional(readOnly = true) public List findAll() { log.debug("Request to get all SourceData"); - List result = sourceDataRepository.findAll().stream() + + return sourceDataRepository.findAll().stream() .map(sourceDataMapper::sourceDataToSourceDataDTO) .collect(Collectors.toCollection(LinkedList::new)); - - return result; } /** diff --git a/src/main/java/org/radarbase/management/service/SourceService.java b/src/main/java/org/radarbase/management/service/SourceService.java index 342e72047..5c3148c44 100644 --- a/src/main/java/org/radarbase/management/service/SourceService.java +++ b/src/main/java/org/radarbase/management/service/SourceService.java @@ -3,7 +3,6 @@ import static org.hibernate.id.IdentifierGenerator.ENTITY_NAME; import static org.radarbase.auth.authorization.Permission.SOURCE_UPDATE; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnSource; import static org.radarbase.management.web.rest.errors.EntityName.SOURCE; import java.util.HashMap; @@ -14,7 +13,6 @@ import java.util.stream.Collectors; import org.radarbase.auth.exception.NotAuthorizedException; -import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.Source; import org.radarbase.management.domain.SourceType; import org.radarbase.management.repository.ProjectRepository; @@ -55,6 +53,9 @@ public class SourceService { @Autowired private SourceTypeMapper sourceTypeMapper; + @Autowired + private OrganizationService organizationService; + /** * Save a Source. * @@ -160,7 +161,7 @@ public Page findAllByProjectId(Long projectId, Pageable pageable) { * @return list of sources */ public Page findAllMinimalSourceDetailsByProject(Long projectId, - Pageable pageable) { + Pageable pageable) { return sourceRepository.findAllSourcesByProjectId(pageable, projectId) .map(sourceMapper::sourceToMinimalSourceDetailsDTO); } @@ -194,7 +195,7 @@ public List findAllMinimalSourceDetailsByProjectAndAssi * @return Updated {@link MinimalSourceDetailsDTO} of source */ public MinimalSourceDetailsDTO safeUpdateOfAttributes(Source sourceToUpdate, - Map attributes) { + Map attributes) { // update source attributes Map updatedAttributes = new HashMap<>(); @@ -212,11 +213,10 @@ public MinimalSourceDetailsDTO safeUpdateOfAttributes(Source sourceToUpdate, * Does not allow to transfer if new project does not have valid source-type. * * @param sourceDto source details to update. - * @param jwt authorization token. * @return updated source. */ @Transactional - public Optional updateSource(SourceDTO sourceDto, RadarToken jwt) + public Optional updateSource(SourceDTO sourceDto) throws NotAuthorizedException { Optional existingSourceOpt = sourceRepository.findById(sourceDto.getId()); if (existingSourceOpt.isEmpty()) { @@ -231,7 +231,8 @@ public Optional updateSource(SourceDTO sourceDto, RadarToken jwt) ? existingSource.getSubject().getUser().getLogin() : null; - checkPermissionOnSource(jwt, SOURCE_UPDATE, project, user, existingSource.getSourceName()); + organizationService.checkPermissionBySource(SOURCE_UPDATE, project, user, + existingSource.getSourceName()); // if the source is being transferred to another project. if (!existingSource.getProject().getId().equals(sourceDto.getProject().getId())) { diff --git a/src/main/java/org/radarbase/management/service/SourceTypeService.java b/src/main/java/org/radarbase/management/service/SourceTypeService.java index 06a42e1f5..a163e6e4f 100644 --- a/src/main/java/org/radarbase/management/service/SourceTypeService.java +++ b/src/main/java/org/radarbase/management/service/SourceTypeService.java @@ -124,9 +124,8 @@ public List findByProducer(String producer) { log.debug("Request to get SourceType by producer: {}", producer); List sourceTypes = sourceTypeRepository .findWithEagerRelationshipsByProducer(producer); - List sourceTypeDtos = sourceTypeMapper.sourceTypesToSourceTypeDTOs( + return sourceTypeMapper.sourceTypesToSourceTypeDTOs( sourceTypes); - return sourceTypeDtos; } /** @@ -136,9 +135,8 @@ public List findByProducerAndModel(String producer, String model) log.debug("Request to get SourceType by producer and model: {}, {}", producer, model); List sourceTypes = sourceTypeRepository .findWithEagerRelationshipsByProducerAndModel(producer, model); - List sourceTypeDtos = sourceTypeMapper.sourceTypesToSourceTypeDTOs( + return sourceTypeMapper.sourceTypesToSourceTypeDTOs( sourceTypes); - return sourceTypeDtos; } /** diff --git a/src/main/java/org/radarbase/management/service/SubjectService.java b/src/main/java/org/radarbase/management/service/SubjectService.java index b57ec9d60..68e3acf6b 100644 --- a/src/main/java/org/radarbase/management/service/SubjectService.java +++ b/src/main/java/org/radarbase/management/service/SubjectService.java @@ -1,34 +1,13 @@ package org.radarbase.management.service; -import static org.radarbase.auth.authorization.AuthoritiesConstants.INACTIVE_PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.management.service.dto.ProjectDTO.PRIVACY_POLICY_URL; -import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; -import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; -import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_NO_VALID_PRIVACY_POLICY_URL_CONFIGURED; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SOURCE_NOT_FOUND; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SUBJECT_NOT_FOUND; - -import java.net.MalformedURLException; -import java.net.URL; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; import org.hibernate.envers.query.AuditEntity; +import org.radarbase.auth.authorization.Permission; +import org.radarbase.auth.authorization.RoleAuthority; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.config.ManagementPortalProperties; +import org.radarbase.management.domain.Authority; +import org.radarbase.management.domain.Group; import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Role; import org.radarbase.management.domain.Source; @@ -36,16 +15,19 @@ import org.radarbase.management.domain.Subject; import org.radarbase.management.domain.User; import org.radarbase.management.repository.AuthorityRepository; +import org.radarbase.management.repository.GroupRepository; +import org.radarbase.management.repository.ProjectRepository; import org.radarbase.management.repository.RoleRepository; import org.radarbase.management.repository.SourceRepository; import org.radarbase.management.repository.SubjectRepository; +import org.radarbase.management.repository.filters.SubjectSpecification; import org.radarbase.management.service.dto.MinimalSourceDetailsDTO; import org.radarbase.management.service.dto.SubjectDTO; import org.radarbase.management.service.dto.UserDTO; import org.radarbase.management.service.mapper.ProjectMapper; import org.radarbase.management.service.mapper.SourceMapper; import org.radarbase.management.service.mapper.SubjectMapper; -import org.radarbase.management.service.util.RandomUtil; +import org.radarbase.management.web.rest.criteria.SubjectCriteria; import org.radarbase.management.web.rest.errors.BadRequestException; import org.radarbase.management.web.rest.errors.ConflictException; import org.radarbase.management.web.rest.errors.ErrorConstants; @@ -55,12 +37,42 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.history.Revisions; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Nonnull; +import java.net.MalformedURLException; +import java.net.URL; +import java.time.ZonedDateTime; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.radarbase.auth.authorization.Permission.SUBJECT_READ; +import static org.radarbase.auth.authorization.RadarAuthorization.checkGlobalPermission; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganizationAndProject; +import static org.radarbase.auth.authorization.RoleAuthority.INACTIVE_PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; +import static org.radarbase.management.service.dto.ProjectDTO.PRIVACY_POLICY_URL; +import static org.radarbase.management.web.rest.errors.EntityName.GROUP; +import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; +import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_GROUP_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_NO_VALID_PRIVACY_POLICY_URL_CONFIGURED; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SOURCE_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SUBJECT_NOT_FOUND; + /** * Created by nivethika on 26-5-17. */ @@ -79,9 +91,6 @@ public class SubjectService { @Autowired private SubjectRepository subjectRepository; - @Autowired - private AuthorityRepository authorityRepository; - @Autowired private SourceRepository sourceRepository; @@ -92,7 +101,7 @@ public class SubjectService { private RoleRepository roleRepository; @Autowired - private PasswordEncoder passwordEncoder; + private GroupRepository groupRepository; @Autowired private RevisionService revisionService; @@ -100,6 +109,20 @@ public class SubjectService { @Autowired private ManagementPortalProperties managementPortalProperties; + @Autowired + private PasswordService passwordService; + + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private ProjectRepository projectRepository; + + @Autowired + private RadarToken token; + @Autowired + private OrganizationService organizationService; + /** * Create a new subject. * @@ -116,10 +139,12 @@ public SubjectDTO createSubject(SubjectDTO subjectDto) { Set roles = user.getRoles(); roles.add(projectParticipantRole); + // Set group + subject.setGroup(getSubjectGroup(project, subjectDto.getGroup())); + // set password and reset keys - String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); - user.setPassword(encryptedPassword); - user.setResetKey(RandomUtil.generateResetKey()); + user.setPassword(passwordService.generateEncodedPassword()); + user.setResetKey(passwordService.generateResetKey()); // setting default language key to "en", required to set email context, Find a workaround user.setLangKey("en"); user.setResetDate(ZonedDateTime.now()); @@ -129,10 +154,26 @@ public SubjectDTO createSubject(SubjectDTO subjectDto) { if (subject.getSources() != null && !subject.getSources().isEmpty()) { subject.getSources().forEach(s -> s.assigned(true).subject(subject)); } + if (subject.getEnrollmentDate() == null) { + subject.setEnrollmentDate(ZonedDateTime.now()); + } sourceRepository.saveAll(subject.getSources()); return subjectMapper.subjectToSubjectReducedProjectDTO(subjectRepository.save(subject)); } + private Group getSubjectGroup(Project project, String groupName) { + if (project == null || groupName == null) { + return null; + } + return groupRepository.findByProjectIdAndName(project.getId(), groupName) + .orElseThrow(() -> new BadRequestException( + "Group " + groupName + " does not exist in project " + + project.getProjectName(), + GROUP, + ERR_GROUP_NOT_FOUND) + ); + } + /** * Fetch Participant role of the project if available, otherwise create a new Role and assign. * @@ -140,15 +181,16 @@ public SubjectDTO createSubject(SubjectDTO subjectDto) { * @return relevant Participant role * @throws java.util.NoSuchElementException if the authority name is not in the database */ - private Role getProjectParticipantRole(Project project, String authority) { - return roleRepository.findOneByProjectIdAndAuthorityName(project.getId(), authority) + private Role getProjectParticipantRole(Project project, RoleAuthority authority) { + return roleRepository.findOneByProjectIdAndAuthorityName(project.getId(), + authority.authority()) .orElseGet(() -> { Role subjectRole = new Role(); - subjectRole.setAuthority(authorityRepository.findByAuthorityName(authority) - .orElseThrow(NoSuchElementException::new)); + Authority auth = authorityRepository.findByAuthorityName(authority.authority()) + .orElseGet(() -> authorityRepository.save(new Authority(authority))); + subjectRole.setAuthority(auth); subjectRole.setProject(project); - roleRepository.save(subjectRole); - return subjectRole; + return roleRepository.save(subjectRole); }); } @@ -164,47 +206,48 @@ public SubjectDTO updateSubject(SubjectDTO newSubjectDto) { if (newSubjectDto.getId() == null) { return createSubject(newSubjectDto); } - Subject subjectFromDb = subjectRepository.findById(newSubjectDto.getId()).get(); - //reset all the sources assigned to a subject to unassigned + Subject subjectFromDb = ensureSubject(newSubjectDto); Set sourcesToUpdate = subjectFromDb.getSources(); - sourcesToUpdate.forEach(s -> s.subject(null).assigned(false)); //set only the devices assigned to a subject as assigned subjectMapper.safeUpdateSubjectFromDTO(newSubjectDto, subjectFromDb); sourcesToUpdate.addAll(subjectFromDb.getSources()); - subjectFromDb.getSources().forEach(s -> s.subject(subjectFromDb).assigned(true)); + subjectFromDb.getSources() + .forEach(s -> s.subject(subjectFromDb).assigned(true)); sourceRepository.saveAll(sourcesToUpdate); // update participant role subjectFromDb.getUser().setRoles(updateParticipantRoles(subjectFromDb, newSubjectDto)); + // Set group + subjectFromDb.setGroup(getSubjectGroup( + subjectFromDb.getActiveProject().orElse(null), + newSubjectDto.getGroup())); return subjectMapper.subjectToSubjectReducedProjectDTO( subjectRepository.save(subjectFromDb)); } private Set updateParticipantRoles(Subject subject, SubjectDTO subjectDto) { - Set managedRoles = subject.getUser().getRoles().stream() - // make participant inactive in projects that do not match the new project - .map(role -> PARTICIPANT.equals(role.getAuthority().getName()) + if (subjectDto.getProject() == null || subjectDto.getProject().getProjectName() == null) { + return subject.getUser().getRoles(); + } + + Stream existingRoles = subject.getUser().getRoles().stream() + .map(role -> { + // make participant inactive in projects that do not match the new project + if (role.getAuthority().getName().equals(PARTICIPANT.authority()) && !role.getProject().getProjectName().equals( - subjectDto.getProject().getProjectName()) - ? getProjectParticipantRole(role.getProject(), INACTIVE_PARTICIPANT) - : role) - .collect(Collectors.toSet()); - // add participant role for current project, if the project did not change, then the set - // will not change since the role being added here already exists in the set - managedRoles.add(getProjectParticipantRole(projectMapper.projectDTOToProject(subjectDto - .getProject()), PARTICIPANT)); - return managedRoles; - } + subjectDto.getProject().getProjectName())) { + return getProjectParticipantRole(role.getProject(), INACTIVE_PARTICIPANT); + } else { + // do not modify other roles. + return role; + } + }); + // Ensure that given project is present + Stream newProjectRole = Stream.of(getProjectParticipantRole( + projectMapper.projectDTOToProject(subjectDto.getProject()), PARTICIPANT)); - /** - * Get a page of subjects. - * - * @param pageable the page information - * @return the requested page of subjects - */ - public Page findAll(Pageable pageable) { - return subjectRepository.findAllWithEagerRelationships(pageable) - .map(subjectMapper::subjectToSubjectReducedProjectDTO); + return Stream.concat(existingRoles, newProjectRole) + .collect(Collectors.toSet()); } /** @@ -217,7 +260,7 @@ public Page findAll(Pageable pageable) { * @return the discontinued subject */ public SubjectDTO discontinueSubject(SubjectDTO subjectDto) { - Subject subject = subjectRepository.findById(subjectDto.getId()).get(); + Subject subject = ensureSubject(subjectDto); // reset all the sources assigned to a subject to unassigned unassignAllSources(subject); @@ -228,6 +271,13 @@ public SubjectDTO discontinueSubject(SubjectDTO subjectDto) { return subjectMapper.subjectToSubjectReducedProjectDTO(subjectRepository.save(subject)); } + private Subject ensureSubject(SubjectDTO subjectDto) { + return subjectRepository.findById(subjectDto.getId()) + .orElseThrow(() -> new NotFoundException( + "Subject with ID " + subjectDto.getId() + " not found.", + SUBJECT, ERR_SUBJECT_NOT_FOUND)); + } + /** * Unassign all sources from a subject. This method saves the unassigned sources, but does NOT * save the subject in question. This is the responsibility of the caller. @@ -238,6 +288,7 @@ private void unassignAllSources(Subject subject) { subject.getSources().forEach(source -> { source.setAssigned(false); source.setSubject(null); + source.setDeleted(true); sourceRepository.save(source); }); subject.getSources().clear(); @@ -252,7 +303,7 @@ private void unassignAllSources(Subject subject) { @Transactional public MinimalSourceDetailsDTO assignOrUpdateSource(Subject subject, SourceType sourceType, Project project, MinimalSourceDetailsDTO sourceRegistrationDto) { - Source assignedSource = null; + Source assignedSource; if (sourceRegistrationDto.getSourceId() != null) { // update meta-data and source-name for existing sources @@ -327,26 +378,25 @@ private static Map sourceTypeAttributes(SourceType sourceType, private Source updateSourceAssignedSubject(Subject subject, MinimalSourceDetailsDTO sourceRegistrationDto) { // for manually registered devices only add meta-data - Optional sourceToUpdate = subjectRepository.findSubjectSourcesBySourceId( - subject.getUser().getLogin(), sourceRegistrationDto.getSourceId()); - - if (sourceToUpdate.isPresent()) { - Source source = sourceToUpdate.get(); - if (sourceRegistrationDto.getSourceName() != null) { - source.setSourceName(sourceRegistrationDto.getSourceName()); - } - source.getAttributes().putAll(sourceRegistrationDto.getAttributes()); - source.setAssigned(true); - source.setSubject(subject); + Source source = subjectRepository.findSubjectSourcesBySourceId( + subject.getUser().getLogin(), sourceRegistrationDto.getSourceId()) + .orElseThrow(() -> { + Map errorParams = new HashMap<>(); + errorParams.put("sourceId", sourceRegistrationDto.getSourceId().toString()); + errorParams.put("subject-login", subject.getUser().getLogin()); + return new NotFoundException( "No source with source-id to assigned to the " + + "subject with subject-login", SUBJECT, ERR_SOURCE_NOT_FOUND, + errorParams); + }); - return sourceRepository.save(source); - } else { - Map errorParams = new HashMap<>(); - errorParams.put("sourceId", sourceRegistrationDto.getSourceId().toString()); - errorParams.put("subject-login", subject.getUser().getLogin()); - throw new NotFoundException( "No source with source-id to assigned to the subject" - + " with subject-login", SUBJECT, ERR_SOURCE_NOT_FOUND, errorParams); + if (sourceRegistrationDto.getSourceName() != null) { + source.setSourceName(sourceRegistrationDto.getSourceName()); } + source.getAttributes().putAll(sourceRegistrationDto.getAttributes()); + source.setAssigned(true); + source.setSubject(subject); + + return sourceRepository.save(source); } /** @@ -381,7 +431,6 @@ public void deleteSubject(String login) { * @return list of {@link MinimalSourceDetailsDTO} of sources. */ public List findSubjectSourcesFromRevisions(Subject subject) { - Revisions revisions = subjectRepository.findRevisions(subject.getId()); // collect distinct sources in a set Set sources = revisions @@ -401,13 +450,18 @@ public List findSubjectSourcesFromRevisions(Subject sub * @throws NotFoundException if there was no subject with the given login at the given * revision number */ - public SubjectDTO findRevision(String login, Integer revision) throws NotFoundException { + public SubjectDTO findRevision(String login, Integer revision) + throws NotFoundException, NotAuthorizedException { + checkPermission(token, SUBJECT_READ); // first get latest known version of the subject, if it's deleted we can't load the entity // directly by e.g. findOneByLogin SubjectDTO latest = getLatestRevision(login); + organizationService.checkPermissionBySubject(SUBJECT_READ, + latest.getProject().getProjectName(), latest.getLogin()); SubjectDTO sub = revisionService .findRevision(revision, latest.getId(), Subject.class, subjectMapper::subjectToSubjectReducedProjectDTO); + if (sub == null) { throw new NotFoundException("subject not found for given login and revision.", SUBJECT, ERR_SUBJECT_NOT_FOUND, Collections.singletonMap("subjectLogin", login)); @@ -424,12 +478,12 @@ public SubjectDTO findRevision(String login, Integer revision) throws NotFoundEx */ public SubjectDTO getLatestRevision(String login) throws NotFoundException { UserDTO user = (UserDTO) revisionService.getLatestRevisionForEntity(User.class, - Arrays.asList(AuditEntity.property("login").eq(login))) + List.of(AuditEntity.property("login").eq(login))) .orElseThrow(() -> new NotFoundException("Subject latest revision not found " + "for login" , SUBJECT, ERR_SUBJECT_NOT_FOUND, Collections.singletonMap("subjectLogin", login))); return (SubjectDTO) revisionService.getLatestRevisionForEntity(Subject.class, - Arrays.asList(AuditEntity.property("user").eq(user))) + List.of(AuditEntity.property("user").eq(user))) .orElseThrow(() -> new NotFoundException("Subject latest revision not found " + "for login" , SUBJECT, ERR_SUBJECT_NOT_FOUND, Collections.singletonMap("subjectLogin", login))); @@ -455,6 +509,20 @@ public Subject findOneByLogin(String login) { ); } + /** + * Find all subjects matching given filter. + * @param criteria filter and sort for subjects. + * @return page of subjects matching filter. + */ + public Page findAll(SubjectCriteria criteria) { + // Pageable is required to set the page limit, + // but the page should always be zero + // since the lastLoadedId param defines the offset + // within the query specification + return subjectRepository.findAll(new SubjectSpecification(criteria), + criteria.getPageable()); + } + /** * Gets relevant privacy-policy-url for this subject. *

@@ -486,4 +554,34 @@ protected URL getPrivacyPolicyUrl(Subject subject) { } } + /** + * Check that the current user is authorized for the given subject. This takes + * into account project and organization affiliation. + * @param permission permission to check + * @param subject subject to check + * @param active if true, only check active project, otherwise also inactive. + * @return the project associated to the subject, if any. + * @throws NotAuthorizedException if the current user is not authorized. + */ + public Optional checkSubjectProject(Permission permission, Subject subject, + boolean active) throws NotAuthorizedException { + Optional project = (active ? subject.getActiveProject() + : subject.getAssociatedProject()) + .flatMap(p -> projectRepository.findByIdWithOrganization(p.getId())); + + if (project.isPresent()) { + Project p = project.get(); + String projectName = p.getProjectName(); + if (!token.hasPermissionOnSubject(permission, projectName, + subject.getUser().getLogin())) { + String organizationName = p.getOrganization().getName(); + checkPermissionOnOrganizationAndProject(token, permission, organizationName, + projectName); + } + } else { + checkGlobalPermission(token, permission); + } + + return project; + } } diff --git a/src/main/java/org/radarbase/management/service/UserService.java b/src/main/java/org/radarbase/management/service/UserService.java index 99c8d9919..df137afdf 100644 --- a/src/main/java/org/radarbase/management/service/UserService.java +++ b/src/main/java/org/radarbase/management/service/UserService.java @@ -1,40 +1,19 @@ package org.radarbase.management.service; -import static org.radarbase.auth.authorization.AuthoritiesConstants.INACTIVE_PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.management.web.rest.errors.EntityName.USER; - -import java.time.Period; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; - -import java.util.stream.Collectors; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.auth.config.Constants; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.config.ManagementPortalProperties; -import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Role; import org.radarbase.management.domain.User; -import org.radarbase.management.repository.AuthorityRepository; -import org.radarbase.management.repository.ProjectRepository; -import org.radarbase.management.repository.RoleRepository; import org.radarbase.management.repository.UserRepository; import org.radarbase.management.repository.filters.UserFilter; import org.radarbase.management.security.SecurityUtils; -import org.radarbase.management.service.dto.ProjectDTO; import org.radarbase.management.service.dto.RoleDTO; import org.radarbase.management.service.dto.UserDTO; -import org.radarbase.management.service.mapper.ProjectMapper; import org.radarbase.management.service.mapper.UserMapper; -import org.radarbase.management.service.util.RandomUtil; -import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.errors.ConflictException; import org.radarbase.management.web.rest.errors.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,10 +22,31 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Period; +import java.time.ZonedDateTime; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.radarbase.auth.authorization.Permission.ROLE_UPDATE; +import static org.radarbase.auth.authorization.RadarAuthorization.checkGlobalPermission; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganization; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganizationAndProject; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnProject; +import static org.radarbase.auth.authorization.RoleAuthority.INACTIVE_PARTICIPANT; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; +import static org.radarbase.management.service.RoleService.getRoleAuthority; +import static org.radarbase.management.web.rest.errors.EntityName.USER; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_EMAIL_EXISTS; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_ENTITY_NOT_FOUND; + /** * Service class for managing users. */ @@ -60,29 +60,23 @@ public class UserService { private UserRepository userRepository; @Autowired - private ProjectRepository projectRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private RoleRepository roleRepository; + private PasswordService passwordService; @Autowired - private ProjectMapper projectMapper; + private RoleService roleService; @Autowired private UserMapper userMapper; - @Autowired - private AuthorityRepository authorityRepository; - @Autowired private RevisionService revisionService; @Autowired private ManagementPortalProperties managementPortalProperties; + @Autowired + private RadarToken token; + /** * Activate a user with the given activation key. * @param key the activation key @@ -119,7 +113,7 @@ public Optional completePasswordReset(String newPassword, String key) { return user.getResetDate().isAfter(oneDayAgo); }) .map(user -> { - user.setPassword(passwordEncoder.encode(newPassword)); + user.setPassword(passwordService.encode(newPassword)); user.setResetKey(null); user.setResetDate(null); user.setActivated(true); @@ -140,7 +134,7 @@ public Optional requestActivationReset(String login) { return userRepository.findOneByLogin(login) .filter((p) -> !p.getActivated()) .map(user -> { - user.setResetKey(RandomUtil.generateResetKey()); + user.setResetKey(passwordService.generateResetKey()); user.setResetDate(ZonedDateTime.now()); return user; }); @@ -156,7 +150,7 @@ public Optional requestPasswordReset(String mail) { return userRepository.findOneByEmail(mail) .filter(User::getActivated) .map(user -> { - user.setResetKey(RandomUtil.generateResetKey()); + user.setResetKey(passwordService.generateResetKey()); user.setResetDate(ZonedDateTime.now()); return user; }); @@ -171,7 +165,7 @@ public Optional requestPasswordReset(String mail) { * @param userDto the user information * @return the newly created user */ - public User createUser(UserDTO userDto) { + public User createUser(UserDTO userDto) throws NotAuthorizedException { User user = new User(); user.setLogin(userDto.getLogin()); user.setFirstName(userDto.getFirstName()); @@ -182,44 +176,73 @@ public User createUser(UserDTO userDto) { } else { user.setLangKey(userDto.getLangKey()); } - String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); - user.setPassword(encryptedPassword); - user.setResetKey(RandomUtil.generateResetKey()); + user.setPassword(passwordService.generateEncodedPassword()); + user.setResetKey(passwordService.generateResetKey()); user.setResetDate(ZonedDateTime.now()); user.setActivated(false); - user.setRoles(getUserRoles(userDto)); - userRepository.save(user); + user.setRoles(getUserRoles(userDto.getRoles(), Set.of())); + user = userRepository.save(user); log.debug("Created Information for User: {}", user); return user; } - private Set getUserRoles(UserDTO userDto) { - Set roles = new HashSet<>(); - for (RoleDTO roleDto : userDto.getRoles()) { - Optional role = roleRepository.findOneByProjectIdAndAuthorityName( - roleDto.getProjectId(), roleDto.getAuthorityName()); - if (!role.isPresent() || role.get().getId() == null) { - Role currentRole = new Role(); - // supplied authorityname can be anything, so check if we actually have one - currentRole.setAuthority( - authorityRepository.findByAuthorityName(roleDto.getAuthorityName()) - .orElseThrow(() -> new NotFoundException("Authority not found with " - + "authorityName", USER, ErrorConstants.ERR_INVALID_AUTHORITY, - Collections.singletonMap("authorityName", - roleDto.getAuthorityName())))); - if (roleDto.getProjectId() != null) { - currentRole.setProject(projectRepository.getOne(roleDto.getProjectId())); - } + private Set getUserRoles(Set roleDtos, Set oldRoles) + throws NotAuthorizedException { + if (roleDtos == null) { + return null; + } + var roles = roleDtos.stream() + .map(roleDto -> { + RoleAuthority authority = getRoleAuthority(roleDto); + return switch (authority.scope()) { + case GLOBAL -> roleService.getGlobalRole(authority); + case ORGANIZATION -> roleService.getOrganizationRole(authority, + roleDto.getOrganizationId()); + case PROJECT -> roleService.getProjectRole(authority, + roleDto.getProjectId()); + }; + }) + .collect(Collectors.toSet()); + + checkAuthorityForRoleChange(roles, oldRoles); + + return roles; + } + + private void checkAuthorityForRoleChange(Set roles, Set oldRoles) + throws NotAuthorizedException { + var updatedRoles = new HashSet<>(roles); + updatedRoles.removeAll(oldRoles); + for (Role r : updatedRoles) { + checkAuthorityForRoleChange(r); + } - if (Objects.nonNull(currentRole.getAuthority())) { - roles.add(roleRepository.save(currentRole)); + var removedRoles = new HashSet<>(oldRoles); + removedRoles.removeAll(roles); + for (Role r : removedRoles) { + checkAuthorityForRoleChange(r); + } + } + + private void checkAuthorityForRoleChange(Role role) + throws NotAuthorizedException { + switch (role.getRole().scope()) { + case GLOBAL -> checkGlobalPermission(token, ROLE_UPDATE); + case ORGANIZATION -> checkPermissionOnOrganization(token, ROLE_UPDATE, + role.getOrganization().getName()); + case PROJECT -> { + if (role.getProject().getOrganization() != null) { + checkPermissionOnOrganizationAndProject(token, ROLE_UPDATE, + role.getProject().getOrganization().getName(), + role.getProject().getProjectName()); + } else { + checkPermissionOnProject(token, ROLE_UPDATE, + role.getProject().getProjectName()); } - } else { - roles.add(role.get()); } + default -> throw new IllegalStateException("Unknown authority scope."); } - return roles; } /** @@ -230,39 +253,63 @@ private Set getUserRoles(UserDTO userDto) { * @param email email id of user * @param langKey language key */ - public void updateUser(String firstName, String lastName, String email, String langKey) { - userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin()).ifPresent(user -> { - user.setFirstName(firstName); - user.setLastName(lastName); - user.setEmail(email); - user.setLangKey(langKey); - log.debug("Changed Information for User: {}", user); - }); + public void updateUser(String userName, String firstName, String lastName, + String email, String langKey) { + Optional userWithEmail = userRepository.findOneByEmail(email); + User user; + if (userWithEmail.isPresent()) { + user = userWithEmail.get(); + if (!user.getLogin().equalsIgnoreCase(userName)) { + throw new ConflictException("Email address " + email + " already in use", USER, + ERR_EMAIL_EXISTS, Map.of("email", email)); + } + } else { + user = userRepository.findOneByLogin(userName) + .orElseThrow(() -> new NotFoundException( + "User with login " + userName + " not found", USER, + ERR_ENTITY_NOT_FOUND, Map.of("user", userName))); + } + + user.setFirstName(firstName); + user.setLastName(lastName); + user.setEmail(email); + user.setLangKey(langKey); + log.debug("Changed Information for User: {}", user); + userRepository.save(user); } /** * Update all information for a specific user, and return the modified user. * * @param userDto user to update + * @param updateProperties should update the user properties * @return updated user */ - public Optional updateUser(UserDTO userDto) { - return userRepository.findById(userDto.getId()) - .map(user -> { - user.setLogin(userDto.getLogin()); - user.setFirstName(userDto.getFirstName()); - user.setLastName(userDto.getLastName()); - user.setEmail(userDto.getEmail()); - user.setActivated(userDto.isActivated()); - user.setLangKey(userDto.getLangKey()); - Set managedRoles = user.getRoles(); - managedRoles.clear(); - managedRoles.addAll(getUserRoles(userDto)); - - log.debug("Changed Information for User: {}", user); - return user; - }) - .map(userMapper::userToUserDTO); + @Transactional + public Optional updateUser( + UserDTO userDto, boolean updateProperties) throws NotAuthorizedException { + Optional userOpt = userRepository.findById(userDto.getId()); + if (userOpt.isPresent()) { + User user = userOpt.get(); + if (updateProperties) { + user.setLogin(userDto.getLogin()); + user.setFirstName(userDto.getFirstName()); + user.setLastName(userDto.getLastName()); + user.setEmail(userDto.getEmail()); + user.setActivated(userDto.isActivated()); + user.setLangKey(userDto.getLangKey()); + } + Set managedRoles = user.getRoles(); + Set oldRoles = Set.copyOf(managedRoles); + managedRoles.clear(); + managedRoles.addAll(getUserRoles(userDto.getRoles(), oldRoles)); + + user = userRepository.save(user); + log.debug("Changed Information for User: {}", user); + return Optional.of(userMapper.userToUserDTO(user)); + } else { + return Optional.empty(); + } } /** @@ -291,7 +338,7 @@ public void changePassword(String password) { */ public void changePassword(String login, String password) { userRepository.findOneByLogin(login).ifPresent(user -> { - String encryptedPassword = passwordEncoder.encode(password); + String encryptedPassword = passwordService.encode(password); user.setPassword(encryptedPassword); log.debug("Changed password for User: {}", user); }); @@ -320,31 +367,6 @@ public Optional getUserWithAuthoritiesByLogin(String login) { return userRepository.findOneWithRolesByLogin(login).map(userMapper::userToUserDTO); } - /** - * Get the projects a given user has any role in. - * @param login the login of the user - * @return the list of projects - */ - @Transactional(readOnly = true) - public List getProjectsAssignedToUser(String login) { - User userByLogin = userRepository.findOneWithRolesByLogin(login) - .orElseThrow(NoSuchElementException::new); - - List projectsOfUser; - - if (userByLogin.getRoles().stream() - .anyMatch(r -> AuthoritiesConstants.SYS_ADMIN.equals(r.getAuthority().getName()))) { - projectsOfUser = projectRepository.findAll(); - } else { - projectsOfUser = userByLogin.getRoles().stream() - .map(Role::getProject) - .distinct() - .collect(Collectors.toList()); - } - - return projectMapper.projectsToProjectDTOs(projectsOfUser); - } - /** * Get the current user. * @return the currently authenticated user, or null if no user is currently authenticated @@ -366,8 +388,10 @@ public void removeNotActivatedUsers() { log.info("Scheduled scan for expired user accounts starting now"); ZonedDateTime cutoff = ZonedDateTime.now().minus(Period.ofDays(3)); - userRepository.findAllByActivatedAndAuthoritiesNot(false, - Arrays.asList(PARTICIPANT, INACTIVE_PARTICIPANT)).stream() + List authorities = Arrays.asList( + PARTICIPANT.authority(), INACTIVE_PARTICIPANT.authority()); + + userRepository.findAllByActivatedAndAuthoritiesNot(false, authorities).stream() .filter(user -> revisionService.getAuditInfo(user).getCreatedAt().isBefore(cutoff)) .forEach(user -> { try { @@ -379,7 +403,40 @@ public void removeNotActivatedUsers() { }); } - public Page findUsers(UserFilter userFilter, Pageable pageable) { - return userRepository.findAll(userFilter, pageable).map(userMapper::userToUserDTO); + /** + * Find all user with given filter. + * + * @param userFilter filtering for users. + * @param pageable paging information + * @param includeProvenance whether to include created and modification fields. + * @return page of users. + */ + public Page findUsers(UserFilter userFilter, Pageable pageable, + boolean includeProvenance) { + return userRepository.findAll(userFilter, pageable) + .map(includeProvenance + ? userMapper::userToUserDTO + : userMapper::userToUserDTONoProvenance); + } + + /** + * Update the roles of the given user. + * @param login user login + * @param roleDtos new roles to set + * @throws NotAuthorizedException if the current user is not allowed to modify the roles + * of the target user. + */ + @Transactional + public void updateRoles(String login, Set roleDtos) throws NotAuthorizedException { + var user = userRepository.findOneByLogin(login) + .orElseThrow(() -> new NotFoundException( + "User with login " + login + " not found", USER, + ERR_ENTITY_NOT_FOUND, Map.of("user", login))); + + Set managedRoles = user.getRoles(); + Set oldRoles = Set.copyOf(managedRoles); + managedRoles.clear(); + managedRoles.addAll(getUserRoles(roleDtos, oldRoles)); + userRepository.save(user); } } diff --git a/src/main/java/org/radarbase/management/service/dto/AuthorityDTO.java b/src/main/java/org/radarbase/management/service/dto/AuthorityDTO.java new file mode 100644 index 000000000..964e72f6a --- /dev/null +++ b/src/main/java/org/radarbase/management/service/dto/AuthorityDTO.java @@ -0,0 +1,33 @@ +package org.radarbase.management.service.dto; + +import org.radarbase.auth.authorization.RoleAuthority; + +public class AuthorityDTO { + private String name; + private String scope; + + public AuthorityDTO() { + // POJO constructor + } + + public AuthorityDTO(RoleAuthority role) { + this.name = role.authority(); + this.scope = role.scope().name(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } +} diff --git a/src/main/java/org/radarbase/management/service/dto/GroupDTO.java b/src/main/java/org/radarbase/management/service/dto/GroupDTO.java new file mode 100644 index 000000000..66e426ee9 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/dto/GroupDTO.java @@ -0,0 +1,75 @@ +package org.radarbase.management.service.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import javax.validation.constraints.NotNull; +import java.util.Objects; + +/** + * A DTO for the Group entity. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class GroupDTO { + + private Long id; + + private Long projectId; + + @NotNull + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getProjectId() { + return projectId; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + GroupDTO groupDto = (GroupDTO) o; + + if (id == null || groupDto.id == null) { + return false; + } + + return Objects.equals(id, groupDto.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "GroupDTO{" + + "id=" + id + + ", name='" + name + "'" + + '}'; + } +} diff --git a/src/main/java/org/radarbase/management/service/dto/OrganizationDTO.java b/src/main/java/org/radarbase/management/service/dto/OrganizationDTO.java new file mode 100644 index 000000000..a4c216c76 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/dto/OrganizationDTO.java @@ -0,0 +1,99 @@ +package org.radarbase.management.service.dto; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.io.Serializable; +import java.util.List; +import java.util.Objects; +import javax.validation.constraints.NotNull; + +/** + * A DTO for the Organization entity. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class OrganizationDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + + @NotNull + private String name; + + @NotNull + private String description; + + @NotNull + private String location; + + private List projects; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var orgDto = (OrganizationDTO) o; + return Objects.equals(name, orgDto.name) + && Objects.equals(description, orgDto.description) + && Objects.equals(location, orgDto.location); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + + @Override + public String toString() { + return "OrganizationDTO{" + + "id=" + id + + ", name='" + name + "'" + + ", description='" + description + "'" + + ", location='" + location + "'" + + '}'; + } +} diff --git a/src/main/java/org/radarbase/management/service/dto/ProjectDTO.java b/src/main/java/org/radarbase/management/service/dto/ProjectDTO.java index 4765d8ccd..62afd3d61 100644 --- a/src/main/java/org/radarbase/management/service/dto/ProjectDTO.java +++ b/src/main/java/org/radarbase/management/service/dto/ProjectDTO.java @@ -14,6 +14,7 @@ /** * A DTO for the Project entity. */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class ProjectDTO implements Serializable { private static final long serialVersionUID = 1L; @@ -34,7 +35,9 @@ public class ProjectDTO implements Serializable { @NotNull private String description; - private String organization; + private OrganizationDTO organization; + + private String organizationName; @NotNull private String location; @@ -45,11 +48,14 @@ public class ProjectDTO implements Serializable { private ZonedDateTime endDate; - @JsonInclude(Include.NON_NULL) + @JsonInclude(Include.NON_EMPTY) private Set sourceTypes; private Map attributes; + @JsonInclude(Include.NON_EMPTY) + private Set groups; + private Long persistentTokenTimeout; public Long getId() { @@ -76,14 +82,22 @@ public void setDescription(String description) { this.description = description; } - public String getOrganization() { + public OrganizationDTO getOrganization() { return organization; } - public void setOrganization(String organization) { + public void setOrganization(OrganizationDTO organization) { this.organization = organization; } + public String getOrganizationName() { + return organizationName; + } + + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + public String getLocation() { return location; } @@ -132,6 +146,14 @@ public void setAttributes(Map attributes) { this.attributes = attributes; } + public Set getGroups() { + return groups; + } + + public void setGroups(Set groups) { + this.groups = groups; + } + public String getHumanReadableProjectName() { return humanReadableProjectName; } @@ -177,6 +199,7 @@ public String toString() { + ", projectName='" + projectName + "'" + ", description='" + description + "'" + ", organization='" + organization + "'" + + ", organizationName='" + organizationName + "'" + ", location='" + location + "'" + ", startDate='" + startDate + "'" + ", projectStatus='" + projectStatus + "'" diff --git a/src/main/java/org/radarbase/management/service/dto/RoleDTO.java b/src/main/java/org/radarbase/management/service/dto/RoleDTO.java index 2c161e2d6..8ecf6fc7d 100644 --- a/src/main/java/org/radarbase/management/service/dto/RoleDTO.java +++ b/src/main/java/org/radarbase/management/service/dto/RoleDTO.java @@ -1,12 +1,20 @@ package org.radarbase.management.service.dto; +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.Objects; + /** * Created by nivethika on 23-5-17. */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class RoleDTO { - private Long id; + private Long organizationId; + + private String organizationName; + private Long projectId; private String projectName; @@ -21,6 +29,22 @@ public void setId(Long id) { this.id = id; } + public Long getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Long organizationId) { + this.organizationId = organizationId; + } + + public String getOrganizationName() { + return organizationName; + } + + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + public Long getProjectId() { return projectId; } @@ -44,4 +68,37 @@ public String getProjectName() { public void setProjectName(String projectName) { this.projectName = projectName; } + + @Override + public String toString() { + return "RoleDTO{" + "id=" + id + + ", organizationId=" + organizationId + + ", projectId=" + projectId + + ", authorityName='" + authorityName + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + RoleDTO roleDto = (RoleDTO) o; + + return Objects.equals(id, roleDto.id) + && Objects.equals(organizationId, roleDto.organizationId) + && Objects.equals(organizationName, roleDto.organizationName) + && Objects.equals(projectId, roleDto.projectId) + && Objects.equals(projectName, roleDto.projectName) + && Objects.equals(authorityName, roleDto.authorityName); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } } diff --git a/src/main/java/org/radarbase/management/service/dto/SourceTypeDTO.java b/src/main/java/org/radarbase/management/service/dto/SourceTypeDTO.java index dfece47a8..16ca3da5b 100644 --- a/src/main/java/org/radarbase/management/service/dto/SourceTypeDTO.java +++ b/src/main/java/org/radarbase/management/service/dto/SourceTypeDTO.java @@ -7,12 +7,14 @@ import java.util.Set; import javax.validation.constraints.NotNull; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; /** * A DTO for the SourceType entity. */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class SourceTypeDTO implements Serializable { private static final long serialVersionUID = 1L; @@ -42,6 +44,7 @@ public class SourceTypeDTO implements Serializable { private String appProvider; + @JsonInclude(JsonInclude.Include.NON_EMPTY) private Set sourceData = new HashSet<>(); public Long getId() { diff --git a/src/main/java/org/radarbase/management/service/dto/SubjectDTO.java b/src/main/java/org/radarbase/management/service/dto/SubjectDTO.java index 894571d80..4c5eeb39d 100644 --- a/src/main/java/org/radarbase/management/service/dto/SubjectDTO.java +++ b/src/main/java/org/radarbase/management/service/dto/SubjectDTO.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.Nulls; import java.io.Serializable; +import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.HashMap; import java.util.HashSet; @@ -58,6 +59,14 @@ public enum SubjectStatus { @JsonInclude(Include.NON_NULL) private ProjectDTO project; + private String group; + + private LocalDate dateOfBirth; + + private ZonedDateTime enrollmentDate; + + private String personName; + private List roles = new ArrayList<>(); private Set sources = new HashSet<>(); @@ -68,6 +77,14 @@ public SubjectStatus getStatus() { return status; } + public String getPersonName() { + return personName; + } + + public void setPersonName(String personName) { + this.personName = personName; + } + public void setStatus(SubjectStatus status) { this.status = status; } @@ -89,6 +106,30 @@ public void setProject(ProjectDTO project) { this.project = project; } + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public LocalDate getDateOfBirth() { + return this.dateOfBirth; + } + + public void setDateOfBirth(LocalDate dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public void setEnrollmentDate(ZonedDateTime enrollmentDate) { + this.enrollmentDate = enrollmentDate; + } + + public ZonedDateTime getEnrollmentDate() { + return this.enrollmentDate; + } + public Long getId() { return id; } diff --git a/src/main/java/org/radarbase/management/service/mapper/ClientDetailsMapper.java b/src/main/java/org/radarbase/management/service/mapper/ClientDetailsMapper.java index 96b027c62..eb81e2ddb 100644 --- a/src/main/java/org/radarbase/management/service/mapper/ClientDetailsMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/ClientDetailsMapper.java @@ -70,6 +70,6 @@ default Map map(Map additionalInformation) { return Collections.emptyMap(); } return additionalInformation.entrySet().stream().collect( - Collectors.toMap(e -> e.getKey(), e -> e.getValue().toString())); + Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString())); } } diff --git a/src/main/java/org/radarbase/management/service/mapper/GroupMapper.java b/src/main/java/org/radarbase/management/service/mapper/GroupMapper.java new file mode 100644 index 000000000..a4c70d071 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/mapper/GroupMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.service.mapper; + +import org.mapstruct.IterableMapping; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.radarbase.management.domain.Group; +import org.radarbase.management.service.dto.GroupDTO; + +import java.util.Collection; +import java.util.List; + +@Mapper(componentModel = "spring") +public interface GroupMapper { + @Named("groupToGroupDTO") + @Mapping(target = "id", ignore = true) + @Mapping(target = "projectId", ignore = true) + @Mapping(target = "name", source = "name") + GroupDTO groupToGroupDTO(Group group); + + @Named("groupToGroupDTOFull") + @Mapping(source = "project.id", target = "projectId") + @Mapping(target = "name", source = "name") + GroupDTO groupToGroupDTOFull(Group group); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "project.id", ignore = true) + @Mapping(target = "name", source = "name") + Group groupDTOToGroup(GroupDTO groupDto); + + @IterableMapping(qualifiedByName = "groupToGroupDTOFull") + List groupToGroupDTOs(Collection groups); +} diff --git a/src/main/java/org/radarbase/management/service/mapper/OrganizationMapper.java b/src/main/java/org/radarbase/management/service/mapper/OrganizationMapper.java new file mode 100644 index 000000000..120f24a45 --- /dev/null +++ b/src/main/java/org/radarbase/management/service/mapper/OrganizationMapper.java @@ -0,0 +1,30 @@ +package org.radarbase.management.service.mapper; + +import org.mapstruct.IterableMapping; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.radarbase.management.domain.Organization; +import org.radarbase.management.service.dto.OrganizationDTO; + +import java.util.List; + +/** + * Mapper for the entity Organization and its DTO OrganizationDTO. + */ +@Mapper(componentModel = "spring", uses = {ProjectMapper.class}) +public interface OrganizationMapper { + @Named("organizationToOrganizationDTO") + @Mapping(target = "projects", qualifiedByName = "projectReducedDTO") + OrganizationDTO organizationToOrganizationDTO(Organization organization); + + @Named("organizationToOrganizationDTOWithoutProjects") + @Mapping(target = "projects", ignore = true) + OrganizationDTO organizationToOrganizationDTOWithoutProjects(Organization organization); + + @Mapping(target = "projects", ignore = true) + Organization organizationDTOToOrganization(OrganizationDTO organizationDto); + + @IterableMapping(qualifiedByName = "organizationToOrganizationDTO") + List organizationsToOrganizationDTOs(List organizations); +} diff --git a/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.java b/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.java index 4b1f0e06a..48df0de89 100644 --- a/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.java @@ -14,24 +14,32 @@ /** * Mapper for the entity Project and its DTO ProjectDTO. */ -@Mapper(componentModel = "spring", uses = {SourceTypeMapper.class,}) +@Mapper(componentModel = "spring", + uses = {GroupMapper.class, SourceTypeMapper.class, OrganizationMapper.class}) @DecoratedWith(ProjectMapperDecorator.class) public interface ProjectMapper { - @Mapping(target = "humanReadableProjectName", ignore = true) + @Mapping(target = "organization", source = "organization", + qualifiedByName = "organizationToOrganizationDTOWithoutProjects") @Mapping(target = "persistentTokenTimeout", ignore = true) + @Mapping(target = "groups", qualifiedByName = "groupToGroupDTO") + @Mapping(target = "sourceTypes", qualifiedByName = "sourceTypeToSourceTypeDTOReduced") ProjectDTO projectToProjectDTO(Project project); @Named(value = "projectReducedDTO") @Mapping(target = "humanReadableProjectName", ignore = true) + @Mapping(target = "organization", ignore = true) @Mapping(target = "sourceTypes", ignore = true) @Mapping(target = "persistentTokenTimeout", ignore = true) + @Mapping(target = "groups", qualifiedByName = "groupToGroupDTO") ProjectDTO projectToProjectDTOReduced(Project project); @IterableMapping(qualifiedByName = "projectReducedDTO") List projectsToProjectDTOs(List projects); @Mapping(target = "roles", ignore = true) + @Mapping(target = "groups", ignore = true) + @Mapping(target = "organization", ignore = true) Project projectDTOToProject(ProjectDTO projectDto); List projectDTOsToProjects(List projectDtos); @@ -42,6 +50,7 @@ public interface ProjectMapper { @Mapping(target = "description", ignore = true) @Mapping(target = "roles", ignore = true) + @Mapping(target = "organizationName", ignore = true) @Mapping(target = "organization", ignore = true) @Mapping(target = "location", ignore = true) @Mapping(target = "startDate", ignore = true) @@ -49,28 +58,9 @@ public interface ProjectMapper { @Mapping(target = "projectStatus", ignore = true) @Mapping(target = "sourceTypes", ignore = true) @Mapping(target = "attributes", ignore = true) + @Mapping(target = "groups", ignore = true) Project descriptiveDTOToProject(MinimalProjectDetailsDTO minimalProjectDetailsDto); List descriptiveDTOsToProjects( List minimalProjectDetailsDtos); - - /** - * generating the fromId for all mappers if the databaseType is sql, as the class has - * relationship to it might need it, instead of creating a new attribute to know if the entity - * has any relationship from some other entity. - * - * @param id id of the entity - * @return the entity instance - */ - - default Project projectFromId(Long id) { - if (id == null) { - return null; - } - Project project = new Project(); - project.setId(id); - return project; - } - - } diff --git a/src/main/java/org/radarbase/management/service/mapper/RoleMapper.java b/src/main/java/org/radarbase/management/service/mapper/RoleMapper.java index e80b5a0ea..7602a66ef 100644 --- a/src/main/java/org/radarbase/management/service/mapper/RoleMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/RoleMapper.java @@ -20,11 +20,14 @@ public interface RoleMapper { @Mapping(source = "authority.name", target = "authorityName") @Mapping(source = "project.id", target = "projectId") @Mapping(source = "project.projectName", target = "projectName") + @Mapping(source = "organization.id", target = "organizationId") + @Mapping(source = "organization.name", target = "organizationName") RoleDTO roleToRoleDTO(Role role); @Mapping(target = "authority", ignore = true) @Mapping(source = "projectId", target = "project.id") @Mapping(target = "users", ignore = true) + @Mapping(source = "organizationId", target = "organization.id") Role roleDTOToRole(RoleDTO roleDtp); Set roleDTOsToRoles(Set roleDtos); diff --git a/src/main/java/org/radarbase/management/service/mapper/SourceMapper.java b/src/main/java/org/radarbase/management/service/mapper/SourceMapper.java index 0eb7a8282..5d6f21eeb 100644 --- a/src/main/java/org/radarbase/management/service/mapper/SourceMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/SourceMapper.java @@ -42,8 +42,10 @@ public interface SourceMapper { @Mapping(target = "sourceType", ignore = true) @Mapping(target = "project", ignore = true) @Mapping(target = "subject", ignore = true) - Source descriptiveDTOToSource(MinimalSourceDetailsDTO minimalSourceDetailsDto); + @Mapping(target = "deleted", constant = "false") + Source minimalSourceDTOToSource(MinimalSourceDetailsDTO minimalSourceDetailsDto); @Mapping(target = "subject", ignore = true) + @Mapping(target = "deleted", constant = "false") Source sourceDTOToSource(SourceDTO sourceDto); } diff --git a/src/main/java/org/radarbase/management/service/mapper/SourceTypeMapper.java b/src/main/java/org/radarbase/management/service/mapper/SourceTypeMapper.java index 5d22cee0d..f4b9e0a4a 100644 --- a/src/main/java/org/radarbase/management/service/mapper/SourceTypeMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/SourceTypeMapper.java @@ -5,6 +5,7 @@ import org.mapstruct.IterableMapping; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.Named; import org.radarbase.management.domain.SourceData; import org.radarbase.management.domain.SourceType; import org.radarbase.management.service.dto.MinimalSourceTypeDTO; @@ -16,9 +17,17 @@ */ @Mapper(componentModel = "spring", uses = {SourceDataMapper.class,}) public interface SourceTypeMapper { - + @Named("sourceTypeToSourceTypeDTO") SourceTypeDTO sourceTypeToSourceTypeDTO(SourceType sourceType); + @Named("sourceTypeToSourceTypeDTOReduced") + @Mapping(target = "sourceData", ignore = true) + @Mapping(target = "assessmentType", ignore = true) + @Mapping(target = "appProvider", ignore = true) + @Mapping(target = "description", ignore = true) + SourceTypeDTO sourceTypeToSourceTypeDTOReduced(SourceType sourceType); + + @IterableMapping(qualifiedByName = "sourceTypeToSourceTypeDTOReduced") List sourceTypesToSourceTypeDTOs(List sourceTypes); @Mapping(target = "projects", ignore = true) diff --git a/src/main/java/org/radarbase/management/service/mapper/SubjectMapper.java b/src/main/java/org/radarbase/management/service/mapper/SubjectMapper.java index ef4e07520..14a1fd3e1 100644 --- a/src/main/java/org/radarbase/management/service/mapper/SubjectMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/SubjectMapper.java @@ -22,6 +22,7 @@ public interface SubjectMapper { @Mapping(source = "user.login", target = "login") @Mapping(target = "status", ignore = true) @Mapping(target = "project", ignore = true) + @Mapping(source = "group.name", target = "group") @Mapping(target = "createdBy", ignore = true) @Mapping(target = "createdDate", ignore = true) @Mapping(target = "lastModifiedBy", ignore = true) @@ -30,6 +31,7 @@ public interface SubjectMapper { SubjectDTO subjectToSubjectDTO(Subject subject); @Mapping(source = "user.login", target = "login") + @Mapping(source = "group.name", target = "group") @Mapping(target = "status", ignore = true) @Mapping(target = "project", ignore = true) @Mapping(target = "createdBy", ignore = true) @@ -41,6 +43,7 @@ public interface SubjectMapper { @Named(value = "subjectReducedProjectDTO") @Mapping(source = "user.login", target = "login") + @Mapping(source = "group.name", target = "group") @Mapping(target = "status", ignore = true) @Mapping(target = "project", ignore = true) @Mapping(target = "createdBy", ignore = true) @@ -54,6 +57,7 @@ public interface SubjectMapper { List subjectsToSubjectReducedProjectDTOs(List subjects); @Mapping(source = "login", target = "user.login") + @Mapping(target = "group", ignore = true) @Mapping(target = "user.email", ignore = true) @Mapping(target = "user.activated", ignore = true) @Mapping(target = "removed", ignore = true) @@ -64,6 +68,7 @@ public interface SubjectMapper { @Mapping(target = "user", ignore = true) @Mapping(target = "removed", ignore = true) @Mapping(target = "metaTokens", ignore = true) + @Mapping(target = "group", ignore = true) Subject safeUpdateSubjectFromDTO(SubjectDTO subjectDto, @MappingTarget Subject subject); /** diff --git a/src/main/java/org/radarbase/management/service/mapper/UserMapper.java b/src/main/java/org/radarbase/management/service/mapper/UserMapper.java index da5b8dd1d..3183e9a5e 100644 --- a/src/main/java/org/radarbase/management/service/mapper/UserMapper.java +++ b/src/main/java/org/radarbase/management/service/mapper/UserMapper.java @@ -1,18 +1,16 @@ package org.radarbase.management.service.mapper; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - import org.mapstruct.DecoratedWith; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.radarbase.management.domain.Authority; -import org.radarbase.management.domain.Role; import org.radarbase.management.domain.User; import org.radarbase.management.service.dto.UserDTO; import org.radarbase.management.service.mapper.decorator.UserMapperDecorator; +import java.util.Set; +import java.util.stream.Collectors; + /** * Mapper for the entity User and its DTO UserDTO. */ @@ -26,7 +24,11 @@ public interface UserMapper { @Mapping(target = "lastModifiedDate", ignore = true) UserDTO userToUserDTO(User user); - List usersToUserDTOs(List users); + @Mapping(target = "createdBy", ignore = true) + @Mapping(target = "createdDate", ignore = true) + @Mapping(target = "lastModifiedBy", ignore = true) + @Mapping(target = "lastModifiedDate", ignore = true) + UserDTO userToUserDTONoProvenance(User user); @Mapping(target = "activationKey", ignore = true) @Mapping(target = "resetKey", ignore = true) @@ -35,49 +37,6 @@ public interface UserMapper { @Mapping(target = "authorities", ignore = true) User userDTOToUser(UserDTO userDto); - /** - * Map a set of {@link Role}s to a set of strings that are the authorities. - * @param roles the roles to map - * @return the authorities as a set of strings if roles is not null, null otherwise - */ - default Set rolesToAuthorities(Set roles) { - if (roles == null) { - return null; - } - return roles.stream().map(role -> role.getAuthority().getName()) - .collect(Collectors.toSet()); - } - - List userDTOsToUsers(List userDtos); - - /** - * Create a {@link User} object with it's id field set to the given id. - * @param id the id - * @return the user if id is not null, null otherwise. - */ - default User userFromId(Long id) { - if (id == null) { - return null; - } - User user = new User(); - user.setId(id); - return user; - } - - /** - * Create a {@link User} object with the login set to the given login. - * @param login the login - * @return the user login is not null, null otherwise - */ - default User userFromLogin(String login) { - if (login == null) { - return null; - } - User user = new User(); - user.setLogin(login); - return user; - } - /** * Map a set of {@link Authority}s to a set of strings that are the authority names. * @param authorities the authorities to map @@ -90,20 +49,4 @@ default Set stringsFromAuthorities(Set authorities) { return authorities.stream().map(Authority::getName) .collect(Collectors.toSet()); } - - /** - * Map a set of strings to a set of authorities. - * @param strings the strings - * @return the set of authorities of the set of strings is not null, null otherwise - */ - default Set authoritiesFromStrings(Set strings) { - if (strings == null) { - return null; - } - return strings.stream().map(string -> { - Authority auth = new Authority(); - auth.setName(string); - return auth; - }).collect(Collectors.toSet()); - } } diff --git a/src/main/java/org/radarbase/management/service/mapper/decorator/ProjectMapperDecorator.java b/src/main/java/org/radarbase/management/service/mapper/decorator/ProjectMapperDecorator.java index 1c8c0188a..91219392c 100644 --- a/src/main/java/org/radarbase/management/service/mapper/decorator/ProjectMapperDecorator.java +++ b/src/main/java/org/radarbase/management/service/mapper/decorator/ProjectMapperDecorator.java @@ -1,17 +1,23 @@ package org.radarbase.management.service.mapper.decorator; -import static org.radarbase.management.service.dto.ProjectDTO.HUMAN_READABLE_PROJECT_NAME; - import org.radarbase.management.domain.Project; +import org.radarbase.management.repository.OrganizationRepository; import org.radarbase.management.repository.ProjectRepository; -import org.radarbase.management.service.OAuthClientService; +import org.radarbase.management.service.MetaTokenService; import org.radarbase.management.service.dto.MinimalProjectDetailsDTO; import org.radarbase.management.service.dto.ProjectDTO; import org.radarbase.management.service.mapper.ProjectMapper; import org.radarbase.management.web.rest.errors.BadRequestException; +import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.errors.NotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import static org.radarbase.management.service.dto.ProjectDTO.HUMAN_READABLE_PROJECT_NAME; +import static org.radarbase.management.web.rest.errors.EntityName.ORGANIZATION; + +import java.util.Collections; + /** * Created by nivethika on 30-8-17. */ @@ -21,11 +27,14 @@ public abstract class ProjectMapperDecorator implements ProjectMapper { @Qualifier("delegate") private ProjectMapper delegate; + @Autowired + private OrganizationRepository organizationRepository; + @Autowired private ProjectRepository projectRepository; @Autowired - private OAuthClientService oAuthClientService; + private MetaTokenService metaTokenService; @Override public ProjectDTO projectToProjectDTO(Project project) { @@ -38,7 +47,7 @@ public ProjectDTO projectToProjectDTO(Project project) { try { dto.setPersistentTokenTimeout( - oAuthClientService.getMetaTokenTimeout(true, project).toMillis()); + metaTokenService.getMetaTokenTimeout(true, project).toMillis()); } catch (BadRequestException ex) { dto.setPersistentTokenTimeout(null); } @@ -69,6 +78,17 @@ public Project projectDTOToProject(ProjectDTO projectDto) { if (projectName != null && !projectName.isEmpty()) { project.getAttributes().put(HUMAN_READABLE_PROJECT_NAME, projectName); } + + var orgDto = projectDto.getOrganization(); + if (orgDto != null && orgDto.getName() != null) { + var org = organizationRepository.findOneByName(orgDto.getName()) + .orElseThrow(() -> new NotFoundException("Organization not found with name", + ORGANIZATION, + ErrorConstants.ERR_ORGANIZATION_NAME_NOT_FOUND, + Collections.singletonMap("name", orgDto.getName()))); + project.setOrganization(org); + } + return project; } @@ -77,7 +97,6 @@ public Project descriptiveDTOToProject(MinimalProjectDetailsDTO minimalProjectDe if (minimalProjectDetailsDto == null) { return null; } - return projectRepository.getOne(minimalProjectDetailsDto.getId()); + return projectRepository.getById(minimalProjectDetailsDto.getId()); } } - diff --git a/src/main/java/org/radarbase/management/service/mapper/decorator/RoleMapperDecorator.java b/src/main/java/org/radarbase/management/service/mapper/decorator/RoleMapperDecorator.java index 190af3e40..0c7b8c481 100644 --- a/src/main/java/org/radarbase/management/service/mapper/decorator/RoleMapperDecorator.java +++ b/src/main/java/org/radarbase/management/service/mapper/decorator/RoleMapperDecorator.java @@ -26,7 +26,6 @@ public abstract class RoleMapperDecorator implements RoleMapper { */ @Override public Role roleDTOToRole(RoleDTO roleDto) { - if (roleDto == null) { return null; } @@ -34,7 +33,7 @@ public Role roleDTOToRole(RoleDTO roleDto) { Role role = delegate.roleDTOToRole(roleDto); if (role.getAuthority() == null) { - role.setAuthority(authorityRepository.getOne(roleDto.getAuthorityName())); + role.setAuthority(authorityRepository.getById(roleDto.getAuthorityName())); } return role; diff --git a/src/main/java/org/radarbase/management/service/mapper/decorator/SourceMapperDecorator.java b/src/main/java/org/radarbase/management/service/mapper/decorator/SourceMapperDecorator.java index d7856804e..0980bb6fb 100644 --- a/src/main/java/org/radarbase/management/service/mapper/decorator/SourceMapperDecorator.java +++ b/src/main/java/org/radarbase/management/service/mapper/decorator/SourceMapperDecorator.java @@ -1,15 +1,21 @@ package org.radarbase.management.service.mapper.decorator; -import java.util.NoSuchElementException; import org.radarbase.management.domain.Source; import org.radarbase.management.repository.SourceRepository; import org.radarbase.management.repository.SubjectRepository; import org.radarbase.management.service.dto.MinimalSourceDetailsDTO; import org.radarbase.management.service.dto.SourceDTO; import org.radarbase.management.service.mapper.SourceMapper; +import org.radarbase.management.web.rest.errors.NotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import java.util.Map; +import java.util.NoSuchElementException; + +import static org.radarbase.management.web.rest.errors.EntityName.SOURCE; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SOURCE_NOT_FOUND; + /** * Created by nivethika on 13-6-17. */ @@ -27,11 +33,13 @@ public abstract class SourceMapperDecorator implements SourceMapper { private SubjectRepository subjectRepository; @Override - public Source descriptiveDTOToSource(MinimalSourceDetailsDTO minimalSource) { + public Source minimalSourceDTOToSource(MinimalSourceDetailsDTO minimalSource) { Source source = sourceRepository .findOneBySourceId(minimalSource.getSourceId()) - .orElseThrow(() -> new IllegalArgumentException( - "Source ID " + minimalSource.getSourceId() + " not found")); + .orElseThrow(() -> new NotFoundException( + "Source ID " + minimalSource.getSourceId() + " not found", + SOURCE, ERR_SOURCE_NOT_FOUND, + Map.of("sourceId", minimalSource.getSourceId().toString()))); source.setAssigned(minimalSource.isAssigned()); return source; } @@ -40,7 +48,11 @@ public Source descriptiveDTOToSource(MinimalSourceDetailsDTO minimalSource) { public Source sourceDTOToSource(SourceDTO sourceDto) { Source source = delegate.sourceDTOToSource(sourceDto); if (sourceDto.getId() != null) { - Source existingSource = sourceRepository.findById(sourceDto.getId()).get(); + Source existingSource = sourceRepository.findById(sourceDto.getId()) + .orElseThrow(() -> new NotFoundException( + "Source ID " + sourceDto.getId() + " not found", + SOURCE, ERR_SOURCE_NOT_FOUND, + Map.of("sourceId", sourceDto.getId().toString()))); if (sourceDto.getSubjectLogin() == null) { source.setSubject(existingSource.getSubject()); } else { diff --git a/src/main/java/org/radarbase/management/service/mapper/decorator/SubjectMapperDecorator.java b/src/main/java/org/radarbase/management/service/mapper/decorator/SubjectMapperDecorator.java index 34de6df4d..0d52e8024 100644 --- a/src/main/java/org/radarbase/management/service/mapper/decorator/SubjectMapperDecorator.java +++ b/src/main/java/org/radarbase/management/service/mapper/decorator/SubjectMapperDecorator.java @@ -1,18 +1,24 @@ package org.radarbase.management.service.mapper.decorator; import org.mapstruct.MappingTarget; +import org.radarbase.management.domain.Group; import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Subject; import org.radarbase.management.domain.audit.EntityAuditInfo; +import org.radarbase.management.repository.GroupRepository; import org.radarbase.management.repository.ProjectRepository; import org.radarbase.management.service.RevisionService; import org.radarbase.management.service.dto.SubjectDTO; import org.radarbase.management.service.dto.SubjectDTO.SubjectStatus; import org.radarbase.management.service.mapper.ProjectMapper; import org.radarbase.management.service.mapper.SubjectMapper; +import org.radarbase.management.web.rest.errors.BadRequestException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_GROUP_NOT_FOUND; + /** * Created by nivethika on 30-8-17. */ @@ -31,6 +37,9 @@ public abstract class SubjectMapperDecorator implements SubjectMapper { @Autowired private ProjectRepository projectRepository; + @Autowired + private GroupRepository groupRepository; + @Override public SubjectDTO subjectToSubjectDTO(Subject subject) { if (subject == null) { @@ -90,13 +99,40 @@ public Subject subjectDTOToSubject(SubjectDTO subjectDto) { Subject subject = delegate.subjectDTOToSubject(subjectDto); setSubjectStatus(subjectDto, subject); + subject.setGroup(getGroup(subjectDto)); + return subject; } + private Group getGroup(SubjectDTO subjectDto) { + if (subjectDto.getGroup() == null) { + return null; + } else if (subjectDto.getProject().getId() != null) { + return groupRepository.findByProjectIdAndName( + subjectDto.getProject().getId(), subjectDto.getGroup()) + .orElseThrow(() -> new BadRequestException( + "Group " + subjectDto.getGroup() + " not found in project " + + subjectDto.getProject().getId(), + SUBJECT, ERR_GROUP_NOT_FOUND)); + } else if (subjectDto.getProject().getProjectName() != null) { + return groupRepository.findByProjectNameAndName( + subjectDto.getProject().getProjectName(), subjectDto.getGroup()) + .orElseThrow(() -> new BadRequestException( + "Group " + subjectDto.getGroup() + " not found in project " + + subjectDto.getProject().getProjectName(), + SUBJECT, ERR_GROUP_NOT_FOUND)); + } else { + throw new BadRequestException( + "Group " + subjectDto.getGroup() + " cannot be found without a project", + SUBJECT, ERR_GROUP_NOT_FOUND); + } + } + @Override public Subject safeUpdateSubjectFromDTO(SubjectDTO subjectDto, @MappingTarget Subject subject) { Subject subjectRetrieved = delegate.safeUpdateSubjectFromDTO(subjectDto, subject); setSubjectStatus(subjectDto, subjectRetrieved); + subject.setGroup(getGroup(subjectDto)); return subjectRetrieved; } diff --git a/src/main/java/org/radarbase/management/service/mapper/decorator/UserMapperDecorator.java b/src/main/java/org/radarbase/management/service/mapper/decorator/UserMapperDecorator.java index f4b40fa3c..839bd6ff3 100644 --- a/src/main/java/org/radarbase/management/service/mapper/decorator/UserMapperDecorator.java +++ b/src/main/java/org/radarbase/management/service/mapper/decorator/UserMapperDecorator.java @@ -8,10 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import java.util.List; -import java.util.stream.Collectors; - -public class UserMapperDecorator implements UserMapper { +public abstract class UserMapperDecorator implements UserMapper { @Autowired @Qualifier("delegate") @@ -36,31 +33,4 @@ public UserDTO userToUserDTO(User user) { return dto; } - - @Override - public List usersToUserDTOs(List users) { - if (users == null) { - return null; - } - - return users.stream().map(this::userToUserDTO).collect(Collectors.toList()); - } - - @Override - public User userDTOToUser(UserDTO userDto) { - if (userDto == null) { - return null; - } - - return delegate.userDTOToUser(userDto); - } - - @Override - public List userDTOsToUsers(List userDtos) { - if (userDtos == null) { - return null; - } - - return userDtos.stream().map(this::userDTOToUser).collect(Collectors.toList()); - } } diff --git a/src/main/java/org/radarbase/management/service/util/PasswordUtil.java b/src/main/java/org/radarbase/management/service/util/PasswordUtil.java deleted file mode 100644 index f56476bf7..000000000 --- a/src/main/java/org/radarbase/management/service/util/PasswordUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2021. The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * See the file LICENSE in the root of this repository. - */ - -package org.radarbase.management.service.util; - -import java.util.Arrays; -import java.util.regex.Pattern; - -/** Password utility. */ -public class PasswordUtil { - private final Pattern[] patterns = { - // numeric - Pattern.compile("[0-9]"), - // letter - Pattern.compile("[a-zA-Z]"), - // symbol - Pattern.compile("[^a-zA-Z0-9]") - }; - - /** Check whether given password is too weak. */ - public boolean isPasswordWeak(String password) { - return !Arrays.stream(patterns).allMatch(p -> p.matcher(password).find()) - || password.length() < 8; - } -} diff --git a/src/main/java/org/radarbase/management/service/util/RandomUtil.java b/src/main/java/org/radarbase/management/service/util/RandomUtil.java deleted file mode 100644 index b14abf090..000000000 --- a/src/main/java/org/radarbase/management/service/util/RandomUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.radarbase.management.service.util; - -import org.apache.commons.lang3.RandomStringUtils; - -/** - * Utility class for generating random Strings. - */ -public final class RandomUtil { - - private static final int DEF_COUNT = 20; - - private RandomUtil() { - } - - /** - * Generate a password. - * - * @return the generated password - */ - public static String generatePassword() { - return RandomStringUtils.randomAlphanumeric(DEF_COUNT); - } - - /** - * Generate an activation key. - * - * @return the generated activation key - */ - public static String generateActivationKey() { - return RandomStringUtils.randomNumeric(DEF_COUNT); - } - - /** - * Generate a reset key. - * - * @return the generated reset key - */ - public static String generateResetKey() { - return RandomStringUtils.randomNumeric(DEF_COUNT); - } -} diff --git a/src/main/java/org/radarbase/management/web/rest/AccountResource.java b/src/main/java/org/radarbase/management/web/rest/AccountResource.java index e4d1a13e3..bb90e289b 100644 --- a/src/main/java/org/radarbase/management/web/rest/AccountResource.java +++ b/src/main/java/org/radarbase/management/web/rest/AccountResource.java @@ -1,15 +1,17 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; +import io.micrometer.core.annotation.Timed; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.config.ManagementPortalProperties; -import org.radarbase.management.repository.UserRepository; -import org.radarbase.management.security.SecurityUtils; +import org.radarbase.management.domain.User; +import org.radarbase.management.security.SessionRadarToken; import org.radarbase.management.service.MailService; +import org.radarbase.management.service.PasswordService; import org.radarbase.management.service.UserService; import org.radarbase.management.service.dto.UserDTO; import org.radarbase.management.service.mapper.UserMapper; -import org.radarbase.management.service.util.PasswordUtil; -import org.radarbase.management.web.rest.util.HeaderUtil; +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.radarbase.management.web.rest.errors.RadarWebApplicationException; import org.radarbase.management.web.rest.vm.KeyAndPasswordVM; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,6 +19,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -25,9 +28,15 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.util.Optional; +import static org.radarbase.management.security.JwtAuthenticationFilter.TOKEN_ATTRIBUTE; +import static org.radarbase.management.web.rest.errors.EntityName.USER; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_ACCESS_DENIED; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_EMAIL_NOT_REGISTERED; + /** * REST controller for managing the current user's account. */ @@ -37,9 +46,6 @@ public class AccountResource { private static final Logger log = LoggerFactory.getLogger(AccountResource.class); - @Autowired - private UserRepository userRepository; - @Autowired private UserService userService; @@ -52,7 +58,11 @@ public class AccountResource { @Autowired private ManagementPortalProperties managementPortalProperties; - private final PasswordUtil passwordUtil = new PasswordUtil(); + @Autowired(required = false) + private RadarToken token; + + @Autowired + private PasswordService passwordService; /** * GET /activate : activate the registered user. @@ -70,16 +80,35 @@ public ResponseEntity activateAccount(@RequestParam(value = "key") Strin } /** - * GET /authenticate : check if the user is authenticated, and return its login. + * POST /login : check if the user is authenticated. + * + * @param session the HTTP session + * @return user account details if the user is authenticated + */ + @PostMapping("/login") + @Timed + public ResponseEntity login(HttpSession session) { + log.debug("Logging in user to session with principal {}", token.getUsername()); + RadarToken sessionToken = new SessionRadarToken(token); + session.setAttribute(TOKEN_ATTRIBUTE, sessionToken); + return getAccount(); + } + + /** + * POST /logout : log out. * * @param request the HTTP request - * @return the login if the user is authenticated + * @return no content response if the user is authenticated */ - @GetMapping("/authenticate") + @PostMapping("/logout") @Timed - public String authenticate(HttpServletRequest request) { - log.debug("REST request to check if the current user is authenticated"); - return request.getRemoteUser(); + public ResponseEntity logout(HttpServletRequest request) { + log.debug("Unauthenticate a user"); + HttpSession session = request.getSession(false); + if (session != null) { + session.invalidate(); + } + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } /** @@ -93,7 +122,8 @@ public String authenticate(HttpServletRequest request) { public ResponseEntity getAccount() { return Optional.ofNullable(userService.getUserWithAuthorities()) .map(user -> new ResponseEntity<>(userMapper.userToUserDTO(user), HttpStatus.OK)) - .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + .orElseThrow(() -> new RadarWebApplicationException(HttpStatus.FORBIDDEN, + "Cannot get account without user", USER, ERR_ACCESS_DENIED)); } /** @@ -105,26 +135,17 @@ public ResponseEntity getAccount() { */ @PostMapping("/account") @Timed - public ResponseEntity saveAccount(@Valid @RequestBody UserDTO userDto) { - boolean hasConflictingLogin = userRepository.findOneByEmail(userDto.getEmail()) - .filter(u -> !u.getLogin().equalsIgnoreCase(userDto.getLogin())) - .isPresent(); - - if (hasConflictingLogin) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert("user-management", "emailexists", "Email already in use")) - .body(null); + public ResponseEntity saveAccount(@Valid @RequestBody UserDTO userDto, + Authentication authentication) { + if (authentication.getPrincipal() == null) { + throw new RadarWebApplicationException(HttpStatus.FORBIDDEN, + "Cannot update account without user", USER, ERR_ACCESS_DENIED); } - return userRepository - .findOneByLogin(SecurityUtils.getCurrentUserLogin()) - .map(u -> { - userService.updateUser(userDto.getFirstName(), userDto.getLastName(), - userDto.getEmail(), - userDto.getLangKey()); - return new ResponseEntity(HttpStatus.OK); - }) - .orElseGet(() -> new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR)); + userService.updateUser(authentication.getName(), userDto.getFirstName(), + userDto.getLastName(), userDto.getEmail(), userDto.getLangKey()); + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } /** @@ -138,12 +159,9 @@ public ResponseEntity saveAccount(@Valid @RequestBody UserDTO userDto) { produces = MediaType.TEXT_PLAIN_VALUE) @Timed public ResponseEntity changePassword(@RequestBody String password) { - ResponseEntity passFail = checkPasswordLength(password); - if (passFail != null) { - return passFail; - } + passwordService.checkPasswordStrength(password); userService.changePassword(password); - return new ResponseEntity<>(HttpStatus.OK); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -155,18 +173,17 @@ public ResponseEntity changePassword(@RequestBody String password) { * @return the ResponseEntity with status 200 (OK) if the email was sent, or status 400 (Bad * Request) if the email address is not registered or user is not deactivated */ - @PostMapping(path = "/account/reset-activation/init", - produces = MediaType.TEXT_PLAIN_VALUE) + @PostMapping(path = "/account/reset-activation/init") @Timed - public ResponseEntity requestActivationReset(@RequestBody String login) { - return userService.requestActivationReset(login) - .map(user -> { - // this will be the similar email with newly set reset-key - mailService.sendCreationEmail(user, managementPortalProperties.getCommon() - .getActivationKeyTimeoutInSeconds()); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - }).orElse(new ResponseEntity<>("Cannot find a deactivated user with login " + login, - HttpStatus.BAD_REQUEST)); + public ResponseEntity requestActivationReset(@RequestBody String login) { + User user = userService.requestActivationReset(login) + .orElseThrow(() -> new BadRequestException( + "Cannot find a deactivated user with login " + login, + USER, ERR_EMAIL_NOT_REGISTERED)); + + mailService.sendCreationEmail(user, managementPortalProperties.getCommon() + .getActivationKeyTimeoutInSeconds()); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } /** @@ -176,16 +193,15 @@ public ResponseEntity requestActivationReset(@RequestBody String login) * @return the ResponseEntity with status 200 (OK) if the email was sent, or status 400 (Bad * Request) if the email address is not registered */ - @PostMapping(path = "/account/reset_password/init", - produces = MediaType.TEXT_PLAIN_VALUE) + @PostMapping(path = "/account/reset_password/init") @Timed - public ResponseEntity requestPasswordReset(@RequestBody String mail) { - return userService.requestPasswordReset(mail) - .map(user -> { - mailService.sendPasswordResetMail(user); - return new ResponseEntity<>("email was sent", HttpStatus.OK); - }).orElse(new ResponseEntity<>("email address not registered", - HttpStatus.BAD_REQUEST)); + public ResponseEntity requestPasswordReset(@RequestBody String mail) { + User user = userService.requestPasswordReset(mail) + .orElseThrow(() -> new BadRequestException("email address not registered", + USER, ERR_EMAIL_NOT_REGISTERED)); + + mailService.sendPasswordResetMail(user); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } /** @@ -198,29 +214,12 @@ public ResponseEntity requestPasswordReset(@RequestBody String mail) { @PostMapping(path = "/account/reset_password/finish", produces = MediaType.TEXT_PLAIN_VALUE) @Timed - public ResponseEntity finishPasswordReset( + public ResponseEntity finishPasswordReset( @RequestBody KeyAndPasswordVM keyAndPassword) { - ResponseEntity passFail = checkPasswordLength(keyAndPassword.getNewPassword()); - if (passFail != null) { - return passFail; - } + passwordService.checkPasswordStrength(keyAndPassword.getNewPassword()); return userService .completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey()) - .map(user -> new ResponseEntity(HttpStatus.OK)) + .map(user -> new ResponseEntity(HttpStatus.NO_CONTENT)) .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR)); } - - private ResponseEntity checkPasswordLength(String password) { - if (passwordUtil.isPasswordWeak(password)) { - return new ResponseEntity<>( - "Weak password. Use a password with more variety of numeric, alphabetical and " - + "symbol characters.", - HttpStatus.BAD_REQUEST); - } else if (password.length() > 100) { - return new ResponseEntity<>( - "Password too long", HttpStatus.BAD_REQUEST); - } else { - return null; - } - } } diff --git a/src/main/java/org/radarbase/management/web/rest/AuditResource.java b/src/main/java/org/radarbase/management/web/rest/AuditResource.java index 1ffa69d5f..697845908 100644 --- a/src/main/java/org/radarbase/management/web/rest/AuditResource.java +++ b/src/main/java/org/radarbase/management/web/rest/AuditResource.java @@ -1,16 +1,8 @@ package org.radarbase.management.web.rest; -import static org.radarbase.auth.authorization.Permission.AUDIT_READ; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.management.security.SecurityUtils.getJWT; - -import io.github.jhipster.web.util.ResponseUtil; -import io.swagger.annotations.ApiParam; -import java.time.LocalDate; -import java.util.List; -import javax.servlet.http.HttpServletRequest; - +import io.swagger.v3.oas.annotations.Parameter; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.service.AuditEventService; import org.radarbase.management.web.rest.util.PaginationUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +17,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import tech.jhipster.web.util.ResponseUtil; + +import java.time.LocalDate; +import java.util.List; + +import static org.radarbase.auth.authorization.Permission.AUDIT_READ; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; /** * REST controller for getting the audit events. @@ -32,9 +31,8 @@ @RestController @RequestMapping("/management/audits") public class AuditResource { - @Autowired - private HttpServletRequest servletRequest; + private RadarToken token; @Autowired private AuditEventService auditEventService; @@ -46,9 +44,9 @@ public class AuditResource { * @return the ResponseEntity with status 200 (OK) and the list of AuditEvents in body */ @GetMapping - public ResponseEntity> getAll(@ApiParam Pageable pageable) + public ResponseEntity> getAll(@Parameter Pageable pageable) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), AUDIT_READ); + checkPermission(token, AUDIT_READ); Page page = auditEventService.findAll(pageable); HttpHeaders headers = PaginationUtil .generatePaginationHttpHeaders(page, "/management/audits"); @@ -68,8 +66,8 @@ public ResponseEntity> getAll(@ApiParam Pageable pageable) public ResponseEntity> getByDates( @RequestParam(value = "fromDate") LocalDate fromDate, @RequestParam(value = "toDate") LocalDate toDate, - @ApiParam Pageable pageable) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), AUDIT_READ); + @Parameter Pageable pageable) throws NotAuthorizedException { + checkPermission(token, AUDIT_READ); Page page = auditEventService .findByDates(fromDate.atTime(0, 0), toDate.atTime(23, 59), pageable); HttpHeaders headers = PaginationUtil @@ -86,7 +84,7 @@ public ResponseEntity> getByDates( */ @GetMapping("/{id:.+}") public ResponseEntity get(@PathVariable Long id) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), AUDIT_READ); + checkPermission(token, AUDIT_READ); return ResponseUtil.wrapOrNotFound(auditEventService.find(id)); } } diff --git a/src/main/java/org/radarbase/management/web/rest/AuthorityResource.java b/src/main/java/org/radarbase/management/web/rest/AuthorityResource.java index bccda223c..40a29f6d3 100644 --- a/src/main/java/org/radarbase/management/web/rest/AuthorityResource.java +++ b/src/main/java/org/radarbase/management/web/rest/AuthorityResource.java @@ -2,14 +2,17 @@ import static org.radarbase.auth.authorization.Permission.AUTHORITY_READ; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.management.security.SecurityUtils.getJWT; -import com.codahale.metrics.annotation.Timed; -import java.util.Arrays; +import io.micrometer.core.annotation.Timed; + import java.util.List; -import javax.servlet.http.HttpServletRequest; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.service.dto.AuthorityDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,9 +26,8 @@ @RestController @RequestMapping("/api") public class AuthorityResource { - @Autowired - private HttpServletRequest servletRequest; + private RadarToken token; private static final Logger log = LoggerFactory.getLogger(AuthorityResource.class); @@ -36,11 +38,17 @@ public class AuthorityResource { */ @GetMapping("/authorities") @Timed - public List getAllAuthorities() throws NotAuthorizedException { + public List getAllAuthorities() throws NotAuthorizedException { log.debug("REST request to get all Authorities"); - checkPermission(getJWT(servletRequest), AUTHORITY_READ); - return Arrays.asList(AuthoritiesConstants.PROJECT_ADMIN, AuthoritiesConstants.PROJECT_OWNER, - AuthoritiesConstants.PROJECT_AFFILIATE, AuthoritiesConstants.PROJECT_ANALYST); + checkPermission(token, AUTHORITY_READ); + return Stream.of( + RoleAuthority.SYS_ADMIN, + RoleAuthority.ORGANIZATION_ADMIN, + RoleAuthority.PROJECT_ADMIN, + RoleAuthority.PROJECT_OWNER, + RoleAuthority.PROJECT_AFFILIATE, + RoleAuthority.PROJECT_ANALYST) + .map(AuthorityDTO::new) + .collect(Collectors.toList()); } - } diff --git a/src/main/java/org/radarbase/management/web/rest/GroupResource.java b/src/main/java/org/radarbase/management/web/rest/GroupResource.java new file mode 100644 index 000000000..b11eea90f --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/GroupResource.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest; + +import org.radarbase.auth.authorization.Permission; +import org.radarbase.auth.config.Constants; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.service.GroupService; +import org.radarbase.management.service.ProjectService; +import org.radarbase.management.service.dto.GroupDTO; +import org.radarbase.management.service.dto.ProjectDTO; +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.radarbase.management.web.rest.vm.GroupPatchOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; + +import javax.validation.Valid; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import static org.radarbase.auth.authorization.Permission.PROJECT_READ; +import static org.radarbase.auth.authorization.Permission.PROJECT_UPDATE; +import static org.radarbase.auth.authorization.Permission.SUBJECT_UPDATE; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganizationAndProject; +import static org.radarbase.management.web.rest.errors.EntityName.GROUP; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; + +@RestController +@RequestMapping("/api/projects/{projectName:" + Constants.ENTITY_ID_REGEX + "}/groups") +public class GroupResource { + @Autowired + private GroupService groupService; + + @Autowired + private RadarToken token; + + @Autowired + private ProjectService projectService; + + /** + * Create group. + * @param projectName project name + * @param groupDto group specification + * @return created response + * @throws NotAuthorizedException if PROJECT_UPDATE permissions are not present. + */ + @PostMapping + public ResponseEntity createGroup( + @PathVariable String projectName, + @Valid @RequestBody GroupDTO groupDto) throws NotAuthorizedException { + checkProjectPermission(PROJECT_UPDATE, projectName); + GroupDTO groupDtoResult = groupService.createGroup(projectName, groupDto); + URI location = MvcUriComponentsBuilder.fromController(getClass()) + .path("/{groupName}") + .buildAndExpand(projectName, groupDtoResult.getName()) + .toUri(); + return ResponseEntity.created(location) + .body(groupDtoResult); + } + + /** + * List groups. + * @param projectName project name + * @return list of groups + * @throws NotAuthorizedException if PROJECT_READ permissions are not present. + */ + @GetMapping + public List listGroups( + @PathVariable String projectName) throws NotAuthorizedException { + checkProjectPermission(PROJECT_READ, projectName); + return groupService.listGroups(projectName); + } + + /** + * Get a single group. + * @param projectName project name + * @param groupName group name + * @return group + * @throws NotAuthorizedException if PROJECT_READ permissions are not present. + */ + @GetMapping("/{groupName:" + Constants.ENTITY_ID_REGEX + "}") + public GroupDTO getGroup( + @PathVariable String projectName, + @PathVariable String groupName) throws NotAuthorizedException { + checkProjectPermission(PROJECT_READ, projectName); + return groupService.getGroup(projectName, groupName); + } + + /** + * Delete a single group. + * @param projectName project name + * @param groupName group name + * @throws NotAuthorizedException if PROJECT_UPDATE permissions are not present. + */ + @DeleteMapping("/{groupName:" + Constants.ENTITY_ID_REGEX + "}") + public ResponseEntity deleteGroup( + @RequestParam(defaultValue = "false") Boolean unlinkSubjects, + @PathVariable String projectName, + @PathVariable String groupName) throws NotAuthorizedException { + checkProjectPermission(PROJECT_UPDATE, projectName); + groupService.deleteGroup(projectName, groupName, unlinkSubjects); + return ResponseEntity.noContent().build(); + } + + /** + * Add subjects to a single group. + * @param projectName project name + * @param groupName group name + * @param patchOperations json-patch request body + * @throws NotAuthorizedException if PROJECT_UPDATE permissions are not present. + */ + @PatchMapping("/{groupName:" + Constants.ENTITY_ID_REGEX + "}/subjects") + public ResponseEntity changeGroupSubjects( + @PathVariable String projectName, + @PathVariable String groupName, + @RequestBody List patchOperations) throws NotAuthorizedException { + // Technically, this request modifies subjects, + // so it would make sense to check permissions per subject, + // but I assume that only those who are authorized to perform project-wide actions + // should be allowed to use this endpoint + checkProjectPermission(SUBJECT_UPDATE, projectName); + + var addedItems = new ArrayList(); + var removedItems = new ArrayList(); + for (GroupPatchOperation operation : patchOperations) { + String opCode = operation.getOp(); + switch (opCode) { + case "add": + addedItems.addAll(operation.getValue()); + break; + case "remove": + removedItems.addAll(operation.getValue()); + break; + default: + throw new BadRequestException( + "Group patch operation '" + opCode + "' is not supported", + GROUP, ERR_VALIDATION); + } + } + + groupService.updateGroupSubjects(projectName, groupName, addedItems, removedItems); + return ResponseEntity.noContent().build(); + } + + private void checkProjectPermission(Permission permission, String projectName) + throws NotAuthorizedException { + checkPermission(token, permission); + ProjectDTO project = projectService.findOneByName(projectName); + checkPermissionOnOrganizationAndProject(token, permission, + project.getOrganization().getName(), projectName); + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/LogsResource.java b/src/main/java/org/radarbase/management/web/rest/LogsResource.java index 6d10bad84..8c94ea56f 100644 --- a/src/main/java/org/radarbase/management/web/rest/LogsResource.java +++ b/src/main/java/org/radarbase/management/web/rest/LogsResource.java @@ -2,10 +2,10 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; -import com.codahale.metrics.annotation.Timed; +import io.micrometer.core.annotation.Timed; import java.util.List; import java.util.stream.Collectors; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.management.web.rest.vm.LoggerVM; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; @@ -30,7 +30,7 @@ public class LogsResource { */ @GetMapping("/logs") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public List getList() { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); return context.getLoggerList() @@ -46,7 +46,7 @@ public List getList() { @PutMapping("/logs") @ResponseStatus(HttpStatus.NO_CONTENT) @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public void changeLevel(@RequestBody LoggerVM jsonLogger) { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); context.getLogger(jsonLogger.getName()).setLevel(Level.valueOf(jsonLogger.getLevel())); diff --git a/src/main/java/org/radarbase/management/web/rest/MetaTokenResource.java b/src/main/java/org/radarbase/management/web/rest/MetaTokenResource.java index 38ca75876..68998e74b 100644 --- a/src/main/java/org/radarbase/management/web/rest/MetaTokenResource.java +++ b/src/main/java/org/radarbase/management/web/rest/MetaTokenResource.java @@ -1,9 +1,10 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.MetaToken; import org.radarbase.management.domain.Subject; import org.radarbase.management.service.MetaTokenService; @@ -19,13 +20,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.ServletRequest; import java.net.MalformedURLException; import java.time.Duration; import static org.radarbase.auth.authorization.Permission.SUBJECT_UPDATE; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnSubject; -import static org.radarbase.management.security.SecurityUtils.getJWT; @RestController @RequestMapping("/api") @@ -39,8 +38,8 @@ public class MetaTokenResource { @Autowired private MetaTokenService metaTokenService; - @Autowired - private ServletRequest servletRequest; + @Autowired(required = false) + private RadarToken radarToken; /** * GET /api/meta-token/:tokenName. @@ -71,16 +70,16 @@ public ResponseEntity getTokenByTokenName(@PathVariable("tokenName") S public ResponseEntity deleteTokenByTokenName(@PathVariable("tokenName") String tokenName) throws NotAuthorizedException { log.info("Requesting token with tokenName {}", tokenName); - MetaToken token = metaTokenService.getToken(tokenName); - Subject subject = token.getSubject(); + MetaToken metaToken = metaTokenService.getToken(tokenName); + Subject subject = metaToken.getSubject(); String project = subject.getActiveProject() .orElseThrow(() -> new NotAuthorizedException( "Cannot establish authority of subject without active project affiliation." )) .getProjectName(); String user = subject.getUser().getLogin(); - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, project, user); - metaTokenService.delete(token); + checkPermissionOnSubject(radarToken, SUBJECT_UPDATE, project, user); + metaTokenService.delete(metaToken); return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/org/radarbase/management/web/rest/OAuthClientsResource.java b/src/main/java/org/radarbase/management/web/rest/OAuthClientsResource.java index 4addc0241..b3115f5df 100644 --- a/src/main/java/org/radarbase/management/web/rest/OAuthClientsResource.java +++ b/src/main/java/org/radarbase/management/web/rest/OAuthClientsResource.java @@ -6,28 +6,27 @@ import static org.radarbase.auth.authorization.Permission.OAUTHCLIENTS_UPDATE; import static org.radarbase.auth.authorization.Permission.SUBJECT_UPDATE; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnSubject; -import static org.radarbase.management.security.SecurityUtils.getJWT; import static org.radarbase.management.service.OAuthClientService.checkProtected; import static org.radarbase.management.web.rest.errors.EntityName.OAUTH_CLIENT; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.util.List; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import com.codahale.metrics.annotation.Timed; -import javax.ws.rs.DefaultValue; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.Project; import org.radarbase.management.domain.Subject; import org.radarbase.management.domain.User; -import org.radarbase.management.service.OAuthClientService; -import org.radarbase.management.service.ResourceUriService; +import org.radarbase.management.service.MetaTokenService; import org.radarbase.management.service.SubjectService; import org.radarbase.management.service.UserService; +import org.radarbase.management.service.OAuthClientService; +import org.radarbase.management.service.OrganizationService; +import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.dto.ClientDetailsDTO; import org.radarbase.management.service.dto.ClientPairInfoDTO; import org.radarbase.management.service.mapper.ClientDetailsMapper; @@ -64,6 +63,9 @@ public class OAuthClientsResource { @Autowired private OAuthClientService oAuthClientService; + @Autowired + private MetaTokenService metaTokenService; + @Autowired private ClientDetailsMapper clientDetailsMapper; @@ -74,11 +76,14 @@ public class OAuthClientsResource { private UserService userService; @Autowired - private HttpServletRequest servletRequest; + private OrganizationService organizationService; @Autowired private AuditEventRepository eventRepository; + @Autowired + private RadarToken token; + /** * GET /api/oauth-clients. * @@ -89,7 +94,7 @@ public class OAuthClientsResource { @GetMapping("/oauth-clients") @Timed public ResponseEntity> getOAuthClients() throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), OAUTHCLIENTS_READ); + checkPermission(token, OAUTHCLIENTS_READ); return ResponseEntity.ok().body(clientDetailsMapper .clientDetailsToClientDetailsDTO(oAuthClientService.findAllOAuthClients())); } @@ -106,7 +111,7 @@ public ResponseEntity> getOAuthClients() throws NotAuthor @Timed public ResponseEntity getOAuthClientById(@PathVariable("id") String id) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), OAUTHCLIENTS_READ); + checkPermission(token, OAUTHCLIENTS_READ); // getOAuthClient checks if the id exists return ResponseEntity.ok().body(clientDetailsMapper .clientDetailsToClientDetailsDTO(oAuthClientService.findOneByClientId(id))); @@ -124,7 +129,7 @@ public ResponseEntity getOAuthClientById(@PathVariable("id") S @Timed public ResponseEntity updateOAuthClient(@Valid @RequestBody ClientDetailsDTO clientDetailsDto) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), OAUTHCLIENTS_UPDATE); + checkPermission(token, OAUTHCLIENTS_UPDATE); // getOAuthClient checks if the id exists checkProtected(oAuthClientService.findOneByClientId(clientDetailsDto.getClientId())); @@ -147,7 +152,7 @@ public ResponseEntity updateOAuthClient(@Valid @RequestBody Cl @Timed public ResponseEntity deleteOAuthClient(@PathVariable String id) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), OAUTHCLIENTS_DELETE); + checkPermission(token, OAUTHCLIENTS_DELETE); // getOAuthClient checks if the id exists checkProtected(oAuthClientService.findOneByClientId(id)); oAuthClientService.deleteClientDetails(id); @@ -168,7 +173,7 @@ public ResponseEntity deleteOAuthClient(@PathVariable String id) @Timed public ResponseEntity createOAuthClient(@Valid @RequestBody ClientDetailsDTO clientDetailsDto) throws URISyntaxException, NotAuthorizedException { - checkPermission(getJWT(servletRequest), OAUTHCLIENTS_CREATE); + checkPermission(token, OAUTHCLIENTS_CREATE); ClientDetails created = oAuthClientService.createClientDetail(clientDetailsDto); return ResponseEntity.created(ResourceUriService.getUri(clientDetailsDto)) .headers(HeaderUtil.createEntityCreationAlert(OAUTH_CLIENT, created.getClientId())) @@ -190,7 +195,7 @@ public ResponseEntity createOAuthClient(@Valid @RequestBody Cl @Timed public ResponseEntity getRefreshToken(@RequestParam String login, @RequestParam(value = "clientId") String clientId, - @RequestParam(value = "persistent") @DefaultValue("false") Boolean persistent) + @RequestParam(value = "persistent", defaultValue = "false") Boolean persistent) throws NotAuthorizedException, URISyntaxException, MalformedURLException { User currentUser = userService.getUserWithAuthorities(); if (currentUser == null) { @@ -205,9 +210,9 @@ public ResponseEntity getRefreshToken(@RequestParam String lo .orElse(null); // Users who can update a subject can also generate a refresh token for that subject - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, project, login); + organizationService.checkPermissionBySubject(SUBJECT_UPDATE, project, login); - ClientPairInfoDTO cpi = oAuthClientService.createMetaToken(subject, clientId, persistent); + ClientPairInfoDTO cpi = metaTokenService.createMetaToken(subject, clientId, persistent); // generate audit event eventRepository.add(new AuditEvent(currentUser.getLogin(), "PAIR_CLIENT_REQUEST", "client_id=" + clientId, "subject_login=" + login)); diff --git a/src/main/java/org/radarbase/management/web/rest/OrganizationResource.java b/src/main/java/org/radarbase/management/web/rest/OrganizationResource.java new file mode 100644 index 000000000..8af921f55 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/OrganizationResource.java @@ -0,0 +1,172 @@ +package org.radarbase.management.web.rest; + +import io.micrometer.core.annotation.Timed; +import org.radarbase.auth.config.Constants; +import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; +import org.radarbase.management.service.OrganizationService; +import org.radarbase.management.service.ResourceUriService; +import org.radarbase.management.service.dto.OrganizationDTO; +import org.radarbase.management.service.dto.ProjectDTO; +import org.radarbase.management.web.rest.errors.NotFoundException; +import org.radarbase.management.web.rest.errors.ErrorConstants; +import org.radarbase.management.web.rest.util.HeaderUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.List; + +import static org.radarbase.auth.authorization.Permission.ORGANIZATION_CREATE; +import static org.radarbase.auth.authorization.Permission.ORGANIZATION_READ; +import static org.radarbase.auth.authorization.Permission.ORGANIZATION_UPDATE; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganization; +import static org.radarbase.auth.authorization.Permission.PROJECT_READ; +import static org.radarbase.management.web.rest.errors.EntityName.ORGANIZATION; + +/** + * REST controller for managing Organization. + */ +@RestController +@RequestMapping("/api") +public class OrganizationResource { + + private static final Logger log = LoggerFactory.getLogger(OrganizationResource.class); + + private static final String ENTITY_NAME = "organization"; + + @Autowired + private OrganizationService organizationService; + + @Autowired + private RadarToken token; + + /** + * POST /organizations : Create a new organization. + * + * @param organizationDto the organizationDto to create + * @return the ResponseEntity with status 201 (Created) + * and with body the new organizationDto, + * or with status 400 (Bad Request) if the organization already has an ID + * @throws URISyntaxException if the Location URI syntax is incorrect + */ + @PostMapping("/organizations") + @Timed + public ResponseEntity createOrganization( + @Valid @RequestBody OrganizationDTO organizationDto + ) throws URISyntaxException, NotAuthorizedException { + log.debug("REST request to save Organization : {}", organizationDto); + checkPermission(token, ORGANIZATION_CREATE); + if (organizationDto.getId() != null) { + var msg = "A new organization cannot already have an ID"; + var headers = HeaderUtil.createFailureAlert(ENTITY_NAME, "idexists", msg); + return ResponseEntity.badRequest().headers(headers).body(null); + } + var existingOrg = organizationService.findByName(organizationDto.getName()); + if (existingOrg.isPresent()) { + var msg = "An organization with this name already exists"; + var headers = HeaderUtil.createFailureAlert(ENTITY_NAME, "nameexists", msg); + return ResponseEntity.status(HttpStatus.CONFLICT).headers(headers).body(null); + } + var result = organizationService.save(organizationDto); + return ResponseEntity.created(ResourceUriService.getUri(result)) + .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getName())) + .body(result); + } + + /** + * GET /organizations : get all the organizations. + * + * @return the ResponseEntity with status 200 (OK) + * and the list of organizations in body + */ + @GetMapping("/organizations") + @Timed + public ResponseEntity getAllOrganizations() throws NotAuthorizedException { + log.debug("REST request to get Organizations"); + checkPermission(token, ORGANIZATION_READ); + var orgs = organizationService.findAll(); + return new ResponseEntity<>(orgs, HttpStatus.OK); + } + + /** + * PUT /organizations : Updates an existing organization. + * + * @param organizationDto the organizationDto to update + * @return the ResponseEntity + * with status 200 and with the updated organizationDto as body, + * or with status 400 if the organizationDto is not valid, + * or with status 500 if the organizationDto couldnt be updated + * @throws URISyntaxException if the Location URI syntax is incorrect + */ + @PutMapping("/organizations") + @Timed + public ResponseEntity updateOrganization( + @Valid @RequestBody OrganizationDTO organizationDto + ) throws URISyntaxException, NotAuthorizedException { + log.debug("REST request to update Organization : {}", organizationDto); + if (organizationDto.getId() == null) { + return createOrganization(organizationDto); + } + var name = organizationDto.getName(); + checkPermissionOnOrganization(token, ORGANIZATION_UPDATE, name); + var result = organizationService.save(organizationDto); + return ResponseEntity.ok() + .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getName())) + .body(result); + } + + /** + * GET /organizations/:organizationName : get the organization with this name. + * + * @param name the name of the organizationDTO to retrieve + * @return the ResponseEntity with status 200 (OK) + * and with body the organizationDTO, + * or with status 404 (Not Found) + */ + @GetMapping("/organizations/{name:" + Constants.ENTITY_ID_REGEX + "}") + @Timed + public ResponseEntity getOrganization( + @PathVariable String name) throws NotAuthorizedException { + log.debug("REST request to get Organization : {}", name); + checkPermissionOnOrganization(token, ORGANIZATION_READ, name); + var org = organizationService.findByName(name); + var dto = org.orElseThrow(() -> new NotFoundException( + "Organization not found with name " + name, + ORGANIZATION, ErrorConstants.ERR_ORGANIZATION_NAME_NOT_FOUND, + Collections.singletonMap("name", name))); + return ResponseEntity.ok(dto); + } + + /** + * GET /organizations/:organizationName/projects + * : get projects belonging to the organization with this name. + * + * @param name the name of the organization + * @return the ResponseEntity + * with status 200 (OK) and with body containing the project list, + * or with status 404 (Not Found) + */ + @GetMapping("/organizations/{name:" + Constants.ENTITY_ID_REGEX + "}/projects") + @Timed + public ResponseEntity> getOrganizationProjects( + @PathVariable String name) throws NotAuthorizedException { + log.debug("REST request to get Projects of the Organization : {}", name); + checkPermissionOnOrganization(token, PROJECT_READ, name); + var projects = organizationService.findAllProjectsByOrganizationName(name); + return ResponseEntity.ok(projects); + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/ProfileInfoResource.java b/src/main/java/org/radarbase/management/web/rest/ProfileInfoResource.java index 861050f70..694fdfac2 100644 --- a/src/main/java/org/radarbase/management/web/rest/ProfileInfoResource.java +++ b/src/main/java/org/radarbase/management/web/rest/ProfileInfoResource.java @@ -1,16 +1,13 @@ package org.radarbase.management.web.rest; -import io.github.jhipster.config.JHipsterProperties; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.radarbase.management.config.DefaultProfileUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Arrays; + /** * Resource to return information about the currently running Spring profiles. */ @@ -21,49 +18,30 @@ public class ProfileInfoResource { @Autowired private Environment env; - @Autowired - private JHipsterProperties jHipsterProperties; - + /** + * Get profile info. + * @return profile info. + */ @GetMapping("/profile-info") public ProfileInfoVM getActiveProfiles() { - String[] activeProfiles = DefaultProfileUtil.getActiveProfiles(env); - return new ProfileInfoVM(activeProfiles, getRibbonEnv(activeProfiles)); - } - - private String getRibbonEnv(String... activeProfiles) { - String[] displayOnActiveProfiles = jHipsterProperties.getRibbon() - .getDisplayOnActiveProfiles(); - if (displayOnActiveProfiles == null) { - return null; - } - List ribbonProfiles = new ArrayList<>(Arrays.asList(displayOnActiveProfiles)); - List springBootProfiles = Arrays.asList(activeProfiles); - ribbonProfiles.retainAll(springBootProfiles); - if (!ribbonProfiles.isEmpty()) { - return ribbonProfiles.get(0); + String[] activeProfiles = env.getActiveProfiles(); + if (activeProfiles.length == 0) { + activeProfiles = env.getDefaultProfiles(); } - return null; + return new ProfileInfoVM(activeProfiles); } - class ProfileInfoVM { - + static class ProfileInfoVM { private final String[] activeProfiles; - private final String ribbonEnv; - - ProfileInfoVM(String[] activeProfiles, String ribbonEnv) { + ProfileInfoVM(String[] activeProfiles) { this.activeProfiles = new String[activeProfiles.length]; System.arraycopy(activeProfiles, 0, this.activeProfiles, 0, activeProfiles.length); - this.ribbonEnv = ribbonEnv; } public String[] getActiveProfiles() { - return activeProfiles; - } - - public String getRibbonEnv() { - return ribbonEnv; + return Arrays.copyOf(activeProfiles, activeProfiles.length); } } } diff --git a/src/main/java/org/radarbase/management/web/rest/ProjectResource.java b/src/main/java/org/radarbase/management/web/rest/ProjectResource.java index 0666533dd..d21233a96 100644 --- a/src/main/java/org/radarbase/management/web/rest/ProjectResource.java +++ b/src/main/java/org/radarbase/management/web/rest/ProjectResource.java @@ -1,16 +1,16 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; -import io.swagger.annotations.ApiParam; +import io.micrometer.core.annotation.Timed; +import io.swagger.v3.oas.annotations.Parameter; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; import org.radarbase.auth.token.RadarToken; import org.radarbase.management.repository.ProjectRepository; -import org.radarbase.management.repository.SubjectRepository; import org.radarbase.management.service.ProjectService; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.RoleService; import org.radarbase.management.service.SourceService; +import org.radarbase.management.service.SubjectService; import org.radarbase.management.service.dto.MinimalSourceDetailsDTO; import org.radarbase.management.service.dto.ProjectDTO; import org.radarbase.management.service.dto.RoleDTO; @@ -18,6 +18,8 @@ import org.radarbase.management.service.dto.SourceTypeDTO; import org.radarbase.management.service.dto.SubjectDTO; import org.radarbase.management.service.mapper.SubjectMapper; +import org.radarbase.management.web.rest.criteria.SubjectCriteria; +import org.radarbase.management.web.rest.errors.BadRequestException; import org.radarbase.management.web.rest.errors.ErrorVM; import org.radarbase.management.web.rest.util.HeaderUtil; import org.radarbase.management.web.rest.util.PaginationUtil; @@ -41,16 +43,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Objects; -import static org.radarbase.auth.authorization.AuthoritiesConstants.INACTIVE_PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; import static org.radarbase.auth.authorization.Permission.PROJECT_CREATE; import static org.radarbase.auth.authorization.Permission.PROJECT_DELETE; import static org.radarbase.auth.authorization.Permission.PROJECT_READ; @@ -59,9 +56,11 @@ import static org.radarbase.auth.authorization.Permission.SOURCE_READ; import static org.radarbase.auth.authorization.Permission.SUBJECT_READ; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnProject; -import static org.radarbase.management.security.SecurityUtils.getJWT; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganization; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnOrganizationAndProject; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_PROJECT_NOT_EMPTY; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; /** * REST controller for managing Project. @@ -81,16 +80,16 @@ public class ProjectResource { private ProjectService projectService; @Autowired - private HttpServletRequest servletRequest; + private RadarToken token; @Autowired private RoleService roleService; @Autowired - private SubjectRepository subjectRepository; + private SubjectMapper subjectMapper; @Autowired - private SubjectMapper subjectMapper; + private SubjectService subjectService; @Autowired private SourceService sourceService; @@ -108,15 +107,24 @@ public class ProjectResource { public ResponseEntity createProject(@Valid @RequestBody ProjectDTO projectDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save Project : {}", projectDto); - checkPermission(getJWT(servletRequest), PROJECT_CREATE); + var org = projectDto.getOrganization(); + if (org == null || org.getName() == null) { + throw new BadRequestException("Organization must be provided", + ENTITY_NAME, ERR_VALIDATION); + } + checkPermissionOnOrganization(token, PROJECT_CREATE, org.getName()); + if (projectDto.getId() != null) { - return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert( - ENTITY_NAME, "idexists", "A new project cannot already have an ID")).body(null); + return ResponseEntity.badRequest() + .headers(HeaderUtil.createFailureAlert( + ENTITY_NAME, "idexists", "A new project cannot already have an ID")) + .body(null); } if (projectRepository.findOneWithEagerRelationshipsByName(projectDto.getProjectName()) .isPresent()) { - return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert( - ENTITY_NAME, "nameexists", "A project with this name already exists")) + return ResponseEntity.badRequest() + .headers(HeaderUtil.createFailureAlert( + ENTITY_NAME, "nameexists", "A project with this name already exists")) .body(null); } ProjectDTO result = projectService.save(projectDto); @@ -142,8 +150,32 @@ public ResponseEntity updateProject(@Valid @RequestBody ProjectDTO p if (projectDto.getId() == null) { return createProject(projectDto); } - checkPermissionOnProject(getJWT(servletRequest), PROJECT_UPDATE, - projectDto.getProjectName()); + // When a client wants to link the project to the default organization, + // this must be done explicitly. + var org = projectDto.getOrganization(); + if (org == null || org.getName() == null) { + throw new BadRequestException("Organization must be provided", + ENTITY_NAME, ERR_VALIDATION); + } + // When clients want to transfer a project, + // they must have permissions to modify both new & old organizations + var existingProject = projectService.findOne(projectDto.getId()); + + if (!existingProject.getProjectName().equals(projectDto.getProjectName())) { + throw new BadRequestException("The project name cannot be modified.", ENTITY_NAME, + ERR_VALIDATION); + } + + var newOrgName = org.getName(); + checkPermissionOnOrganizationAndProject(token, PROJECT_UPDATE, newOrgName, + existingProject.getProjectName()); + + var oldOrgName = existingProject.getOrganization().getName(); + if (!newOrgName.equals(oldOrgName)) { + checkPermissionOnOrganization(token, PROJECT_UPDATE, oldOrgName); + checkPermissionOnOrganization(token, PROJECT_UPDATE, newOrgName); + } + ProjectDTO result = projectService.save(projectDto); return ResponseEntity.ok() .headers(HeaderUtil @@ -159,11 +191,11 @@ public ResponseEntity updateProject(@Valid @RequestBody ProjectDTO p @GetMapping("/projects") @Timed public ResponseEntity getAllProjects( - @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable, + @PageableDefault(size = Integer.MAX_VALUE) Pageable pageable, @RequestParam(name = "minimized", required = false, defaultValue = "false") Boolean minimized) throws NotAuthorizedException { log.debug("REST request to get Projects"); - checkPermission(getJWT(servletRequest), PROJECT_READ); + checkPermission(token, PROJECT_READ); Page page = projectService.findAll(minimized, pageable); HttpHeaders headers = PaginationUtil .generatePaginationHttpHeaders(page, "/api/projects"); @@ -181,9 +213,11 @@ public ResponseEntity getAllProjects( @Timed public ResponseEntity getProject(@PathVariable String projectName) throws NotAuthorizedException { + checkPermission(token, PROJECT_READ); log.debug("REST request to get Project : {}", projectName); ProjectDTO projectDto = projectService.findOneByName(projectName); - checkPermissionOnProject(getJWT(servletRequest), PROJECT_READ, projectDto.getProjectName()); + checkPermissionOnOrganizationAndProject(token, PROJECT_READ, + projectDto.getOrganization().getName(), projectDto.getProjectName()); return ResponseEntity.ok(projectDto); } @@ -198,9 +232,11 @@ public ResponseEntity getProject(@PathVariable String projectName) @Timed public List getSourceTypesOfProject(@PathVariable String projectName) throws NotAuthorizedException { + checkPermission(token, PROJECT_READ); log.debug("REST request to get Project : {}", projectName); ProjectDTO projectDto = projectService.findOneByName(projectName); - checkPermissionOnProject(getJWT(servletRequest), PROJECT_READ, projectDto.getProjectName()); + checkPermissionOnOrganizationAndProject(token, PROJECT_READ, + projectDto.getOrganization().getName(), projectDto.getProjectName()); return projectService.findSourceTypesByProjectId(projectDto.getId()); } @@ -215,10 +251,11 @@ public List getSourceTypesOfProject(@PathVariable String projectN @Timed public ResponseEntity deleteProject(@PathVariable String projectName) throws NotAuthorizedException { + checkPermission(token, PROJECT_DELETE); log.debug("REST request to delete Project : {}", projectName); ProjectDTO projectDto = projectService.findOneByName(projectName); - checkPermissionOnProject(getJWT(servletRequest), PROJECT_DELETE, - projectDto.getProjectName()); + checkPermissionOnOrganizationAndProject(token, PROJECT_DELETE, + projectDto.getOrganization().getName(), projectDto.getProjectName()); try { projectService.delete(projectDto.getId()); @@ -240,9 +277,11 @@ public ResponseEntity deleteProject(@PathVariable String projectName) @Timed public ResponseEntity> getRolesByProject(@PathVariable String projectName) throws NotAuthorizedException { + checkPermission(token, ROLE_READ); log.debug("REST request to get all Roles for project {}", projectName); ProjectDTO projectDto = projectService.findOneByName(projectName); - checkPermissionOnProject(getJWT(servletRequest), ROLE_READ, projectDto.getProjectName()); + checkPermissionOnOrganizationAndProject(token, ROLE_READ, + projectDto.getOrganization().getName(), projectDto.getProjectName()); return ResponseEntity.ok(roleService.getRolesByProject(projectName)); } @@ -253,16 +292,17 @@ public ResponseEntity> getRolesByProject(@PathVariable String proj */ @GetMapping("/projects/{projectName:" + Constants.ENTITY_ID_REGEX + "}/sources") @Timed - public ResponseEntity getAllSourcesForProject(@ApiParam Pageable pageable, + public ResponseEntity getAllSourcesForProject(@Parameter Pageable pageable, @PathVariable String projectName, @RequestParam(value = "assigned", required = false) Boolean assigned, @RequestParam(name = "minimized", required = false, defaultValue = "false") Boolean minimized) throws NotAuthorizedException { + checkPermission(token, SOURCE_READ); log.debug("REST request to get all Sources"); ProjectDTO projectDto = projectService.findOneByName(projectName); - RadarToken jwt = getJWT(servletRequest); - checkPermissionOnProject(jwt, SOURCE_READ, projectDto.getProjectName()); - if (!jwt.isClientCredentials() && jwt.hasAuthority(PARTICIPANT)) { + checkPermissionOnOrganizationAndProject(token, SOURCE_READ, + projectDto.getOrganization().getName(), projectDto.getProjectName()); + if (!token.isClientCredentials() && token.hasAuthority(PARTICIPANT)) { throw new NotAuthorizedException("Cannot list all project sources as a participant."); } @@ -297,41 +337,35 @@ public ResponseEntity getAllSourcesForProject(@ApiParam Pageable pageable, /** * Get /projects/{projectName}/subjects : get all subjects for a given project. * - * @param projectName The name of the project * @return The subjects in the project or 404 if there is no such project */ @GetMapping("/projects/{projectName:" + Constants.ENTITY_ID_REGEX + "}/subjects") @Timed - public ResponseEntity> getAllSubjects(@ApiParam Pageable pageable, - @PathVariable String projectName, - @RequestParam(value = "withInactiveParticipants", required = false) - Boolean inactiveParticipantsParam) throws NotAuthorizedException { + public ResponseEntity> getAllSubjects( + @Valid SubjectCriteria subjectCriteria + ) throws NotAuthorizedException { + checkPermission(token, SUBJECT_READ); + String projectName = subjectCriteria.getProjectName(); // this checks if the project exists - projectService.findOneByName(projectName); - RadarToken jwt = getJWT(servletRequest); - checkPermissionOnProject(jwt, SUBJECT_READ, projectName); - if (!jwt.isClientCredentials() && jwt.hasAuthority(PARTICIPANT)) { + ProjectDTO projectDto = projectService.findOneByName(projectName); + checkPermissionOnOrganizationAndProject(token, SUBJECT_READ, + projectDto.getOrganization().getName(), projectName); + if (!token.isClientCredentials() && token.hasAuthority(PARTICIPANT)) { throw new NotAuthorizedException("Cannot list all project subjects as a participant."); } - log.debug("REST request to get all subjects for project {}", projectName); - Page page; - boolean includeInactiveParticipants = inactiveParticipantsParam != null - && inactiveParticipantsParam; - if (includeInactiveParticipants) { - page = subjectRepository.findAllByProjectNameAndAuthoritiesIn(pageable, projectName, - Arrays.asList(PARTICIPANT, INACTIVE_PARTICIPANT)) - .map(subjectMapper::subjectToSubjectWithoutProjectDTO); + // this checks if the project exists + projectService.findOneByName(projectName); + subjectCriteria.setProjectName(projectName); - } else { - page = subjectRepository.findAllByProjectNameAndAuthoritiesIn(pageable, projectName, - Collections.singletonList(PARTICIPANT)) - .map(subjectMapper::subjectToSubjectWithoutProjectDTO); - } + log.debug("REST request to get all subjects for project {} using criteria {}", projectName, + subjectCriteria); + Page page = subjectService.findAll(subjectCriteria) + .map(subjectMapper::subjectToSubjectWithoutProjectDTO); - HttpHeaders headers = PaginationUtil - .generatePaginationHttpHeaders(page, HeaderUtil.buildPath("api", - "projects", projectName, "subjects")); + String baseUri = HeaderUtil.buildPath("api", "projects", projectName, "subjects"); + HttpHeaders headers = PaginationUtil.generateSubjectPaginationHttpHeaders( + page, baseUri, subjectCriteria); return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); } } diff --git a/src/main/java/org/radarbase/management/web/rest/RevisionResource.java b/src/main/java/org/radarbase/management/web/rest/RevisionResource.java index b0a39b00d..2c7312f3b 100644 --- a/src/main/java/org/radarbase/management/web/rest/RevisionResource.java +++ b/src/main/java/org/radarbase/management/web/rest/RevisionResource.java @@ -1,7 +1,7 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import io.micrometer.core.annotation.Timed; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.management.service.RevisionService; import org.radarbase.management.service.dto.RevisionInfoDTO; import org.radarbase.management.web.rest.util.PaginationUtil; @@ -38,7 +38,7 @@ public class RevisionResource { */ @GetMapping("/revisions") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public ResponseEntity> getRevisions( @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable) { log.debug("REST request to get page of revisions"); @@ -55,7 +55,7 @@ public ResponseEntity> getRevisions( */ @GetMapping("/revisions/{id}") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public ResponseEntity getRevision(@PathVariable("id") Integer id) { log.debug("REST request to get single revision: {}", id.toString()); return ResponseEntity.ok(revisionService.getRevision(id)); diff --git a/src/main/java/org/radarbase/management/web/rest/RoleResource.java b/src/main/java/org/radarbase/management/web/rest/RoleResource.java index 7f260cec8..5e45ad48e 100644 --- a/src/main/java/org/radarbase/management/web/rest/RoleResource.java +++ b/src/main/java/org/radarbase/management/web/rest/RoleResource.java @@ -1,10 +1,10 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; -import io.github.jhipster.web.util.ResponseUtil; -import org.radarbase.auth.authorization.AuthoritiesConstants; +import io.micrometer.core.annotation.Timed; +import org.radarbase.auth.authorization.RoleAuthority; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.RoleService; import org.radarbase.management.service.dto.RoleDTO; @@ -21,8 +21,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import tech.jhipster.web.util.ResponseUtil; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.net.URISyntaxException; import java.util.List; @@ -31,7 +31,6 @@ import static org.radarbase.auth.authorization.Permission.ROLE_READ; import static org.radarbase.auth.authorization.Permission.ROLE_UPDATE; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnProject; -import static org.radarbase.management.security.SecurityUtils.getJWT; /** * REST controller for managing Role. @@ -45,10 +44,10 @@ public class RoleResource { private static final String ENTITY_NAME = "role"; @Autowired - private RoleService roleService; + private RadarToken token; @Autowired - private HttpServletRequest servletRequest; + private RoleService roleService; /** * POST /Roles : Create a new role. @@ -60,11 +59,11 @@ public class RoleResource { */ @PostMapping("/roles") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public ResponseEntity createRole(@Valid @RequestBody RoleDTO roleDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save Role : {}", roleDto); - checkPermissionOnProject(getJWT(servletRequest), ROLE_CREATE, roleDto.getProjectName()); + checkPermissionOnProject(token, ROLE_CREATE, roleDto.getProjectName()); if (roleDto.getId() != null) { return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME, "idexists", "A new role cannot already have an ID")).body(null); @@ -86,14 +85,14 @@ public ResponseEntity createRole(@Valid @RequestBody RoleDTO roleDto) */ @PutMapping("/roles") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public ResponseEntity updateRole(@Valid @RequestBody RoleDTO roleDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to update Role : {}", roleDto); if (roleDto.getId() == null) { return createRole(roleDto); } - checkPermissionOnProject(getJWT(servletRequest), ROLE_UPDATE, roleDto.getProjectName()); + checkPermissionOnProject(token, ROLE_UPDATE, roleDto.getProjectName()); RoleDTO result = roleService.save(roleDto); return ResponseEntity.ok() .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, displayName(roleDto))) @@ -107,7 +106,7 @@ public ResponseEntity updateRole(@Valid @RequestBody RoleDTO roleDto) */ @GetMapping("/roles") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public List getAllRoles() { log.debug("REST request to get all Roles"); return roleService.findAll(); @@ -120,7 +119,7 @@ public List getAllRoles() { */ @GetMapping("/roles/admin") @Timed - @Secured({AuthoritiesConstants.SYS_ADMIN}) + @Secured({RoleAuthority.SYS_ADMIN_AUTHORITY}) public List getAllAdminRoles() { log.debug("REST request to get all Admin Roles"); return roleService.findSuperAdminRoles(); @@ -140,7 +139,7 @@ public List getAllAdminRoles() { @Timed public ResponseEntity getRole(@PathVariable String projectName, @PathVariable String authorityName) throws NotAuthorizedException { - checkPermissionOnProject(getJWT(servletRequest), ROLE_READ, projectName); + checkPermissionOnProject(token, ROLE_READ, projectName); return ResponseUtil.wrapOrNotFound(roleService .findOneByProjectNameAndAuthorityName(projectName, authorityName)); } diff --git a/src/main/java/org/radarbase/management/web/rest/SourceDataResource.java b/src/main/java/org/radarbase/management/web/rest/SourceDataResource.java index 1218020f7..40ac7d7fd 100644 --- a/src/main/java/org/radarbase/management/web/rest/SourceDataResource.java +++ b/src/main/java/org/radarbase/management/web/rest/SourceDataResource.java @@ -1,9 +1,9 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; -import io.github.jhipster.web.util.ResponseUtil; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.SourceDataService; import org.radarbase.management.service.dto.SourceDataDTO; @@ -27,22 +27,21 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import tech.jhipster.web.util.ResponseUtil; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.net.URISyntaxException; import java.util.Collections; import java.util.List; import java.util.Optional; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; +import static org.radarbase.auth.authorization.RoleAuthority.SYS_ADMIN; import static org.radarbase.auth.authorization.Permission.SOURCEDATA_CREATE; import static org.radarbase.auth.authorization.Permission.SOURCEDATA_DELETE; import static org.radarbase.auth.authorization.Permission.SOURCEDATA_READ; import static org.radarbase.auth.authorization.Permission.SOURCEDATA_UPDATE; import static org.radarbase.auth.authorization.RadarAuthorization.checkAuthorityAndPermission; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.management.security.SecurityUtils.getJWT; import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_DATA; /** @@ -55,10 +54,10 @@ public class SourceDataResource { private static final Logger log = LoggerFactory.getLogger(SourceDataResource.class); @Autowired - private SourceDataService sourceDataService; + private RadarToken token; @Autowired - private HttpServletRequest servletRequest; + private SourceDataService sourceDataService; /** * POST /source-data : Create a new sourceData. @@ -73,7 +72,7 @@ public class SourceDataResource { public ResponseEntity createSourceData(@Valid @RequestBody SourceDataDTO sourceDataDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save SourceData : {}", sourceDataDto); - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, SOURCEDATA_CREATE); + checkAuthorityAndPermission(token, SYS_ADMIN, SOURCEDATA_CREATE); if (sourceDataDto.getId() != null) { return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(SOURCE_DATA, "idexists", "A new sourceData cannot already have an ID")).build(); @@ -107,7 +106,7 @@ public ResponseEntity updateSourceData(@Valid @RequestBody Source if (sourceDataDto.getId() == null) { return createSourceData(sourceDataDto); } - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, SOURCEDATA_UPDATE); + checkAuthorityAndPermission(token, SYS_ADMIN, SOURCEDATA_UPDATE); SourceDataDTO result = sourceDataService.save(sourceDataDto); return ResponseEntity.ok().headers(HeaderUtil .createEntityUpdateAlert(SOURCE_DATA, sourceDataDto.getSourceDataName())) @@ -126,7 +125,7 @@ public ResponseEntity> getAllSourceData( @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable) throws NotAuthorizedException { log.debug("REST request to get all SourceData"); - checkPermission(getJWT(servletRequest), SOURCEDATA_READ); + checkPermission(token, SOURCEDATA_READ); Page page = sourceDataService.findAll(pageable); HttpHeaders headers = PaginationUtil .generatePaginationHttpHeaders(page, "/api/source-data"); @@ -144,7 +143,7 @@ public ResponseEntity> getAllSourceData( @Timed public ResponseEntity getSourceData(@PathVariable String sourceDataName) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCEDATA_READ); + checkPermission(token, SOURCEDATA_READ); return ResponseUtil.wrapOrNotFound(sourceDataService .findOneBySourceDataName(sourceDataName)); } @@ -159,7 +158,7 @@ public ResponseEntity getSourceData(@PathVariable String sourceDa @Timed public ResponseEntity deleteSourceData(@PathVariable String sourceDataName) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCEDATA_DELETE); + checkPermission(token, SOURCEDATA_DELETE); Optional sourceDataDto = sourceDataService .findOneBySourceDataName(sourceDataName); if (sourceDataDto.isEmpty()) { diff --git a/src/main/java/org/radarbase/management/web/rest/SourceResource.java b/src/main/java/org/radarbase/management/web/rest/SourceResource.java index 4e93e2cc9..1bfdddb02 100644 --- a/src/main/java/org/radarbase/management/web/rest/SourceResource.java +++ b/src/main/java/org/radarbase/management/web/rest/SourceResource.java @@ -1,11 +1,12 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.Source; import org.radarbase.management.repository.SourceRepository; +import org.radarbase.management.service.OrganizationService; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.SourceService; import org.radarbase.management.service.dto.MinimalProjectDetailsDTO; @@ -32,15 +33,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.net.URISyntaxException; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import static io.github.jhipster.web.util.ResponseUtil.wrapOrNotFound; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; import static org.radarbase.auth.authorization.Permission.SOURCE_CREATE; import static org.radarbase.auth.authorization.Permission.SOURCE_DELETE; import static org.radarbase.auth.authorization.Permission.SOURCE_READ; @@ -48,9 +46,8 @@ import static org.radarbase.auth.authorization.Permission.SUBJECT_READ; import static org.radarbase.auth.authorization.RadarAuthorization.checkAuthorityAndPermission; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnProject; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnSource; -import static org.radarbase.management.security.SecurityUtils.getJWT; +import static org.radarbase.auth.authorization.RoleAuthority.SYS_ADMIN; +import static tech.jhipster.web.util.ResponseUtil.wrapOrNotFound; /** * REST controller for managing Source. @@ -70,7 +67,10 @@ public class SourceResource { private SourceRepository sourceRepository; @Autowired - private HttpServletRequest servletRequest; + private RadarToken token; + + @Autowired + private OrganizationService organizationService; /** * POST /sources : Create a new source. @@ -87,7 +87,7 @@ public ResponseEntity createSource(@Valid @RequestBody SourceDTO sour log.debug("REST request to save Source : {}", sourceDto); MinimalProjectDetailsDTO project = sourceDto.getProject(); String projectName = project != null ? project.getProjectName() : null; - checkPermissionOnProject(getJWT(servletRequest), SOURCE_CREATE, projectName); + organizationService.checkPermissionByProject(SOURCE_CREATE, projectName); if (sourceDto.getId() != null) { return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME, "idexists", "A new source cannot already have an ID")).build(); @@ -127,11 +127,10 @@ public ResponseEntity updateSource(@Valid @RequestBody SourceDTO sour if (sourceDto.getId() == null) { return createSource(sourceDto); } - RadarToken jwt = getJWT(servletRequest); MinimalProjectDetailsDTO project = sourceDto.getProject(); - String projectName = project != null ? project.getProjectName() : null; - checkPermissionOnProject(jwt, SOURCE_UPDATE, projectName); - Optional updatedSource = sourceService.updateSource(sourceDto, jwt); + var projectName = project != null ? project.getProjectName() : null; + organizationService.checkPermissionByProject(SOURCE_UPDATE, projectName); + Optional updatedSource = sourceService.updateSource(sourceDto); return wrapOrNotFound(updatedSource, HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, sourceDto.getSourceName())); } @@ -146,7 +145,7 @@ public ResponseEntity updateSource(@Valid @RequestBody SourceDTO sour public ResponseEntity> getAllSources( @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable) throws NotAuthorizedException { - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, SUBJECT_READ); + checkAuthorityAndPermission(token, SYS_ADMIN, SUBJECT_READ); log.debug("REST request to get all Sources"); Page page = sourceService.findAll(pageable); HttpHeaders headers = PaginationUtil @@ -166,18 +165,17 @@ public ResponseEntity> getAllSources( public ResponseEntity getSource(@PathVariable String sourceName) throws NotAuthorizedException { log.debug("REST request to get Source : {}", sourceName); - RadarToken jwt = getJWT(servletRequest); - checkPermission(jwt, SOURCE_READ); + checkPermission(token, SOURCE_READ); Optional sourceOpt = sourceService.findOneByName(sourceName); if (sourceOpt.isPresent()) { SourceDTO source = sourceOpt.get(); String projectName = source.getProject() != null ? source.getProject().getProjectName() : null; - checkPermissionOnSource(jwt, SOURCE_READ, projectName, source.getSubjectLogin(), - source.getSourceName()); + organizationService.checkPermissionBySubject(SOURCE_READ, projectName, + source.getSubjectLogin()); } - return wrapOrNotFound(sourceService.findOneByName(sourceName)); + return wrapOrNotFound(sourceOpt); } /** @@ -191,7 +189,7 @@ public ResponseEntity getSource(@PathVariable String sourceName) public ResponseEntity deleteSource(@PathVariable String sourceName) throws NotAuthorizedException { log.debug("REST request to delete Source : {}", sourceName); - RadarToken jwt = getJWT(servletRequest); + RadarToken jwt = token; checkPermission(jwt, SOURCE_DELETE); Optional sourceDtoOpt = sourceService.findOneByName(sourceName); if (sourceDtoOpt.isEmpty()) { @@ -201,8 +199,8 @@ public ResponseEntity deleteSource(@PathVariable String sourceName) String projectName = sourceDto.getProject() != null ? sourceDto.getProject().getProjectName() : null; - checkPermissionOnSource(jwt, SOURCE_DELETE, projectName, sourceDto.getSubjectLogin(), - sourceDto.getSourceName()); + organizationService.checkPermissionBySubject(SOURCE_READ, projectName, + sourceDto.getSubjectLogin()); if (sourceDto.getAssigned()) { return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME, diff --git a/src/main/java/org/radarbase/management/web/rest/SourceTypeResource.java b/src/main/java/org/radarbase/management/web/rest/SourceTypeResource.java index 83bbd5749..65f8ad303 100644 --- a/src/main/java/org/radarbase/management/web/rest/SourceTypeResource.java +++ b/src/main/java/org/radarbase/management/web/rest/SourceTypeResource.java @@ -1,28 +1,9 @@ package org.radarbase.management.web.rest; -import static org.radarbase.auth.authorization.Permission.SOURCETYPE_CREATE; -import static org.radarbase.auth.authorization.Permission.SOURCETYPE_DELETE; -import static org.radarbase.auth.authorization.Permission.SOURCETYPE_READ; -import static org.radarbase.auth.authorization.Permission.SOURCETYPE_UPDATE; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.management.security.SecurityUtils.getJWT; -import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; - -import java.net.URISyntaxException; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import com.codahale.metrics.annotation.Timed; -import io.github.jhipster.web.util.ResponseUtil; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.domain.SourceType; import org.radarbase.management.repository.SourceTypeRepository; import org.radarbase.management.service.ResourceUriService; @@ -51,6 +32,24 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import tech.jhipster.web.util.ResponseUtil; + +import javax.validation.Valid; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.radarbase.auth.authorization.Permission.SOURCETYPE_CREATE; +import static org.radarbase.auth.authorization.Permission.SOURCETYPE_DELETE; +import static org.radarbase.auth.authorization.Permission.SOURCETYPE_READ; +import static org.radarbase.auth.authorization.Permission.SOURCETYPE_UPDATE; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; +import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; /** * REST controller for managing SourceType. @@ -58,17 +57,16 @@ @RestController @RequestMapping("/api") public class SourceTypeResource { - private static final Logger log = LoggerFactory.getLogger(SourceTypeResource.class); @Autowired - private SourceTypeService sourceTypeService; + private RadarToken token; @Autowired - private SourceTypeRepository sourceTypeRepository; + private SourceTypeService sourceTypeService; @Autowired - private HttpServletRequest servletRequest; + private SourceTypeRepository sourceTypeRepository; /** * POST /source-types : Create a new sourceType. @@ -83,7 +81,7 @@ public class SourceTypeResource { public ResponseEntity createSourceType(@Valid @RequestBody SourceTypeDTO sourceTypeDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save SourceType : {}", sourceTypeDto); - checkPermission(getJWT(servletRequest), SOURCETYPE_CREATE); + checkPermission(token, SOURCETYPE_CREATE); if (sourceTypeDto.getId() != null) { return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(SOURCE_TYPE, "idexists", "A new sourceType cannot already have an ID")).build(); @@ -127,7 +125,7 @@ public ResponseEntity updateSourceType(@Valid @RequestBody if (sourceTypeDto.getId() == null) { return createSourceType(sourceTypeDto); } - checkPermission(getJWT(servletRequest), SOURCETYPE_UPDATE); + checkPermission(token, SOURCETYPE_UPDATE); SourceTypeDTO result = sourceTypeService.save(sourceTypeDto); return ResponseEntity.ok() .headers( @@ -146,7 +144,7 @@ public ResponseEntity updateSourceType(@Valid @RequestBody public ResponseEntity> getAllSourceTypes( @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCETYPE_READ); + checkPermission(token, SOURCETYPE_READ); Page page = sourceTypeService.findAll(pageable); HttpHeaders headers = PaginationUtil .generatePaginationHttpHeaders(page, "/api/source-types"); @@ -163,7 +161,7 @@ public ResponseEntity> getAllSourceTypes( @Timed public ResponseEntity> getSourceTypes(@PathVariable String producer) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCETYPE_READ); + checkPermission(token, SOURCETYPE_READ); return ResponseEntity.ok(sourceTypeService.findByProducer(producer)); } @@ -180,7 +178,7 @@ public ResponseEntity> getSourceTypes(@PathVariable String p @Timed public ResponseEntity> getSourceTypes(@PathVariable String producer, @PathVariable String model) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCETYPE_READ); + checkPermission(token, SOURCETYPE_READ); return ResponseEntity.ok(sourceTypeService.findByProducerAndModel(producer, model)); } @@ -198,7 +196,7 @@ public ResponseEntity> getSourceTypes(@PathVariable String p public ResponseEntity getSourceTypes(@PathVariable String producer, @PathVariable String model, @PathVariable String version) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCETYPE_READ); + checkPermission(token, SOURCETYPE_READ); return ResponseUtil.wrapOrNotFound(Optional.ofNullable( sourceTypeService.findByProducerAndModelAndVersion(producer, model, version))); } @@ -218,7 +216,7 @@ public ResponseEntity getSourceTypes(@PathVariable String produce public ResponseEntity deleteSourceType(@PathVariable String producer, @PathVariable String model, @PathVariable String version) throws NotAuthorizedException { - checkPermission(getJWT(servletRequest), SOURCETYPE_DELETE); + checkPermission(token, SOURCETYPE_DELETE); SourceTypeDTO sourceTypeDto = sourceTypeService .findByProducerAndModelAndVersion(producer, model, version); if (Objects.isNull(sourceTypeDto)) { diff --git a/src/main/java/org/radarbase/management/web/rest/SubjectResource.java b/src/main/java/org/radarbase/management/web/rest/SubjectResource.java index 53c0438f5..2f09cdfad 100644 --- a/src/main/java/org/radarbase/management/web/rest/SubjectResource.java +++ b/src/main/java/org/radarbase/management/web/rest/SubjectResource.java @@ -1,39 +1,9 @@ package org.radarbase.management.web.rest; -import static io.github.jhipster.web.util.ResponseUtil.wrapOrNotFound; -import static org.radarbase.auth.authorization.AuthoritiesConstants.INACTIVE_PARTICIPANT; -import static org.radarbase.auth.authorization.AuthoritiesConstants.PARTICIPANT; -import static org.radarbase.auth.authorization.Permission.SUBJECT_CREATE; -import static org.radarbase.auth.authorization.Permission.SUBJECT_DELETE; -import static org.radarbase.auth.authorization.Permission.SUBJECT_READ; -import static org.radarbase.auth.authorization.Permission.SUBJECT_UPDATE; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnProject; -import static org.radarbase.auth.authorization.RadarAuthorization.checkPermissionOnSubject; -import static org.radarbase.management.security.SecurityUtils.getJWT; -import static org.radarbase.management.web.rest.errors.EntityName.SOURCE; -import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; -import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; -import static org.radarbase.management.web.rest.errors.EntityName.PROJECT; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_ACTIVE_PARTICIPANT_PROJECT_NOT_FOUND; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SOURCE_TYPE_NOT_PROVIDED; -import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; - -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; -import javax.servlet.http.HttpServletRequest; - -import com.codahale.metrics.annotation.Timed; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.micrometer.core.annotation.Timed; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; import org.radarbase.auth.token.RadarToken; @@ -44,6 +14,7 @@ import org.radarbase.management.repository.ProjectRepository; import org.radarbase.management.repository.SubjectRepository; import org.radarbase.management.security.SecurityUtils; +import org.radarbase.management.service.OrganizationService; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.RevisionService; import org.radarbase.management.service.SourceService; @@ -53,8 +24,8 @@ import org.radarbase.management.service.dto.RevisionDTO; import org.radarbase.management.service.dto.SubjectDTO; import org.radarbase.management.service.mapper.SubjectMapper; +import org.radarbase.management.web.rest.criteria.SubjectCriteria; import org.radarbase.management.web.rest.errors.BadRequestException; -import org.radarbase.management.web.rest.errors.ErrorConstants; import org.radarbase.management.web.rest.errors.InvalidRequestException; import org.radarbase.management.web.rest.errors.NotFoundException; import org.radarbase.management.web.rest.util.HeaderUtil; @@ -66,7 +37,6 @@ import org.springframework.boot.actuate.audit.AuditEventRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -80,6 +50,33 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.radarbase.auth.authorization.Permission.SUBJECT_CREATE; +import static org.radarbase.auth.authorization.Permission.SUBJECT_DELETE; +import static org.radarbase.auth.authorization.Permission.SUBJECT_READ; +import static org.radarbase.auth.authorization.Permission.SUBJECT_UPDATE; +import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; +import static org.radarbase.auth.authorization.RoleAuthority.PARTICIPANT; +import static org.radarbase.management.web.rest.errors.EntityName.SOURCE; +import static org.radarbase.management.web.rest.errors.EntityName.SOURCE_TYPE; +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_ACTIVE_PARTICIPANT_PROJECT_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SOURCE_TYPE_NOT_PROVIDED; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_SUBJECT_NOT_FOUND; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; +import static tech.jhipster.web.util.ResponseUtil.wrapOrNotFound; + /** * REST controller for managing Subject. */ @@ -89,6 +86,9 @@ public class SubjectResource { private static final Logger log = LoggerFactory.getLogger(SubjectResource.class); + @Autowired + private RadarToken token; + @Autowired private SubjectService subjectService; @@ -104,9 +104,6 @@ public class SubjectResource { @Autowired private SourceTypeService sourceTypeService; - @Autowired - private HttpServletRequest servletRequest; - @Autowired private AuditEventRepository eventRepository; @@ -115,6 +112,8 @@ public class SubjectResource { @Autowired private SourceService sourceService; + @Autowired + private OrganizationService organizationService; /** * POST /subjects : Create a new subject. @@ -129,32 +128,23 @@ public class SubjectResource { public ResponseEntity createSubject(@RequestBody SubjectDTO subjectDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save Subject : {}", subjectDto); - if (subjectDto.getProject() == null || subjectDto.getProject().getId() == null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "projectrequired", - "A subject should be assigned to a project")).build(); - } - checkPermissionOnProject(getJWT(servletRequest), SUBJECT_CREATE, - subjectDto.getProject().getProjectName()); + + String projectName = getProjectName(subjectDto); + organizationService.checkPermissionByProject(SUBJECT_CREATE, projectName); if (subjectDto.getId() != null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "idexists", - "A new subject cannot already have an ID")).build(); + throw new BadRequestException("A new subject cannot already have an ID", + SUBJECT, "idexists"); } if (subjectDto.getLogin() == null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "loginrequired", - "A subject login is required")) - .build(); + throw new BadRequestException("A subject login is required", SUBJECT, "loginrequired"); } - if (subjectDto.getExternalId() != null && !subjectDto.getExternalId().isEmpty() - && subjectRepository.findOneByProjectNameAndExternalId(subjectDto.getProject() - .getProjectName(), subjectDto.getExternalId()).isPresent()) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "subjectExists", - "A subject with given project-id and external-id already exists")) - .build(); + if (subjectDto.getExternalId() != null + && !subjectDto.getExternalId().isEmpty() + && subjectRepository.findOneByProjectNameAndExternalId( + projectName, subjectDto.getExternalId()).isPresent()) { + throw new BadRequestException("A subject with given project-id and" + + "external-id already exists", SUBJECT, "subjectExists"); } SubjectDTO result = subjectService.createSubject(subjectDto); @@ -163,6 +153,18 @@ public ResponseEntity createSubject(@RequestBody SubjectDTO subjectD .body(result); } + private String getProjectName(SubjectDTO subjectDto) { + if ( + subjectDto.getProject() == null + || subjectDto.getProject().getId() == null + || subjectDto.getProject().getProjectName() == null + ) { + throw new BadRequestException("A subject should be assigned to a project", SUBJECT, + "projectrequired"); + } + return subjectDto.getProject().getProjectName(); + } + /** * PUT /subjects : Updates an existing subject. * @@ -177,16 +179,12 @@ public ResponseEntity createSubject(@RequestBody SubjectDTO subjectD public ResponseEntity updateSubject(@RequestBody SubjectDTO subjectDto) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to update Subject : {}", subjectDto); - if (subjectDto.getProject() == null || subjectDto.getProject().getId() == null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "projectrequired", - "A subject should be assigned to a project")).body(null); - } + String projectName = getProjectName(subjectDto); + organizationService.checkPermissionBySubject(SUBJECT_UPDATE, + projectName, subjectDto.getLogin()); if (subjectDto.getId() == null) { return createSubject(subjectDto); } - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, - subjectDto.getProject().getProjectName(), subjectDto.getLogin()); SubjectDTO result = subjectService.updateSubject(subjectDto); return ResponseEntity.ok() .headers(HeaderUtil.createEntityUpdateAlert(SUBJECT, subjectDto.getLogin())) @@ -201,26 +199,19 @@ public ResponseEntity updateSubject(@RequestBody SubjectDTO subjectD * @return the ResponseEntity with status 200 (OK) and with body the updated subjectDto, or with * status 400 (Bad Request) if the subjectDto is not valid, or with status 500 (Internal * Server Error) if the subjectDto couldnt be updated - * @throws URISyntaxException if the Location URI syntax is incorrect */ @PutMapping("/subjects/discontinue") @Timed public ResponseEntity discontinueSubject(@RequestBody SubjectDTO subjectDto) - throws URISyntaxException, NotAuthorizedException { + throws NotAuthorizedException { log.debug("REST request to update Subject : {}", subjectDto); if (subjectDto.getId() == null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "subjectNotAvailable", "No subject found")) - .body(null); + throw new BadRequestException("No subject found", SUBJECT, "subjectNotAvailable"); } - if (subjectDto.getProject() == null || subjectDto.getProject().getId() == null) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(SUBJECT, "projectrequired", - "A subject should be assigned to a project")).body(null); - } - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, - subjectDto.getProject().getProjectName(), subjectDto.getLogin()); + String projectName = getProjectName(subjectDto); + organizationService.checkPermissionBySubject(SUBJECT_UPDATE, + projectName, subjectDto.getLogin()); // In principle this is already captured by the PostUpdate event listener, adding this // event just makes it more clear a subject was discontinued. @@ -241,25 +232,21 @@ public ResponseEntity discontinueSubject(@RequestBody SubjectDTO sub @GetMapping("/subjects") @Timed public ResponseEntity> getAllSubjects( - @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable, - @RequestParam(value = "projectName", required = false) String projectName, - @RequestParam(value = "externalId", required = false) String externalId, - @RequestParam(value = "withInactiveParticipants", required = false) - Boolean withInactiveParticipantsParam) - throws NotAuthorizedException { - RadarToken jwt = getJWT(servletRequest); - checkPermissionOnProject(jwt, SUBJECT_READ, projectName); - if (!jwt.isClientCredentials() && jwt.hasAuthority(PARTICIPANT)) { + @Valid SubjectCriteria subjectCriteria + ) throws NotAuthorizedException { + if (!token.isClientCredentials() && token.hasAuthority(PARTICIPANT)) { throw new NotAuthorizedException("Cannot list subjects as a participant."); } + String projectName = subjectCriteria.getProjectName(); + organizationService.checkPermissionByProject(SUBJECT_READ, projectName); + String externalId = subjectCriteria.getExternalId(); log.debug("ProjectName {} and external {}", projectName, externalId); // if not specified do not include inactive patients - boolean withInactive = withInactiveParticipantsParam != null - && withInactiveParticipantsParam; - - List authoritiesToInclude = withInactive ? Arrays.asList(PARTICIPANT, - INACTIVE_PARTICIPANT) : Collections.singletonList(PARTICIPANT); + List authoritiesToInclude = subjectCriteria.getAuthority().stream() + .filter(Objects::nonNull) + .map(Enum::name) + .collect(Collectors.toList()); if (projectName != null && externalId != null) { Optional> subject = subjectRepository @@ -269,24 +256,18 @@ public ResponseEntity> getAllSubjects( subjectMapper.subjectToSubjectReducedProjectDTO(s))); return wrapOrNotFound(subject); } else if (projectName == null && externalId != null) { - List subjects = subjectRepository - .findAllByExternalIdAndAuthoritiesIn(externalId, authoritiesToInclude); - List dto = subjectMapper.subjectsToSubjectReducedProjectDTOs(subjects); - return ResponseEntity.ok(dto); - } else if (projectName != null) { - Page page = subjectRepository - .findAllByProjectNameAndAuthoritiesIn(pageable, projectName, - authoritiesToInclude) - .map(subjectMapper::subjectToSubjectWithoutProjectDTO); + Page page = subjectService.findAll(subjectCriteria) + .map(s -> subjectMapper.subjectToSubjectWithoutProjectDTO(s)); - HttpHeaders headers = PaginationUtil - .generatePaginationHttpHeaders(page, "/api/subjects"); + HttpHeaders headers = PaginationUtil.generateSubjectPaginationHttpHeaders( + page, "/api/subjects", subjectCriteria); return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); } else { - log.debug("REST request to get all Subjects"); - Page page = subjectService.findAll(pageable); - HttpHeaders headers = PaginationUtil - .generatePaginationHttpHeaders(page, "/api/subjects"); + Page page = subjectService.findAll(subjectCriteria) + .map(subjectMapper::subjectToSubjectWithoutProjectDTO); + + HttpHeaders headers = PaginationUtil.generateSubjectPaginationHttpHeaders( + page, "/api/subjects", subjectCriteria); return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); } } @@ -303,14 +284,9 @@ public ResponseEntity> getAllSubjects( public ResponseEntity getSubject(@PathVariable String login) throws NotAuthorizedException { log.debug("REST request to get Subject : {}", login); + checkPermission(token, SUBJECT_READ); Subject subject = subjectService.findOneByLogin(login); - Project project = subject.getActiveProject() - .flatMap(p -> projectRepository.findOneWithEagerRelationships(p.getId())) - .orElse(null); - - String projectName = project != null ? project.getProjectName() : null; - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_READ, projectName, - subject.getUser().getLogin()); + subjectService.checkSubjectProject(SUBJECT_READ, subject, false); SubjectDTO subjectDto = subjectMapper.subjectToSubjectDTO(subject); @@ -327,19 +303,14 @@ public ResponseEntity getSubject(@PathVariable String login) @GetMapping("/subjects/{login:" + Constants.ENTITY_ID_REGEX + "}/revisions") @Timed public ResponseEntity> getSubjectRevisions( - @ApiParam Pageable pageable, @PathVariable String login) throws NotAuthorizedException { + @Parameter Pageable pageable, + @PathVariable String login) throws NotAuthorizedException { + checkPermission(token, SUBJECT_READ); + log.debug("REST request to get revisions for Subject : {}", login); Subject subject = subjectService.findOneByLogin(login); - String project = subject.getActiveProject() - .flatMap(p -> projectRepository.findById(p.getId())) - .map(Project::getProjectName) - .orElseThrow(() -> new NotFoundException( - "Requested subject does not have an active project", - PROJECT, - ERR_ACTIVE_PARTICIPANT_PROJECT_NOT_FOUND)); - - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_READ, project, - login); + subjectService.checkSubjectProject(SUBJECT_READ, subject, false); + Page page = revisionService.getRevisionsForEntity(pageable, subject); return ResponseEntity.ok() @@ -361,10 +332,10 @@ public ResponseEntity> getSubjectRevisions( @Timed public ResponseEntity getSubjectRevision(@PathVariable String login, @PathVariable Integer revisionNb) throws NotAuthorizedException { + checkPermission(token, SUBJECT_READ); + log.debug("REST request to get Subject : {}, for revisionNb: {}", login, revisionNb); SubjectDTO subjectDto = subjectService.findRevision(login, revisionNb); - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_READ, subjectDto.getProject() - .getProjectName(), subjectDto.getLogin()); return ResponseEntity.ok(subjectDto); } @@ -379,10 +350,10 @@ public ResponseEntity getSubjectRevision(@PathVariable String login, public ResponseEntity deleteSubject(@PathVariable String login) throws NotAuthorizedException { log.debug("REST request to delete Subject : {}", login); + checkPermission(token, SUBJECT_DELETE); Subject subject = subjectService.findOneByLogin(login); - String projectName = subject.getActiveProject().map(Project::getProjectName).orElse(null); - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_DELETE, projectName, login); + subjectService.checkSubjectProject(SUBJECT_DELETE, subject, false); subjectService.deleteSubject(login); return ResponseEntity.ok() .headers(HeaderUtil.createEntityDeletionAlert(SUBJECT, login)).build(); @@ -406,18 +377,20 @@ public ResponseEntity deleteSubject(@PathVariable String login) */ @PostMapping("/subjects/{login:" + Constants.ENTITY_ID_REGEX + "}/sources") @ApiResponses({ - @ApiResponse(code = 200, message = "An existing source was assigned"), - @ApiResponse(code = 201, message = "A new source was created and assigned"), - @ApiResponse(code = 400, message = "You must supply either a Source Type ID, or the " - + "combination of (sourceTypeProducer, sourceTypeModel, catalogVersion)"), - @ApiResponse(code = 404, message = "Either the subject or the source type was not " - + "found.") + @ApiResponse(responseCode = "200", description = "An existing source was assigned"), + @ApiResponse(responseCode = "201", description = "A new source was created and" + + " assigned"), + @ApiResponse(responseCode = "400", description = "You must supply either a" + + " Source Type ID, or the combination of (sourceTypeProducer, sourceTypeModel," + + " catalogVersion)"), + @ApiResponse(responseCode = "404", description = "Either the subject or the source type" + + " was not found.") }) @Timed public ResponseEntity assignSources(@PathVariable String login, @RequestBody MinimalSourceDetailsDTO sourceDto) throws URISyntaxException, NotAuthorizedException { - + checkPermission(token, SUBJECT_UPDATE); // find out source type id of supplied source Long sourceTypeId = sourceDto.getSourceTypeId(); if (sourceTypeId == null) { @@ -426,13 +399,13 @@ public ResponseEntity assignSources(@PathVariable Strin || sourceDto.getSourceTypeModel() == null || sourceDto.getSourceTypeCatalogVersion() == null) { throw new BadRequestException("Producer or model or version value for the " - + "source-type is null" , SOURCE_TYPE, ERR_VALIDATION); + + "source-type is null" , SOURCE_TYPE, ERR_VALIDATION); } sourceTypeId = sourceTypeService .findByProducerAndModelAndVersion( - sourceDto.getSourceTypeProducer(), - sourceDto.getSourceTypeModel(), - sourceDto.getSourceTypeCatalogVersion()).getId(); + sourceDto.getSourceTypeProducer(), + sourceDto.getSourceTypeModel(), + sourceDto.getSourceTypeCatalogVersion()).getId(); // also update the sourceDto, since we pass it on to SubjectService later sourceDto.setSourceTypeId(sourceTypeId); } @@ -441,27 +414,25 @@ public ResponseEntity assignSources(@PathVariable Strin Subject sub = subjectService.findOneByLogin(login); // find the actively assigned project for this subject - - Project currentProject = sub.getActiveProject() + Project currentProject = subjectService.checkSubjectProject(SUBJECT_UPDATE, sub, true) .orElseThrow(() -> - new InvalidRequestException("Requested subject does not have an active project", - SUBJECT, ERR_ACTIVE_PARTICIPANT_PROJECT_NOT_FOUND)); + new InvalidRequestException( + "Requested subject does not have an active project", + SUBJECT, ERR_ACTIVE_PARTICIPANT_PROJECT_NOT_FOUND)); // find whether the relevant source-type is available in the subject's project SourceType sourceType = projectRepository .findSourceTypeByProjectIdAndSourceTypeId(currentProject.getId(), sourceTypeId) .orElseThrow(() -> new BadRequestException("No valid source-type found for project." - + " You must provide either valid source-type id or producer, model, version of a " - + "source-type that is assigned to project", SUBJECT, ERR_SOURCE_TYPE_NOT_PROVIDED) - ); - - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, currentProject - .getProjectName(), sub.getUser().getLogin()); + + " You must provide either valid source-type id or producer, model," + + " version of a source-type that is assigned to project", + SUBJECT, ERR_SOURCE_TYPE_NOT_PROVIDED) + ); // check if any of id, sourceID, sourceName were non-null boolean existing = Stream.of(sourceDto.getId(), sourceDto.getSourceName(), - sourceDto.getSourceId()) - .map(Objects::nonNull).reduce(false, (r1, r2) -> r1 || r2); + sourceDto.getSourceId()) + .anyMatch(Objects::nonNull); // handle the source registration MinimalSourceDetailsDTO sourceRegistered = subjectService @@ -469,15 +440,17 @@ public ResponseEntity assignSources(@PathVariable Strin // Return the correct response type, either created if a new source was created, or ok if // an existing source was provided. If an existing source was given but not found, the - // assignOrUpdateSource would throw an error and we would not reach this point. + // assignOrUpdateSource would throw an error, and we would not reach this point. if (!existing) { return ResponseEntity.created(ResourceUriService.getUri(sourceRegistered)) .headers(HeaderUtil.createEntityCreationAlert(SOURCE, - sourceRegistered.getSourceName())) + sourceRegistered.getSourceName())) .body(sourceRegistered); } else { - return ResponseEntity.ok().headers(HeaderUtil.createEntityUpdateAlert(SOURCE, - sourceRegistered.getSourceName())).body(sourceRegistered); + return ResponseEntity.ok() + .headers(HeaderUtil.createEntityUpdateAlert(SOURCE, + sourceRegistered.getSourceName())) + .body(sourceRegistered); } } @@ -493,17 +466,14 @@ public ResponseEntity> getSubjectSources( @PathVariable String login, @RequestParam(value = "withInactiveSources", required = false) Boolean withInactiveSourcesParam) throws NotAuthorizedException { + checkPermission(token, SUBJECT_READ); boolean withInactiveSources = withInactiveSourcesParam != null && withInactiveSourcesParam; // check the subject id Subject subject = subjectRepository.findOneWithEagerBySubjectLogin(login) .orElseThrow(NoSuchElementException::new); - String projectName = subject.getActiveProject() - .map(Project::getProjectName) - .orElse(null); - - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_READ, projectName, login); + subjectService.checkSubjectProject(SUBJECT_READ, subject, false); if (withInactiveSources) { return ResponseEntity.ok(subjectService.findSubjectSourcesFromRevisions(subject)); @@ -533,28 +503,24 @@ public ResponseEntity> getSubjectSources( @PostMapping("/subjects/{login:" + Constants.ENTITY_ID_REGEX + "}/sources/{sourceName:" + Constants.ENTITY_ID_REGEX + "}") @ApiResponses({ - @ApiResponse(code = 200, message = "An existing source was updated"), - @ApiResponse(code = 400, message = "You must supply existing sourceId)"), - @ApiResponse(code = 404, message = "Either the subject or the source was not found.") + @ApiResponse(responseCode = "200", description = "An existing source was updated"), + @ApiResponse(responseCode = "400", description = "You must supply existing sourceId)"), + @ApiResponse(responseCode = "404", description = "Either the subject or the source was" + + " not found.") }) @Timed public ResponseEntity updateSubjectSource(@PathVariable String login, @PathVariable String sourceName, @RequestBody Map attributes) - throws NotFoundException, NotAuthorizedException, - URISyntaxException { + throws NotFoundException, NotAuthorizedException { + checkPermission(token, SUBJECT_UPDATE); + // check the subject id - Optional subjectOptional = subjectRepository.findOneWithEagerBySubjectLogin(login); - if (!subjectOptional.isPresent()) { - throw new NotFoundException("Subject ID not found", SUBJECT, ErrorConstants - .ERR_SUBJECT_NOT_FOUND, Collections.singletonMap("subjectLogin", login)); - } - // check the permission to update source - Subject subject = subjectOptional.get(); + Subject subject = subjectRepository.findOneWithEagerBySubjectLogin(login) + .orElseThrow(() -> new NotFoundException("Subject ID not found", + SUBJECT, ERR_SUBJECT_NOT_FOUND, + Collections.singletonMap("subjectLogin", login))); - String projectName = subject.getActiveProject() - .map(Project::getProjectName) - .orElse(null); - checkPermissionOnSubject(getJWT(servletRequest), SUBJECT_UPDATE, projectName, login); + subjectService.checkSubjectProject(SUBJECT_UPDATE, subject, false); // find source under subject Source source = subject.getSources().stream() @@ -565,7 +531,7 @@ public ResponseEntity updateSubjectSource(@PathVariable errorParams.put("subjectLogin", login); errorParams.put("sourceName", sourceName); return new NotFoundException("Source not found under assigned sources of " - + "subject", SUBJECT, ErrorConstants.ERR_SUBJECT_NOT_FOUND, + + "subject", SUBJECT, ERR_SUBJECT_NOT_FOUND, errorParams); }); diff --git a/src/main/java/org/radarbase/management/web/rest/TokenKeyEndpoint.java b/src/main/java/org/radarbase/management/web/rest/TokenKeyEndpoint.java index 9d13f3f51..605034642 100644 --- a/src/main/java/org/radarbase/management/web/rest/TokenKeyEndpoint.java +++ b/src/main/java/org/radarbase/management/web/rest/TokenKeyEndpoint.java @@ -1,6 +1,6 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.security.jwk.JavaWebKeySet; import org.radarbase.management.security.jwt.ManagementPortalOauthKeyStoreHandler; import org.slf4j.Logger; diff --git a/src/main/java/org/radarbase/management/web/rest/UserResource.java b/src/main/java/org/radarbase/management/web/rest/UserResource.java index cabf9754a..3efcec4b5 100644 --- a/src/main/java/org/radarbase/management/web/rest/UserResource.java +++ b/src/main/java/org/radarbase/management/web/rest/UserResource.java @@ -1,9 +1,9 @@ package org.radarbase.management.web.rest; -import com.codahale.metrics.annotation.Timed; -import io.github.jhipster.web.util.ResponseUtil; +import io.micrometer.core.annotation.Timed; import org.radarbase.auth.config.Constants; import org.radarbase.auth.exception.NotAuthorizedException; +import org.radarbase.auth.token.RadarToken; import org.radarbase.management.config.ManagementPortalProperties; import org.radarbase.management.domain.Subject; import org.radarbase.management.domain.User; @@ -13,8 +13,9 @@ import org.radarbase.management.service.MailService; import org.radarbase.management.service.ResourceUriService; import org.radarbase.management.service.UserService; -import org.radarbase.management.service.dto.ProjectDTO; +import org.radarbase.management.service.dto.RoleDTO; import org.radarbase.management.service.dto.UserDTO; +import org.radarbase.management.web.rest.errors.BadRequestException; import org.radarbase.management.web.rest.errors.InvalidRequestException; import org.radarbase.management.web.rest.util.HeaderUtil; import org.radarbase.management.web.rest.util.PaginationUtil; @@ -34,23 +35,24 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import tech.jhipster.web.util.ResponseUtil; -import javax.servlet.http.HttpServletRequest; import java.net.URISyntaxException; import java.util.List; import java.util.Locale; import java.util.Optional; +import java.util.Set; -import static org.radarbase.auth.authorization.AuthoritiesConstants.SYS_ADMIN; -import static org.radarbase.auth.authorization.Permission.PROJECT_READ; +import static org.radarbase.auth.authorization.Permission.ROLE_READ; +import static org.radarbase.auth.authorization.Permission.ROLE_UPDATE; import static org.radarbase.auth.authorization.Permission.USER_CREATE; import static org.radarbase.auth.authorization.Permission.USER_DELETE; import static org.radarbase.auth.authorization.Permission.USER_READ; import static org.radarbase.auth.authorization.Permission.USER_UPDATE; -import static org.radarbase.auth.authorization.RadarAuthorization.checkAuthorityAndPermission; import static org.radarbase.auth.authorization.RadarAuthorization.checkPermission; -import static org.radarbase.management.security.SecurityUtils.getJWT; +import static org.radarbase.auth.authorization.RoleAuthority.SYS_ADMIN; import static org.radarbase.management.web.rest.errors.EntityName.USER; /** @@ -97,7 +99,7 @@ public class UserResource { private SubjectRepository subjectRepository; @Autowired - private HttpServletRequest servletRequest; + private RadarToken token; @Autowired private ManagementPortalProperties managementPortalProperties; @@ -114,17 +116,17 @@ public class UserResource { */ @PostMapping("/users") @Timed - public ResponseEntity createUser(@RequestBody ManagedUserVM managedUserVm) + public ResponseEntity createUser(@RequestBody ManagedUserVM managedUserVm) throws URISyntaxException, NotAuthorizedException { log.debug("REST request to save User : {}", managedUserVm); - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, USER_CREATE); + checkPermission(token, USER_CREATE); if (managedUserVm.getId() != null) { return ResponseEntity.badRequest() .headers(HeaderUtil.createFailureAlert(USER, "idexists", "A new user cannot already have an ID")) .body(null); // Lowercase the user login before comparing with database - } else if (userRepository.findOneByLogin(managedUserVm.getLogin().toLowerCase(Locale.US)) + } else if (userRepository.findOneByLogin(managedUserVm.getLogin().toLowerCase(Locale.ROOT)) .isPresent()) { return ResponseEntity.badRequest() .headers(HeaderUtil @@ -137,11 +139,6 @@ public ResponseEntity createUser(@RequestBody ManagedUserVM managedUserVm) .createFailureAlert(USER, "emailexists", "Email already in use")) .body(null); - } else if (managedUserVm.getRoles() == null || managedUserVm.getRoles().isEmpty()) { - return ResponseEntity.badRequest() - .headers(HeaderUtil.createFailureAlert(USER, "rolesRequired", - "One or more roles are required")) - .body(null); } else { User newUser = userService.createUser(managedUserVm); mailService.sendCreationEmail(newUser, managementPortalProperties.getCommon() @@ -165,26 +162,17 @@ public ResponseEntity createUser(@RequestBody ManagedUserVM managedUserVm) public ResponseEntity updateUser(@RequestBody ManagedUserVM managedUserVm) throws NotAuthorizedException { log.debug("REST request to update User : {}", managedUserVm); - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, USER_UPDATE); + checkPermission(token, USER_UPDATE); Optional existingUser = userRepository.findOneByEmail(managedUserVm.getEmail()); if (existingUser.isPresent() && (!existingUser.get().getId() .equals(managedUserVm.getId()))) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(USER, "emailexists", "Email already in use")) - .body(null); + throw new BadRequestException("Email already in use", USER, "emailexists"); } existingUser = userRepository.findOneByLogin(managedUserVm.getLogin() .toLowerCase(Locale.US)); if (existingUser.isPresent() && (!existingUser.get().getId() .equals(managedUserVm.getId()))) { - return ResponseEntity.badRequest().headers(HeaderUtil - .createFailureAlert(USER, "userexists", "Login already in use")) - .body(null); - } - if (managedUserVm.getRoles() == null || managedUserVm.getRoles().isEmpty()) { - return ResponseEntity.badRequest() - .headers(HeaderUtil.createEntityUpdateAlert(USER, "rolesRequired")) - .body(null); + throw new BadRequestException("Login already in use", USER, "emailexists"); } Optional subject = subjectRepository @@ -196,7 +184,9 @@ public ResponseEntity updateUser(@RequestBody ManagedUserVM managedUser } - Optional updatedUser = userService.updateUser(managedUserVm); + Optional updatedUser = userService.updateUser( + managedUserVm, + token.hasAuthority(SYS_ADMIN)); return ResponseUtil.wrapOrNotFound(updatedUser, HeaderUtil.createAlert("userManagement.updated", managedUserVm.getLogin())); @@ -217,11 +207,12 @@ public ResponseEntity updateUser(@RequestBody ManagedUserVM managedUser @Timed public ResponseEntity> getUsers( @PageableDefault(page = 0, size = Integer.MAX_VALUE) Pageable pageable, - UserFilter userFilter) + UserFilter userFilter, + @RequestParam(defaultValue = "true") boolean includeProvenance) throws NotAuthorizedException { - checkAuthorityAndPermission(getJWT(servletRequest), SYS_ADMIN, USER_READ); + checkPermission(token, USER_READ); - Page page = userService.findUsers(userFilter, pageable); + Page page = userService.findUsers(userFilter, pageable, includeProvenance); return new ResponseEntity<>(page.getContent(), PaginationUtil.generatePaginationHttpHeaders(page, "/api/users"), HttpStatus.OK); @@ -239,25 +230,11 @@ public ResponseEntity> getUsers( public ResponseEntity getUser(@PathVariable String login) throws NotAuthorizedException { log.debug("REST request to get User : {}", login); - checkPermission(getJWT(servletRequest), USER_READ); + checkPermission(token, USER_READ); return ResponseUtil.wrapOrNotFound( userService.getUserWithAuthoritiesByLogin(login)); } - /** - * Returns all project if the user is s `SYS_ADMIN`. Otherwise projects that are assigned to a - * user using roles. - */ - @GetMapping("/users/{login:" + Constants.ENTITY_ID_REGEX + "}/projects") - @Timed - public List getUserProjects(@PathVariable String login) - throws NotAuthorizedException { - log.debug("REST request to get User's project : {}", login); - checkPermission(getJWT(servletRequest), USER_READ); - checkPermission(getJWT(servletRequest), PROJECT_READ); - return userService.getProjectsAssignedToUser(login); - } - /** * DELETE /users/:login : delete the "login" User. * @@ -269,9 +246,41 @@ public List getUserProjects(@PathVariable String login) public ResponseEntity deleteUser(@PathVariable String login) throws NotAuthorizedException { log.debug("REST request to delete User: {}", login); - checkPermission(getJWT(servletRequest), USER_DELETE); + checkPermission(token, USER_DELETE); userService.deleteUser(login); return ResponseEntity.ok().headers(HeaderUtil.createAlert("userManagement.deleted", login)) .build(); } + + /** + * Get /users/:login/roles : get the "login" User roles. + * + * @param login the login of the user to get roles from + * @return the ResponseEntity with status 200 (OK) + */ + @GetMapping("/users/{login:" + Constants.ENTITY_ID_REGEX + "}/roles") + @Timed + public ResponseEntity> getUserRoles(@PathVariable String login) + throws NotAuthorizedException { + log.debug("REST request to read User roles: {}", login); + checkPermission(token, ROLE_READ); + return ResponseUtil.wrapOrNotFound(userService.getUserWithAuthoritiesByLogin(login) + .map(UserDTO::getRoles)); + } + + /** + * PUT /users/:login/roles : update the "login" User roles. + * + * @param login the login of the user to get roles from + * @return the ResponseEntity with status 200 (OK) + */ + @PutMapping("/users/{login:" + Constants.ENTITY_ID_REGEX + "}/roles") + @Timed + public ResponseEntity putUserRoles(@PathVariable String login, + @RequestBody Set roleDtos) throws NotAuthorizedException { + log.debug("REST request to update User roles: {} to {}", login, roleDtos); + checkPermission(token, ROLE_UPDATE); + userService.updateRoles(login, roleDtos); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/CriteriaRange.java b/src/main/java/org/radarbase/management/web/rest/criteria/CriteriaRange.java new file mode 100644 index 000000000..08bc8049a --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/CriteriaRange.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +public class CriteriaRange> { + private T from = null; + private T to = null; + private T is = null; + + public T getFrom() { + return getIs() == null ? from : null; + } + + public void setFrom(T from) { + this.from = from; + } + + public T getTo() { + return getIs() == null ? to : null; + } + + public void setTo(T to) { + this.to = to; + } + + public void setIs(T is) { + this.is = is; + } + + /** Whether the criteria is equal to this value. */ + public T getIs() { + if (is != null) { + return is; + } else if (from != null && from.equals(to)) { + return from; + } else { + return null; + } + } + + /** + * Whether the criteria range contains any values at all. + */ + public boolean isEmpty() { + return from == null && to == null && is == null; + } + + /** + * Validate this criteria range whether the from and to ranges are in order. + */ + public void validate() { + if (is == null && from != null && to != null && from.compareTo(to) > 0) { + throw new IllegalArgumentException( + "CriteriaRange must have a from range that is smaller then the to range."); + } + } + + @Override + public String toString() { + return "CriteriaRange{" + "from=" + getFrom() + + ", to=" + getTo() + + ", is=" + getIs() + + '}'; + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/LocalDateCriteriaRange.java b/src/main/java/org/radarbase/management/web/rest/criteria/LocalDateCriteriaRange.java new file mode 100644 index 000000000..ca032efef --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/LocalDateCriteriaRange.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +import java.time.LocalDate; + +public class LocalDateCriteriaRange extends CriteriaRange { +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/SubjectAuthority.java b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectAuthority.java new file mode 100644 index 000000000..964674766 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectAuthority.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +public enum SubjectAuthority { + ROLE_PARTICIPANT, + ROLE_INACTIVE_PARTICIPANT; +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteria.java b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteria.java new file mode 100644 index 000000000..9fbd838b6 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteria.java @@ -0,0 +1,239 @@ +package org.radarbase.management.web.rest.criteria; + +import org.radarbase.management.web.rest.errors.BadRequestException; +import org.springframework.data.annotation.Transient; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.radarbase.management.web.rest.errors.EntityName.SUBJECT; +import static org.radarbase.management.web.rest.errors.ErrorConstants.ERR_VALIDATION; + +public class SubjectCriteria { + private List authority = List.of(SubjectAuthority.ROLE_PARTICIPANT); + private LocalDateCriteriaRange dateOfBirth = null; + private ZonedDateTimeCriteriaRange enrollmentDate = null; + private Long groupId = null; + private String humanReadableIdentifier = null; + private SubjectCriteriaLast last = null; + @Min(0) + private int page = 0; + @Min(1) + private int size = 20; + private List sort; + private String personName = null; + private String projectName = null; + private String externalId = null; + private String login = null; + + @Transient + private List parsedSort = null; + + public List getAuthority() { + return authority; + } + + public void setAuthority(List authority) { + this.authority = authority; + } + + public CriteriaRange getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(LocalDateCriteriaRange dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public CriteriaRange getEnrollmentDate() { + return enrollmentDate; + } + + public void setEnrollmentDate(ZonedDateTimeCriteriaRange enrollmentDate) { + this.enrollmentDate = enrollmentDate; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public String getHumanReadableIdentifier() { + return humanReadableIdentifier; + } + + public void setHumanReadableIdentifier(String humanReadableIdentifier) { + this.humanReadableIdentifier = humanReadableIdentifier; + } + + public SubjectCriteriaLast getLast() { + return last; + } + + public void setLast(SubjectCriteriaLast last) { + this.last = last; + } + + /** Get the criteria paging settings, excluding sorting. */ + @NotNull + public Pageable getPageable() { + return PageRequest.of(page, size); + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public String getPersonName() { + return personName; + } + + public void setPersonName(String personName) { + this.personName = personName; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public List getSort() { + return sort; + } + + /** Parse the sort criteria. */ + public List getParsedSort() { + if (this.parsedSort == null) { + List flatSort = sort != null + ? sort.stream() + .flatMap(s -> Arrays.stream(s.split(","))) + .collect(Collectors.toList()) + : List.of(); + + List parsedSort = new ArrayList<>(flatSort.size()); + + boolean hasDirection = true; + for (String part : flatSort) { + if (!hasDirection) { + Optional direction = Sort.Direction.fromOptionalString( + part); + if (direction.isPresent()) { + SubjectSortOrder previous = parsedSort.get(parsedSort.size() - 1); + previous.setDirection(direction.get()); + hasDirection = true; + continue; + } + } + SubjectSortOrder order = new SubjectSortOrder(getSubjectSortBy(part)); + parsedSort.add(order); + hasDirection = false; + } + + optimizeSortList(parsedSort); + this.parsedSort = Collections.unmodifiableList(parsedSort); + } + return this.parsedSort; + } + + /** + * Remove duplication and redundancy from sort list. + * @param sort modifiable ordered sort collection. + */ + private static void optimizeSortList(Collection sort) { + Set seenSortBy = EnumSet.noneOf(SubjectSortBy.class); + boolean hasUnique = false; + Iterator iterator = sort.iterator(); + while (iterator.hasNext()) { + SubjectSortOrder order = iterator.next(); + if (hasUnique || !seenSortBy.add(order.getSortBy())) { + iterator.remove(); + } + if (order.getSortBy().isUnique()) { + hasUnique = true; + } + } + if (!hasUnique) { + sort.add(new SubjectSortOrder(SubjectSortBy.ID)); + } + } + + private static SubjectSortBy getSubjectSortBy(String param) { + return Arrays.stream(SubjectSortBy.values()) + .filter(s -> s.getQueryParam().equalsIgnoreCase(param)) + .findAny() + .orElseThrow(() -> new BadRequestException( + "Cannot convert sort parameter " + param + + " to subject property", SUBJECT, ERR_VALIDATION)); + } + + public void setSort(List sort) { + this.parsedSort = null; + this.sort = sort; + } + + @Override + public String toString() { + return "SubjectCriteria{" + "authority=" + authority + + ", dateOfBirth=" + dateOfBirth + + ", enrollmentDate=" + enrollmentDate + + ", groupId='" + groupId + '\'' + + ", humanReadableIdentifier='" + humanReadableIdentifier + '\'' + + ", last=" + last + + ", page=" + page + + ", sort=" + sort + + ", personName='" + personName + '\'' + + ", projectName='" + projectName + '\'' + + ", externalId='" + externalId + '\'' + + ", login='" + login + '\'' + + '}'; + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteriaLast.java b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteriaLast.java new file mode 100644 index 000000000..fde0bd62e --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectCriteriaLast.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +public class SubjectCriteriaLast { + private String id = null; + private String externalId = null; + private String login = null; + private SubjectAuthority authority = null; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public SubjectAuthority getAuthority() { + return authority; + } + + public void setAuthority(SubjectAuthority authority) { + this.authority = authority; + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortBy.java b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortBy.java new file mode 100644 index 000000000..0294239b3 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortBy.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +public enum SubjectSortBy { + ID("id", true), + EXTERNAL_ID("externalId", false), + USER_LOGIN("login", true); + + private final String queryParam; + private final boolean isUnique; + + SubjectSortBy(String queryParam, boolean isUnique) { + this.queryParam = queryParam; + this.isUnique = isUnique; + } + + /** Query parameter name. */ + public String getQueryParam() { + return this.queryParam; + } + + /** Whether this property is unique across all subjects. */ + public boolean isUnique() { + return isUnique; + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortOrder.java b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortOrder.java new file mode 100644 index 000000000..47f8e368a --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/SubjectSortOrder.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +import org.springframework.data.domain.Sort; + +import javax.validation.constraints.NotNull; +import java.util.Objects; + +public class SubjectSortOrder { + private Sort.Direction direction; + private final SubjectSortBy sortBy; + + public SubjectSortOrder(@NotNull SubjectSortBy sortBy, + @NotNull Sort.Direction direction) { + this.direction = direction; + this.sortBy = sortBy; + } + + public SubjectSortOrder(SubjectSortBy sortBy) { + this(sortBy, Sort.Direction.ASC); + } + + public void setDirection(@NotNull Sort.Direction direction) { + this.direction = direction; + } + + @NotNull + public Sort.Direction getDirection() { + return direction; + } + + @NotNull + public SubjectSortBy getSortBy() { + return sortBy; + } + + @Override + public String toString() { + return sortBy.name() + ',' + direction.name(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + SubjectSortOrder that = (SubjectSortOrder) o; + + return sortBy == that.sortBy && direction == that.direction; + } + + @Override + public int hashCode() { + return Objects.hash(direction, sortBy); + } +} diff --git a/src/main/java/org/radarbase/management/web/rest/criteria/ZonedDateTimeCriteriaRange.java b/src/main/java/org/radarbase/management/web/rest/criteria/ZonedDateTimeCriteriaRange.java new file mode 100644 index 000000000..33275bec6 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/criteria/ZonedDateTimeCriteriaRange.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +package org.radarbase.management.web.rest.criteria; + +import java.time.ZonedDateTime; + +public class ZonedDateTimeCriteriaRange extends CriteriaRange { +} diff --git a/src/main/java/org/radarbase/management/web/rest/errors/BadRequestException.java b/src/main/java/org/radarbase/management/web/rest/errors/BadRequestException.java index e18d05c49..840c3e27e 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/BadRequestException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/BadRequestException.java @@ -1,7 +1,8 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** * The request could not be understood by the server due to malformed syntax. @@ -19,7 +20,7 @@ public class BadRequestException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public BadRequestException(String message, String entityName, String errorCode) { - super(Response.Status.BAD_REQUEST, message, entityName, errorCode); + super(HttpStatus.BAD_REQUEST, message, entityName, errorCode); } /** @@ -32,6 +33,6 @@ public BadRequestException(String message, String entityName, String errorCode) */ public BadRequestException(String message, String entityName, String errorCode, Map paramMap) { - super(Response.Status.BAD_REQUEST, message, entityName, errorCode, paramMap); + super(HttpStatus.BAD_REQUEST, message, entityName, errorCode, paramMap); } } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/ConflictException.java b/src/main/java/org/radarbase/management/web/rest/errors/ConflictException.java index c5bc7e9e4..b1a3c457b 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/ConflictException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/ConflictException.java @@ -1,7 +1,8 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** @@ -25,7 +26,7 @@ public class ConflictException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public ConflictException(String message, String entityName, String errorCode) { - super(Response.Status.CONFLICT, message, entityName, errorCode); + super(HttpStatus.CONFLICT, message, entityName, errorCode); } /** @@ -38,6 +39,6 @@ public ConflictException(String message, String entityName, String errorCode) { */ public ConflictException(String message, String entityName, String errorCode, Map paramMap) { - super(Response.Status.CONFLICT, message, entityName, errorCode, paramMap); + super(HttpStatus.CONFLICT, message, entityName, errorCode, paramMap); } } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/EntityName.java b/src/main/java/org/radarbase/management/web/rest/errors/EntityName.java index f4a783225..a8dc96baf 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/EntityName.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/EntityName.java @@ -9,7 +9,9 @@ public interface EntityName { String USER = "userManagement"; String SOURCE = "source"; String META_TOKEN = "meta-token"; + String ORGANIZATION = "organization"; String PROJECT = "project"; String REVISION = "revision"; + String GROUP = "group"; } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/ErrorConstants.java b/src/main/java/org/radarbase/management/web/rest/errors/ErrorConstants.java index 32d55a607..3719b57d6 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/ErrorConstants.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/ErrorConstants.java @@ -18,7 +18,12 @@ public final class ErrorConstants { public static final String ERR_SOURCE_NOT_FOUND = "error.sourceNotFound"; public static final String ERR_SOURCE_TYPE_IN_USE = "error.sourceTypeInUse"; public static final String ERR_SOURCE_TYPE_NOT_FOUND = "error.sourceTypeNotFound"; + public static final String ERR_GROUP_NOT_FOUND = "error.groupNotFound"; + public static final String ERR_GROUP_EXISTS = "error.groupExists"; public static final String ERR_INVALID_AUTHORITY = "error.invalidAuthority"; + public static final String ERR_EMAIL_EXISTS = "error.emailexists"; + public static final String ERR_ORGANIZATION_NAME_NOT_FOUND = "error" + + ".organizationNameNotFound"; public static final String ERR_PROJECT_ID_NOT_FOUND = "error.projectIdNotFound"; public static final String ERR_PROJECT_NAME_NOT_FOUND = "error.projectNameNotFound"; public static final String ERR_REVISIONS_NOT_FOUND = "error.revisionsNotFound"; @@ -32,6 +37,10 @@ public final class ErrorConstants { + ".noValidPrivacyPolicyUrl"; public static final String ERR_NO_SUCH_CLIENT = "error.noSuchClient"; public static final String ERR_PROJECT_NOT_EMPTY = "error.projectNotEmpty"; + public static final String ERR_PASSWORD_TOO_LONG = "error.longPassword"; + public static final String ERR_PASSWORD_TOO_WEAK = "error.weakPassword"; + + public static final String ERR_EMAIL_NOT_REGISTERED = "error.emailNotRegistered"; private ErrorConstants() { } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/ExceptionTranslator.java b/src/main/java/org/radarbase/management/web/rest/errors/ExceptionTranslator.java index 33a103173..832f872d4 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/ExceptionTranslator.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/ExceptionTranslator.java @@ -23,11 +23,13 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.server.ResponseStatusException; /** * Controller advice to translate the server side exceptions to client-friendly json structures. */ @ControllerAdvice +@SuppressWarnings("PMD.CouplingBetweenObjects") public class ExceptionTranslator { private static final Logger logger = LoggerFactory.getLogger(ExceptionTranslator.class); @@ -72,7 +74,8 @@ public ErrorVM processValidationError(MethodArgumentNotValidException ex) { List fieldErrors = result.getFieldErrors(); ErrorVM dto = new ErrorVM(ErrorConstants.ERR_VALIDATION); for (FieldError fieldError : fieldErrors) { - dto.add(fieldError.getObjectName(), fieldError.getField(), fieldError.getCode()); + dto.add(fieldError.getObjectName(), fieldError.getField(), + fieldError.getCode() + ": " + fieldError.getDefaultMessage()); } return dto; } @@ -132,7 +135,7 @@ public ResponseEntity processConflict( private ResponseEntity processRadarWebApplicationException( RadarWebApplicationException exception) { return ResponseEntity - .status(exception.getResponse().getStatus()) + .status(exception.getStatus()) .headers(HeaderUtil.createExceptionAlert(exception.getEntityName(), exception.getErrorCode(), exception.getMessage())) .body(exception.getExceptionVM()); @@ -174,6 +177,12 @@ public ErrorVM processNoSuchClientException(NoSuchClientException ex) { return new ErrorVM(ErrorConstants.ERR_NO_SUCH_CLIENT, ex.getMessage()); } + @ExceptionHandler(ResponseStatusException.class) + public ResponseEntity responseStatusResponse(ResponseStatusException ex) { + return ResponseEntity.status(ex.getStatus()) + .body(new ErrorVM(null, ex.getMessage())); + } + /** * Generic exception translator. * @param ex the exception diff --git a/src/main/java/org/radarbase/management/web/rest/errors/InvalidRequestException.java b/src/main/java/org/radarbase/management/web/rest/errors/InvalidRequestException.java index 4ad7a1839..75c5420be 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/InvalidRequestException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/InvalidRequestException.java @@ -1,7 +1,8 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** * The server understood the request, but is refusing to fulfill it. @@ -17,7 +18,7 @@ public class InvalidRequestException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public InvalidRequestException(String message, String entityName, String errorCode) { - super(Response.Status.FORBIDDEN, message, entityName, errorCode); + super(HttpStatus.FORBIDDEN, message, entityName, errorCode); } /** @@ -30,7 +31,7 @@ public InvalidRequestException(String message, String entityName, String errorCo */ public InvalidRequestException(String message, String entityName, String errorCode, Map params) { - super(Response.Status.FORBIDDEN, message, entityName, errorCode, params); + super(HttpStatus.FORBIDDEN, message, entityName, errorCode, params); } } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/InvalidStateException.java b/src/main/java/org/radarbase/management/web/rest/errors/InvalidStateException.java index e4239a95f..f547e1d06 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/InvalidStateException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/InvalidStateException.java @@ -1,8 +1,9 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** * The server encountered an unexpected condition which prevented it from fulfilling the request. @@ -17,7 +18,7 @@ public class InvalidStateException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public InvalidStateException(String message, String entityName, String errorCode) { - super(Response.Status.INTERNAL_SERVER_ERROR, message, entityName, errorCode); + super(HttpStatus.INTERNAL_SERVER_ERROR, message, entityName, errorCode); } /** @@ -30,6 +31,6 @@ public InvalidStateException(String message, String entityName, String errorCode */ public InvalidStateException(String message, String entityName, String errorCode, Map params) { - super(Response.Status.INTERNAL_SERVER_ERROR, message, entityName, errorCode, params); + super(HttpStatus.INTERNAL_SERVER_ERROR, message, entityName, errorCode, params); } } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/NotFoundException.java b/src/main/java/org/radarbase/management/web/rest/errors/NotFoundException.java index ef128b8a2..0c2330b24 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/NotFoundException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/NotFoundException.java @@ -1,7 +1,8 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** * Created by dverbeec on 7/09/2017. @@ -20,7 +21,7 @@ public class NotFoundException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public NotFoundException(String message, String entityName, String errorCode) { - super(Response.Status.NOT_FOUND, message, entityName, errorCode); + super(HttpStatus.NOT_FOUND, message, entityName, errorCode); } /** @@ -33,6 +34,6 @@ public NotFoundException(String message, String entityName, String errorCode) { */ public NotFoundException(String message, String entityName, String errorCode, Map paramMap) { - super(Response.Status.NOT_FOUND, message, entityName, errorCode, paramMap); + super(HttpStatus.NOT_FOUND, message, entityName, errorCode, paramMap); } } diff --git a/src/main/java/org/radarbase/management/web/rest/errors/RadarWebApplicationException.java b/src/main/java/org/radarbase/management/web/rest/errors/RadarWebApplicationException.java index ef31c17ee..9c2ac3a87 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/RadarWebApplicationException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/RadarWebApplicationException.java @@ -1,14 +1,15 @@ package org.radarbase.management.web.rest.errors; -import static java.util.Collections.emptyMap; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response.Status; + +import static java.util.Collections.emptyMap; /** * A base parameterized exception, which can be translated on the client side. @@ -22,13 +23,13 @@ * *

{@code "error.myCustomError" : "The server says {{param0}} to {{param1}}"}

*/ -public abstract class RadarWebApplicationException extends WebApplicationException { +public class RadarWebApplicationException extends ResponseStatusException { - private String message; + private final String message; - private String entityName; + private final String entityName; - private String errorCode; + private final String errorCode; private final Map paramMap = new HashMap<>(); @@ -40,7 +41,7 @@ public abstract class RadarWebApplicationException extends WebApplicationExcepti * @param entityName Entity related to the exception * @param errorCode error code defined in MP if relevant. */ - public RadarWebApplicationException(Status status, String message, String entityName, + public RadarWebApplicationException(HttpStatus status, String message, String entityName, String errorCode) { this(status, message, entityName, errorCode, emptyMap()); } @@ -48,15 +49,15 @@ public RadarWebApplicationException(Status status, String message, String entity /** * A base parameterized exception, which can be translated on the client side. - * @param status {@link javax.ws.rs.core.Response.Status} code. + * @param status {@link HttpStatus} code. * @param message message to client. * @param entityName entityRelated from {@link EntityName} * @param errorCode errorCode from {@link ErrorConstants} * @param params map of optional information. */ - public RadarWebApplicationException(Status status, String message, String entityName, + public RadarWebApplicationException(HttpStatus status, String message, String entityName, String errorCode, Map params) { - super(status); + super(status, message, null); // add default timestamp first, so a timestamp key in the paramMap will overwrite it this.paramMap.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) diff --git a/src/main/java/org/radarbase/management/web/rest/errors/RequestGoneException.java b/src/main/java/org/radarbase/management/web/rest/errors/RequestGoneException.java index a2b46c1a1..c9cf2aa39 100644 --- a/src/main/java/org/radarbase/management/web/rest/errors/RequestGoneException.java +++ b/src/main/java/org/radarbase/management/web/rest/errors/RequestGoneException.java @@ -1,7 +1,8 @@ package org.radarbase.management.web.rest.errors; +import org.springframework.http.HttpStatus; + import java.util.Map; -import javax.ws.rs.core.Response; /** * Throw when the requested resource is no longer available at the server and no forwarding @@ -18,7 +19,7 @@ public class RequestGoneException extends RadarWebApplicationException { * @param errorCode errorCode from {@link ErrorConstants} */ public RequestGoneException(String message, String entityName, String errorCode) { - super(Response.Status.GONE, message, entityName, errorCode); + super(HttpStatus.GONE, message, entityName, errorCode); } @@ -32,6 +33,6 @@ public RequestGoneException(String message, String entityName, String errorCode) */ public RequestGoneException(String message, String entityName, String errorCode, Map paramMap) { - super(Response.Status.GONE, message, entityName, errorCode, paramMap); + super(HttpStatus.GONE, message, entityName, errorCode, paramMap); } } diff --git a/src/main/java/org/radarbase/management/web/rest/util/HttpUtil.java b/src/main/java/org/radarbase/management/web/rest/util/HttpUtil.java index ba5b75bda..3103c56cd 100644 --- a/src/main/java/org/radarbase/management/web/rest/util/HttpUtil.java +++ b/src/main/java/org/radarbase/management/web/rest/util/HttpUtil.java @@ -26,7 +26,7 @@ public static boolean isReachable(URL urlServer) { urlConn.connect(); return urlConn.getResponseCode() == 200; } catch (IOException e) { - log.warn("Server {} is unreachable: {}", urlServer.toString(), e.getMessage()); + log.warn("Server {} is unreachable: {}", urlServer, e.getMessage()); return false; } } diff --git a/src/main/java/org/radarbase/management/web/rest/util/PaginationUtil.java b/src/main/java/org/radarbase/management/web/rest/util/PaginationUtil.java index 20531d0b7..ec5db882c 100644 --- a/src/main/java/org/radarbase/management/web/rest/util/PaginationUtil.java +++ b/src/main/java/org/radarbase/management/web/rest/util/PaginationUtil.java @@ -1,9 +1,15 @@ package org.radarbase.management.web.rest.util; +import org.radarbase.management.service.dto.SubjectDTO; +import org.radarbase.management.web.rest.criteria.CriteriaRange; +import org.radarbase.management.web.rest.criteria.SubjectCriteria; import org.springframework.data.domain.Page; import org.springframework.http.HttpHeaders; import org.springframework.web.util.UriComponentsBuilder; +import javax.annotation.Nullable; +import java.util.Locale; + /** * Utility class for handling pagination. * @@ -25,7 +31,6 @@ private PaginationUtil() { * @return the {@link HttpHeaders} */ public static HttpHeaders generatePaginationHttpHeaders(Page page, String baseUrl) { - HttpHeaders headers = new HttpHeaders(); headers.add("X-Total-Count", Long.toString(page.getTotalElements())); @@ -55,10 +60,80 @@ public static HttpHeaders generatePaginationHttpHeaders(Page page, String bas return headers; } + /** + * Generate pagination HTTP headers for subjects given a subject filter. + * @param page the page + * @param baseUrl the base URL + * @param criteria subject criteria + * @return the {@link HttpHeaders} + */ + public static HttpHeaders generateSubjectPaginationHttpHeaders( + Page page, String baseUrl, SubjectCriteria criteria + ) { + HttpHeaders headers = new HttpHeaders(); + headers.add("X-Total-Count", Long.toString(page.getTotalElements())); + if (!page.isEmpty()) { + String link = '<' + + generateUri(page, baseUrl, criteria) + + ">; rel=\"next\""; + headers.add(HttpHeaders.LINK, link); + } + return headers; + } + private static String generateUri(String baseUrl, int page, int size) { return UriComponentsBuilder.fromUriString(baseUrl) .queryParam("page", page) .queryParam("size", size) .toUriString(); } + + private static String generateUri(Page page, String baseUrl, + SubjectCriteria criteria) { + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUrl); + generateUriCriteriaRange(builder, "dateOfBirth", criteria.getDateOfBirth()); + generateUriCriteriaRange(builder, "enrollmentDate", criteria.getEnrollmentDate()); + generateUriParam(builder, "externalId", criteria.getExternalId()); + generateUriParam(builder, "groupId", criteria.getGroupId()); + generateUriParam(builder, "personName", criteria.getPersonName()); + generateUriParam(builder, "humanReadableIdentifier", + criteria.getHumanReadableIdentifier()); + generateUriParam(builder, "projectName", criteria.getProjectName()); + generateUriParam(builder, "login", criteria.getLogin()); + if (criteria.getAuthority() != null) { + criteria.getAuthority().forEach(a -> generateUriParam(builder, + "authority", a)); + } + generateUriParam(builder, "size", criteria.getSize()); + generateUriParam(builder, "page", criteria.getPage()); + if (criteria.getSort() != null) { + criteria.getParsedSort().forEach(order -> generateUriParam(builder, "sort", + order.getSortBy().getQueryParam() + ',' + + order.getDirection().name().toLowerCase(Locale.ROOT))); + } + SubjectDTO lastSubject = page.getContent().get(page.getNumberOfElements() - 1); + generateUriParam(builder, "last.id", lastSubject.getId()); + generateUriParam(builder, "last.login", lastSubject.getLogin()); + if (lastSubject.getExternalId() != null && !lastSubject.getExternalId().isEmpty()) { + generateUriParam(builder, "last.externalId", lastSubject.getExternalId()); + } + return builder.toUriString(); + } + + private static void generateUriCriteriaRange(UriComponentsBuilder builder, String prefix, + CriteriaRange range) { + if (range == null) { + return; + } + generateUriParam(builder, prefix + ".is", range.getIs()); + generateUriParam(builder, prefix + ".from", range.getFrom()); + generateUriParam(builder, prefix + ".to", range.getTo()); + } + + private static void generateUriParam(UriComponentsBuilder builder, String name, + @Nullable Object value) { + if (value != null) { + builder.queryParam(name, value); + } + } } diff --git a/src/main/java/org/radarbase/management/web/rest/vm/GroupPatchOperation.java b/src/main/java/org/radarbase/management/web/rest/vm/GroupPatchOperation.java new file mode 100644 index 000000000..9e8614504 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/vm/GroupPatchOperation.java @@ -0,0 +1,53 @@ +package org.radarbase.management.web.rest.vm; + +import java.util.List; + +/** + * A POJO for PATCH .../groups/{groupName}/subjects + * [ + * {"op": "add", "value": [{"login": "sub1"}, {"id": 2}]}, + * {"op": "remove", "value": [{"login": "sub3"}]} + * ] + * request. + */ +public class GroupPatchOperation { + private String op; + private List value; + + public String getOp() { + return op; + } + + public void setOp(String op) { + this.op = op; + } + + public List getValue() { + return value; + } + + public void setValue(List value) { + this.value = value; + } + + public static class SubjectPatchValue { + private Long id; + private String login; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + } +} diff --git a/src/main/resources/.h2.server.properties b/src/main/resources/.h2.server.properties deleted file mode 100644 index a373eb3cb..000000000 --- a/src/main/resources/.h2.server.properties +++ /dev/null @@ -1,6 +0,0 @@ -#H2 Server Properties -#Tue May 04 09:21:28 BST 2021 -0=JHipster H2 (Memory)|org.h2.Driver|jdbc\:h2\:mem\:managementportal|ManagementPortal -webAllowOthers=true -webPort=8082 -webSSL=false diff --git a/src/main/resources/config/application-api-docs.yml b/src/main/resources/config/application-api-docs.yml new file mode 100644 index 000000000..0d1b821e8 --- /dev/null +++ b/src/main/resources/config/application-api-docs.yml @@ -0,0 +1,18 @@ +# =================================================================== +# Spring Boot configuration for the "dev" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://jhipster.github.io/profiles/ +# More information on configuration properties: https://jhipster.github.io/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +springdoc: + api-docs.enabled: true + swagger-ui.enabled: true diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml index 5918bf6b5..50b2e4684 100644 --- a/src/main/resources/config/application-dev.yml +++ b/src/main/resources/config/application-dev.yml @@ -14,9 +14,6 @@ # =================================================================== spring: - profiles: - active: dev - include: swagger devtools: restart: enabled: true @@ -26,23 +23,15 @@ spring: jackson: serialization.indent_output: true datasource: - type: com.zaxxer.hikari.HikariDataSource - url: jdbc:h2:mem:managementportal;DB_CLOSE_DELAY=-1 + url: jdbc:hsqldb:mem:managementportal;DB_CLOSE_DELAY=-1 username: ManagementPortal password: -# driverClassName: org.postgresql.Driver -# url: jdbc:postgresql://localhost:5432/managementportal -# username: radarbase -# password: radarbase h2: console: - enabled: true - path: /h2-console + enabled: false jpa: - database-platform: org.hibernate.dialect.H2Dialect - database: H2 -# database-platform: org.hibernate.dialect.PostgreSQLDialect -# database: POSTGRESQL + database-platform: org.hibernate.dialect.HSQLDialect + database: HSQL show-sql: true properties: hibernate.id.new_generator_mappings: true @@ -60,14 +49,10 @@ spring: username: user@example.com password: XXXXXXXX protocol: smtp - tls: true properties.mail.smtp: auth: true starttls.enable: true ssl.trust: # for hotmail - debug: true - messages: - cache-seconds: 1 thymeleaf: cache: false liquibase: @@ -92,6 +77,8 @@ spring: # =================================================================== server: port: 8080 + servlet: + session.cookie.secure: false # =================================================================== @@ -128,25 +115,10 @@ managementportal: # =================================================================== jhipster: - http: - version: V_1_1 # To use HTTP/2 you will need SSL support (see above the "server.ssl" configuration) cache: # Cache configuration hazelcast: # Hazelcast distributed cache time-to-live-seconds: 3600 backup-count: 1 - metrics: # DropWizard Metrics configuration, used by MetricsConfiguration - jmx.enabled: true - graphite: # Use the "graphite" Maven profile to have the Graphite dependencies - enabled: false - host: localhost - port: 2003 - prefix: ManagementPortal - prometheus: # Use the "prometheus" Maven profile to have the Prometheus dependencies - enabled: false - endpoint: /prometheusMetrics - logs: # Reports Dropwizard metrics in the logs - enabled: false - report-frequency: 60 # in seconds logging: logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration enabled: false @@ -163,4 +135,5 @@ jhipster: # https://jhipster.github.io/common-application-properties/ # =================================================================== + application: diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml index aaba0243f..a0efe5a85 100644 --- a/src/main/resources/config/application-prod.yml +++ b/src/main/resources/config/application-prod.yml @@ -12,12 +12,6 @@ # Full reference is available at: # http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html # =================================================================== -zuul: - sensitiveHeaders: Cookie,Set-Cookie - routes: - oauth: - path: /oauthserver/oauth/** - url: http://localhost:8080/managementportal/oauth spring: devtools: restart: @@ -54,11 +48,9 @@ spring: host: smtp port: 25 protocol: smtp - tls: false properties.mail.smtp: auth: false starttls.enable: false - debug: true thymeleaf: cache: true liquibase: @@ -122,26 +114,12 @@ managementportal: jhipster: http: - version: V_1_1 # To use HTTP/2 you will need SSL support (see above the "server.ssl" configuration) cache: # Used by the CachingHttpHeadersFilter timeToLiveInDays: 1461 cache: # Cache configuration hazelcast: # Hazelcast distributed cache time-to-live-seconds: 3600 backup-count: 1 - metrics: # DropWizard Metrics configuration, used by MetricsConfiguration - jmx.enabled: true - graphite: - enabled: false - host: localhost - port: 2003 - prefix: ManagementPortal - prometheus: - enabled: false - endpoint: /prometheusMetrics - logs: # Reports Dropwizard metrics in the logs - enabled: false - report-frequency: 60 # in seconds logging: logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration enabled: false diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index e9902adf1..841f4a5f4 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -1,60 +1,50 @@ -# =================================================================== -# Spring Boot configuration. -# -# This configuration will be overriden by the Spring profile you use, -# for example application-dev.yml if you use the "dev" profile. -# -# More information on profiles: https://jhipster.github.io/profiles/ -# More information on configuration properties: https://jhipster.github.io/common-application-properties/ -# =================================================================== - -# =================================================================== -# Standard Spring Boot properties. -# Full reference is available at: -# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html -# =================================================================== -zuul: - sensitiveHeaders: Cookie,Set-Cookie - host: - max-total-connections: 1000 - max-per-route-connections: 100 - semaphore: - max-semaphores: 500 - retryable: true - routes: - oauth: - path: /oauthserver/oauth/** - url: http://localhost:8080/oauth -ribbon: - eureka: - enabled: false - -hystrix: - command: - default: - execution: - isolation: - thread: - timeoutInMilliseconds: 60000 - management: endpoints: web: base-path: /management + exposure: + include: [ "configprops", "env", "health", "info", "jhimetrics", "logfile", "loggers", "prometheus", "threaddump", "caches", "liquibase"] endpoint: health: - show-details: "ALWAYS" + show-details: ALWAYS + probes: + enabled: true + jhimetrics: + enabled: true health: diskspace: - enabled: false # disabling diskspace as the standard config, since we have removed security check for health endpoint + # disabling diskspace as the standard config, since we have removed + # security check for health endpoint + enabled: false mail: enabled: false # When using the MailService, configure an SMTP server and set this to true - datasource: + db: enabled: true metrics: export: defaults: - enabled: false + enabled: true + prometheus: + enabled: true + step: 60 + enable: + http: true + jvm: true + logback: true + process: true + system: true + distribution: + percentiles-histogram: + all: true + percentiles: + all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 + tags: + application: ${spring.application.name} + web: + server: + request: + autotime: + enabled: true spring: application: @@ -84,23 +74,28 @@ spring: jdbc: lob: non_contextual_creation: true + main: + allow-circular-references: true messages: basename: i18n/messages - mvc: - favicon: - enabled: false thymeleaf: - mode: XHTML + mode: HTML -security: - oauth2: - resource: - filter-order: 3 +springdoc: + api-docs: + path: /api-docs + enabled: false + swagger-ui: + enabled: false server: - session: - cookie: - http-only: true + servlet: + session: + cookie: + http-only: true + secure: true + max-age: 30m + timeout: 15m info: project: @@ -129,27 +124,6 @@ jhipster: core-pool-size: 2 max-pool-size: 50 queue-capacity: 10000 - # By default CORS is disabled. Uncomment to enable. - cors: - allowed-origins: '*' - allowed-methods: GET, PUT, POST, DELETE, OPTIONS - allowed-headers: Authorization, Content-Type - #exposed-headers: - allow-credentials: true - max-age: 1800 - swagger: - default-include-pattern: /api/.* - title: ManagementPortal API - description: ManagementPortal API documentation - version: #project.version# - terms-of-service-url: - contact-name: - contact-url: - contact-email: - license: Apache 2.0 - license-url: https://github.com/RADAR-base/ManagementPortal/blob/master/LICENSE.md - ribbon: - display-on-active-profiles: dev # =================================================================== # Application specific properties diff --git a/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml index 78c7a9f86..a5a5822bb 100644 --- a/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml +++ b/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml @@ -6,11 +6,11 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> - + - + diff --git a/src/main/resources/config/liquibase/changelog/20210920101000_add_groups.xml b/src/main/resources/config/liquibase/changelog/20210920101000_add_groups.xml new file mode 100644 index 000000000..82c8aa875 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210920101000_add_groups.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210929120000_add_date_of_birth.xml b/src/main/resources/config/liquibase/changelog/20210929120000_add_date_of_birth.xml new file mode 100644 index 000000000..98f304474 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210929120000_add_date_of_birth.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211006150000_add_person_name.xml b/src/main/resources/config/liquibase/changelog/20211006150000_add_person_name.xml new file mode 100644 index 000000000..a565522c2 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211006150000_add_person_name.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211006160000_add_source_deleted_flag.xml b/src/main/resources/config/liquibase/changelog/20211006160000_add_source_deleted_flag.xml new file mode 100644 index 000000000..27bb0873b --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211006160000_add_source_deleted_flag.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211006170000_add_enrollment_date.xml b/src/main/resources/config/liquibase/changelog/20211006170000_add_enrollment_date.xml new file mode 100644 index 000000000..7a6809a78 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211006170000_add_enrollment_date.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + UPDATE subject + SET enrollment_date = ( + SELECT MIN(r.timestamp) + FROM subject_aud a + INNER JOIN _revisions_info r ON a.rev = r.id + WHERE a.id = subject.id + AND a.revtype = 0 + ) + WHERE subject.enrollment_date IS NULL + + + diff --git a/src/main/resources/config/liquibase/changelog/20211018210000_add_indexes_for_subject.xml b/src/main/resources/config/liquibase/changelog/20211018210000_add_indexes_for_subject.xml new file mode 100644 index 000000000..a4446b909 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211018210000_add_indexes_for_subject.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211026000000_extra_demo_data.xml b/src/main/resources/config/liquibase/changelog/20211026000000_extra_demo_data.xml new file mode 100644 index 000000000..2dc26384e --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211026000000_extra_demo_data.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211110160000_add_organization.xml b/src/main/resources/config/liquibase/changelog/20211110160000_add_organization.xml new file mode 100644 index 000000000..e14bd034f --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211110160000_add_organization.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT into radar_organization_aud ( + id, rev, revtype, + + description, description_mod, + location, location_mod, + name, name_mod + ) + SELECT + id, 1, 0, + + description, true, + location, true, + name, true + FROM radar_organization + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20211202145000_add_organization_demo_data.xml b/src/main/resources/config/liquibase/changelog/20211202145000_add_organization_demo_data.xml new file mode 100644 index 000000000..20b0ffc13 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20211202145000_add_organization_demo_data.xml @@ -0,0 +1,39 @@ + + + + + ROLE_ORGANIZATION_ADMIN + + + 1 + 0 + ROLE_ORGANIZATION_ADMIN + + + insert into radar_role_aud(id, rev, revtype, authority_name, authority_mod, project_id, project_mod, organization_id, organization_mod, users_mod) select id, 1, 0, authority_name, true, project_id, true, organization_id, true, true from radar_role WHERE id = 6 + + + + + insert into radar_user_aud(id, rev, revtype, activated, activated_mod, activation_key, activation_key_mod, email, email_mod, first_name, first_name_mod, lang_key, lang_key_mod, last_name, last_name_mod, login, login_mod, password_hash, password_mod, reset_date, reset_date_mod, reset_key, reset_key_mod, roles_mod) select id, 1, 0, activated, true, activation_key, true, email, true, first_name, true, lang_key, true, last_name, true, login, true, password_hash, true, reset_date, true, reset_key, true, true from radar_user where id = 55 + + + insert into role_users_aud(rev, revtype, users_id, roles_id) select 1, 0, users_id, roles_id from role_users where users_id = 55 + + diff --git a/src/main/resources/config/liquibase/group.csv b/src/main/resources/config/liquibase/group.csv new file mode 100644 index 000000000..077adfb5f --- /dev/null +++ b/src/main/resources/config/liquibase/group.csv @@ -0,0 +1,3 @@ +id;project_id;name +1;1;Test Group A +2;1;Test Group B diff --git a/src/main/resources/config/liquibase/master.xml b/src/main/resources/config/liquibase/master.xml index 496e84bc9..dd5a14a1e 100644 --- a/src/main/resources/config/liquibase/master.xml +++ b/src/main/resources/config/liquibase/master.xml @@ -33,5 +33,14 @@ + + + + + + + + + diff --git a/src/main/resources/config/liquibase/organization.csv b/src/main/resources/config/liquibase/organization.csv new file mode 100644 index 000000000..af7e9d8b4 --- /dev/null +++ b/src/main/resources/config/liquibase/organization.csv @@ -0,0 +1,2 @@ +id;name;description;location +1;main;The main organization;- diff --git a/src/main/resources/config/liquibase/organization_role_users.csv b/src/main/resources/config/liquibase/organization_role_users.csv new file mode 100644 index 000000000..0aaf1b17c --- /dev/null +++ b/src/main/resources/config/liquibase/organization_role_users.csv @@ -0,0 +1,2 @@ +"USERS_ID";"ROLES_ID" +55;6 diff --git a/src/main/resources/config/liquibase/organization_roles.csv b/src/main/resources/config/liquibase/organization_roles.csv new file mode 100644 index 000000000..e25aec2b0 --- /dev/null +++ b/src/main/resources/config/liquibase/organization_roles.csv @@ -0,0 +1,2 @@ +id;authority_name;project_id;organization_id +6;ROLE_ORGANIZATION_ADMIN;;1 diff --git a/src/main/resources/config/liquibase/organization_user.csv b/src/main/resources/config/liquibase/organization_user.csv new file mode 100644 index 000000000..7e2d51801 --- /dev/null +++ b/src/main/resources/config/liquibase/organization_user.csv @@ -0,0 +1,2 @@ +"ID";"LOGIN";"PASSWORD_HASH";"FIRST_NAME";"LAST_NAME";"EMAIL";"ACTIVATED";"LANG_KEY" +55;oadmin;$2y$10$nRljY6NlDhLbsQ/xmbrvleYzQB3TWILZgMqLTOxXkt./upvLwFrsG;Org;Admin;oadmin@localhost;true;en diff --git a/src/main/resources/config/liquibase/role_users.csv b/src/main/resources/config/liquibase/role_users.csv index b274780c9..3633c9242 100644 --- a/src/main/resources/config/liquibase/role_users.csv +++ b/src/main/resources/config/liquibase/role_users.csv @@ -5,3 +5,50 @@ 5;3 6;4 7;5 +8;2 +9;2 +10;2 +11;2 +12;2 +13;2 +14;2 +15;2 +16;2 +17;2 +18;2 +19;2 +20;2 +21;2 +22;2 +23;2 +24;2 +25;2 +26;2 +27;2 +28;2 +29;2 +30;2 +31;2 +32;2 +33;5 +34;5 +35;5 +36;5 +37;5 +38;5 +39;5 +40;5 +41;5 +42;5 +43;5 +44;5 +45;5 +46;5 +47;5 +48;5 +49;5 +50;5 +51;5 +52;5 +53;5 +54;5 diff --git a/src/main/resources/config/liquibase/sources.csv b/src/main/resources/config/liquibase/sources.csv index ea4aa726b..73284db88 100644 --- a/src/main/resources/config/liquibase/sources.csv +++ b/src/main/resources/config/liquibase/sources.csv @@ -1,2 +1,2 @@ "ID";"source_id";"source_name";"assigned";"created_by";"source_type_id";"project_id" -"1";"03d28e5c-e005-46d4-a9b3-279c27fbbc83";"source-1";"TRUE";"system";"1";"1" \ No newline at end of file +"1";"03d28e5c-e005-46d4-a9b3-279c27fbbc83";"source-1";"TRUE";"system";"1";"1" diff --git a/src/main/resources/config/liquibase/subject.csv b/src/main/resources/config/liquibase/subject.csv index 42e7aad5a..ad0e8f6a3 100644 --- a/src/main/resources/config/liquibase/subject.csv +++ b/src/main/resources/config/liquibase/subject.csv @@ -3,3 +3,50 @@ "2";;;"FALSE";"3";"system" "3";;;"FALSE";"4";"system" "4";;;"FALSE";"7";"system" +"5";;;"FALSE";"8";"system" +"6";;;"FALSE";"9";"system" +"7";;;"FALSE";"10";"system" +"8";;;"FALSE";"11";"system" +"9";;;"FALSE";"12";"system" +"10";;;"FALSE";"13";"system" +"11";;;"FALSE";"14";"system" +"12";;;"FALSE";"15";"system" +"13";;;"FALSE";"16";"system" +"14";;;"FALSE";"17";"system" +"15";;;"FALSE";"18";"system" +"16";;;"FALSE";"19";"system" +"17";;;"FALSE";"20";"system" +"18";;;"FALSE";"21";"system" +"19";;;"FALSE";"22";"system" +"20";;;"FALSE";"23";"system" +"21";;;"FALSE";"24";"system" +"22";;;"FALSE";"25";"system" +"23";;;"FALSE";"26";"system" +"24";;;"FALSE";"27";"system" +"25";;;"FALSE";"28";"system" +"26";;;"FALSE";"29";"system" +"27";;;"FALSE";"30";"system" +"28";;;"FALSE";"31";"system" +"29";;;"FALSE";"32";"system" +"30";;;"FALSE";"33";"system" +"31";;;"FALSE";"34";"system" +"32";;;"FALSE";"35";"system" +"33";;;"FALSE";"36";"system" +"34";;;"FALSE";"37";"system" +"35";;;"FALSE";"38";"system" +"36";;;"FALSE";"39";"system" +"37";;;"FALSE";"40";"system" +"38";;;"FALSE";"41";"system" +"39";;;"FALSE";"42";"system" +"40";;;"FALSE";"43";"system" +"41";;;"FALSE";"44";"system" +"42";;;"FALSE";"45";"system" +"43";;;"FALSE";"46";"system" +"44";;;"FALSE";"47";"system" +"45";;;"FALSE";"48";"system" +"46";;;"FALSE";"49";"system" +"47";;;"FALSE";"50";"system" +"48";;;"FALSE";"51";"system" +"49";;;"FALSE";"52";"system" +"50";;;"FALSE";"53";"system" +"51";;;"FALSE";"54";"system" diff --git a/src/main/resources/config/liquibase/subject_group.csv b/src/main/resources/config/liquibase/subject_group.csv new file mode 100644 index 000000000..2d969dbf9 --- /dev/null +++ b/src/main/resources/config/liquibase/subject_group.csv @@ -0,0 +1,11 @@ +"ID";"group_id" +"11";1 +"12";1 +"13";1 +"15";1 +"16";2 +"17";1 +"18";2 +"19";2 +"20";2 +"22";2 diff --git a/src/main/resources/config/liquibase/users.csv b/src/main/resources/config/liquibase/users.csv index 5cfc8179e..b8c712686 100644 --- a/src/main/resources/config/liquibase/users.csv +++ b/src/main/resources/config/liquibase/users.csv @@ -5,3 +5,50 @@ 5;padmin;$2a$10$aIewJVA1C7hJDVYIGQSJ5.6bk/vD85tvGIJe2I52H02m2qN4HBQ9S;null;null;padmin@localhost;TRUE;en;system;system 6;padmin2;$2a$10$aIewJVA1C7hJDVYIGQSJ5.6bk/vD85tvGIJe2I52H02m2qN4HBQ9S;null;null;padmin2@localhost;TRUE;en;admin;system 7;"sub-4";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-4@localhost";"true";"en";"admin";"admin" +8;"sub-5";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-5@localhost";"true";"en";"admin";"admin" +9;"sub-6";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-6@localhost";"true";"en";"admin";"admin" +10;"sub-7";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-7@localhost";"true";"en";"admin";"admin" +11;"sub-8";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-8@localhost";"true";"en";"admin";"admin" +12;"sub-9";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-9@localhost";"true";"en";"admin";"admin" +13;"sub-10";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-10@localhost";"true";"en";"admin";"admin" +14;"sub-11";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-11@localhost";"true";"en";"admin";"admin" +15;"sub-12";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-12@localhost";"true";"en";"admin";"admin" +16;"sub-13";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-13@localhost";"true";"en";"admin";"admin" +17;"sub-14";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-14@localhost";"true";"en";"admin";"admin" +18;"sub-15";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-15@localhost";"true";"en";"admin";"admin" +19;"sub-16";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-16@localhost";"true";"en";"admin";"admin" +20;"sub-17";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-17@localhost";"true";"en";"admin";"admin" +21;"sub-18";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-18@localhost";"true";"en";"admin";"admin" +22;"sub-19";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-19@localhost";"true";"en";"admin";"admin" +23;"sub-20";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-20@localhost";"true";"en";"admin";"admin" +24;"sub-21";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-21@localhost";"true";"en";"admin";"admin" +25;"sub-22";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-22@localhost";"true";"en";"admin";"admin" +26;"sub-23";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-23@localhost";"true";"en";"admin";"admin" +27;"sub-24";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-24@localhost";"true";"en";"admin";"admin" +28;"sub-25";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-25@localhost";"true";"en";"admin";"admin" +29;"sub-26";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-26@localhost";"true";"en";"admin";"admin" +30;"sub-27";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-27@localhost";"true";"en";"admin";"admin" +31;"sub-28";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-28@localhost";"true";"en";"admin";"admin" +32;"sub-29";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-29@localhost";"true";"en";"admin";"admin" +33;"sub-30";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-30@localhost";"true";"en";"admin";"admin" +34;"sub-31";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-31@localhost";"true";"en";"admin";"admin" +35;"sub-32";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-32@localhost";"true";"en";"admin";"admin" +36;"sub-33";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-33@localhost";"true";"en";"admin";"admin" +37;"sub-34";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-34@localhost";"true";"en";"admin";"admin" +38;"sub-35";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-35@localhost";"true";"en";"admin";"admin" +39;"sub-36";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-36@localhost";"true";"en";"admin";"admin" +40;"sub-37";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-37@localhost";"true";"en";"admin";"admin" +41;"sub-38";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-38@localhost";"true";"en";"admin";"admin" +42;"sub-39";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-39@localhost";"true";"en";"admin";"admin" +43;"sub-40";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-40@localhost";"true";"en";"admin";"admin" +44;"sub-41";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-41@localhost";"true";"en";"admin";"admin" +45;"sub-42";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-42@localhost";"true";"en";"admin";"admin" +46;"sub-43";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-43@localhost";"true";"en";"admin";"admin" +47;"sub-44";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-44@localhost";"true";"en";"admin";"admin" +48;"sub-45";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-45@localhost";"true";"en";"admin";"admin" +49;"sub-46";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-46@localhost";"true";"en";"admin";"admin" +50;"sub-47";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-47@localhost";"true";"en";"admin";"admin" +51;"sub-48";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-48@localhost";"true";"en";"admin";"admin" +52;"sub-49";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-49@localhost";"true";"en";"admin";"admin" +53;"sub-50";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-50@localhost";"true";"en";"admin";"admin" +54;"sub-51";"$2a$10$BAydwSFZF22cEYAB29Q9C.WK9PS1Z3c8V.h0AUB9KQEb18AGeNCi2";NULL;NULL;"sub-51@localhost";"true";"en";"admin";"admin" diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index fbb06c699..f5e23c7a0 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -48,7 +48,6 @@ - diff --git a/src/main/webapp/app/account/activate/activate.component.ts b/src/main/webapp/app/account/activate/activate.component.ts index 128fca539..bf6825f3b 100644 --- a/src/main/webapp/app/account/activate/activate.component.ts +++ b/src/main/webapp/app/account/activate/activate.component.ts @@ -1,18 +1,21 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { LoginModalService } from '../../shared'; import { Activate } from './activate.service'; +import { Subscription } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; @Component({ selector: 'jhi-activate', templateUrl: './activate.component.html', }) -export class ActivateComponent implements OnInit { +export class ActivateComponent implements OnInit, OnDestroy { error: string; success: string; modalRef: NgbModalRef; + subscription: Subscription; constructor( private activate: Activate, @@ -22,15 +25,23 @@ export class ActivateComponent implements OnInit { } ngOnInit() { - this.route.queryParams.subscribe((params) => { - this.activate.get(params['key']).subscribe(() => { + this.subscription = this.route.queryParams.pipe( + switchMap((params) => this.activate.get(params['key'])), + ).subscribe( + () => { this.error = null; this.success = 'OK'; - }, () => { + }, + () => { this.success = null; this.error = 'ERROR'; - }); - }); + }, + ); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + this.modalRef?.dismiss(); } login() { diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts index 5a1502d40..e4c42d987 100644 --- a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import {AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -6,12 +6,13 @@ import { LoginModalService } from '../../../shared'; import { PasswordResetFinish } from './password-reset-finish.service'; import { Password } from '../../password/password.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'jhi-password-reset-finish', templateUrl: './password-reset-finish.component.html', }) -export class PasswordResetFinishComponent implements OnInit, AfterViewInit { +export class PasswordResetFinishComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('passwordField') passwordField: ElementRef | null; confirmPassword: string; @@ -23,6 +24,7 @@ export class PasswordResetFinishComponent implements OnInit, AfterViewInit { success: string; modalRef: NgbModalRef; key: string; + private subscriptions = new Subscription(); constructor( private passwordResetFinish: PasswordResetFinish, @@ -33,9 +35,9 @@ export class PasswordResetFinishComponent implements OnInit, AfterViewInit { } ngOnInit() { - this.route.queryParams.subscribe((params) => { + this.subscriptions.add(this.route.queryParams.subscribe((params) => { this.key = params['key']; - }); + })); this.resetAccount = {}; this.keyMissing = !this.key; } @@ -46,6 +48,11 @@ export class PasswordResetFinishComponent implements OnInit, AfterViewInit { } } + ngOnDestroy() { + this.subscriptions.unsubscribe(); + this.modalRef?.dismiss(); + } + finishReset() { this.error = null; this.success = null; @@ -59,14 +66,14 @@ export class PasswordResetFinishComponent implements OnInit, AfterViewInit { } if (this.weakPassword == null && this.doNotMatch == null) { - this.passwordResetFinish.save({ + this.subscriptions.add(this.passwordResetFinish.save({ key: this.key, newPassword: this.resetAccount.password, }).subscribe(() => { this.success = 'OK'; }, () => { this.error = 'ERROR'; - }); + })); } } diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts index 3ee728fb2..d59f194a6 100644 --- a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts @@ -1,12 +1,13 @@ -import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { PasswordResetInit } from './password-reset-init.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'jhi-password-reset-init', templateUrl: './password-reset-init.component.html', }) -export class PasswordResetInitComponent implements OnInit, AfterViewInit { +export class PasswordResetInitComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('emailField') emailField: ElementRef; error: string; @@ -14,8 +15,10 @@ export class PasswordResetInitComponent implements OnInit, AfterViewInit { resetAccount: any; success: string; + private subscriptions = new Subscription(); + constructor( - private passwordResetInit: PasswordResetInit, + private passwordResetInit: PasswordResetInit, ) { } @@ -27,11 +30,15 @@ export class PasswordResetInitComponent implements OnInit, AfterViewInit { this.emailField.nativeElement.focus(); } + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } + requestReset() { this.error = null; this.errorEmailNotExists = null; - this.passwordResetInit.save(this.resetAccount.email).subscribe(() => { + this.subscriptions.add(this.passwordResetInit.save(this.resetAccount.email).subscribe(() => { this.success = 'OK'; }, (response) => { this.success = null; @@ -40,6 +47,6 @@ export class PasswordResetInitComponent implements OnInit, AfterViewInit { } else { this.error = 'ERROR'; } - }); + })); } } diff --git a/src/main/webapp/app/account/password/password.component.html b/src/main/webapp/app/account/password/password.component.html index 7469aed13..35806da1f 100644 --- a/src/main/webapp/app/account/password/password.component.html +++ b/src/main/webapp/app/account/password/password.component.html @@ -1,7 +1,7 @@
-

diff --git a/src/main/webapp/app/account/password/password.component.ts b/src/main/webapp/app/account/password/password.component.ts index e13b84b56..71995c43c 100644 --- a/src/main/webapp/app/account/password/password.component.ts +++ b/src/main/webapp/app/account/password/password.component.ts @@ -1,30 +1,31 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { Principal } from '../../shared'; import { Password } from './password.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'jhi-password', templateUrl: './password.component.html', }) -export class PasswordComponent implements OnInit { +export class PasswordComponent implements OnDestroy { doNotMatch: string; weakPassword: string; error: string; success: string; - account: any; password: string; confirmPassword: string; + private subscriptions = new Subscription(); + constructor( - private passwordService: Password, - private principal: Principal, + private passwordService: Password, + public principal: Principal, ) { } - ngOnInit() { - this.principal.identity() - .then((account) => this.account = account); + ngOnDestroy() { + this.subscriptions.unsubscribe(); } changePassword() { @@ -40,12 +41,10 @@ export class PasswordComponent implements OnInit { } if (this.weakPassword == null && this.doNotMatch == null) { - this.passwordService.save(this.password) - .subscribe(() => { - this.success = 'OK'; - }, () => { - this.error = 'ERROR'; - }); + this.subscriptions.add(this.passwordService.save(this.password).subscribe( + () => this.success = 'OK', + () => this.error = 'ERROR', + )); } } } diff --git a/src/main/webapp/app/account/password/password.route.ts b/src/main/webapp/app/account/password/password.route.ts index a18d5b77b..402731285 100644 --- a/src/main/webapp/app/account/password/password.route.ts +++ b/src/main/webapp/app/account/password/password.route.ts @@ -1,14 +1,14 @@ import { Route } from '@angular/router'; import { UserRouteAccessService } from '../../shared'; -import { PROJECT_ADMIN, SYSTEM_ADMIN } from '../../shared/constants/common.constants'; +import { PROJECT_ADMIN, SYSTEM_ADMIN, ORGANIZATION_ADMIN} from '../../shared/constants/common.constants'; import { PasswordComponent } from './password.component'; export const passwordRoute: Route = { path: 'password', component: PasswordComponent, data: { - authorities: [SYSTEM_ADMIN, PROJECT_ADMIN, 'ROLE_USER'], + authorities: [SYSTEM_ADMIN, PROJECT_ADMIN, ORGANIZATION_ADMIN], pageTitle: 'global.menu.account.password', }, canActivate: [UserRouteAccessService], diff --git a/src/main/webapp/app/account/settings/settings.component.html b/src/main/webapp/app/account/settings/settings.component.html index dea20c382..dbf986264 100644 --- a/src/main/webapp/app/account/settings/settings.component.html +++ b/src/main/webapp/app/account/settings/settings.component.html @@ -84,7 +84,7 @@
-
+
- + + + + + + + + -
- - - - - - + + + + +
{{logger.name | slice:0:140}} + + + + + +
- - {{logger.name | slice:0:140}} - - - - - - - - - + +
diff --git a/src/main/webapp/app/admin/logs/logs.component.ts b/src/main/webapp/app/admin/logs/logs.component.ts index be1ce43a7..fd46fe072 100644 --- a/src/main/webapp/app/admin/logs/logs.component.ts +++ b/src/main/webapp/app/admin/logs/logs.component.ts @@ -1,50 +1,128 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { Log } from './log.model'; import { LogsService } from './logs.service'; +import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; +import { debounceTime, distinctUntilChanged, map, share, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; +import { regularSortOrder, SortOrder, SortOrderImpl } from '../../shared/util/sort-util'; +import { ITEMS_PER_PAGE } from '../../shared'; @Component({ selector: 'jhi-logs', + changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './logs.component.html', }) -export class LogsComponent implements OnInit { +export class LogsComponent implements OnInit, OnDestroy { + private _loggers$: BehaviorSubject = new BehaviorSubject([]); + loggerView$: Observable + loggersFiltered$: Observable + filter$ = new BehaviorSubject(''); + sortOrder$: Observable; + page$: BehaviorSubject = new BehaviorSubject(0); + itemsPerPage: number; - loggers: Log[]; - filter: string; - orderProp: string; - reverse: boolean; + private _sortOrder$ = new BehaviorSubject({predicate: '', ascending: true}); + private subscriptions = new Subscription(); constructor( - private logsService: LogsService, + private logsService: LogsService, ) { - this.filter = ''; - this.orderProp = 'name'; - this.reverse = false; + this.sortOrder$ = this._sortOrder$.pipe(regularSortOrder('name')); + this.itemsPerPage = ITEMS_PER_PAGE; + + this.loggersFiltered$ = this.filterLoggers(this._loggers$).pipe( + shareReplay({ + bufferSize: 1, + refCount: true, + }), + ); + + this.loggerView$ = this.viewLoggers(this.loggersFiltered$); + } + + private filterLoggers(loggers$: Observable): Observable { + return combineLatest([ + loggers$, + this.cleanedFilter$, + ]).pipe( + map(([loggers, filters]) => { + if (filters.length === 0) { + return loggers; + } else { + return loggers.filter(l => { + const name: string = l.name.toLowerCase(); + return filters.every(f => name.includes(f)); + }); + } + }), + ); + } + + private get cleanedFilter$(): Observable { + return this.filter$.pipe( + debounceTime(200), + map(f => { + const clean = f.toLowerCase().trim(); + if (clean) { + return clean.split(/ +/); + } else { + return [] as string[]; + } + }), + distinctUntilChanged((a, b) => a.join(' ') === b.join(' ')), + ); + } + + private viewLoggers(loggers$: Observable): Observable { + return combineLatest([ + loggers$, + this.sortOrder$, + ]).pipe( + map(([loggers, sortOrder]) => sortOrder.sort(loggers)), + switchMap(loggers => this.page$.pipe( + map(page => loggers.slice(0, (page + 1) * this.itemsPerPage)), + )), + ); + } + + loadMore() { + this.page$.next(this.page$.value + 1); } ngOnInit() { - this.logsService.findAll().subscribe((loggers) => this.loggers = loggers); + this.subscriptions.add(this.logsService.findAll().subscribe( + (loggers) => this._loggers$.next(loggers)), + ); + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + this._loggers$.complete(); + this.filter$.complete(); + this.page$.complete(); + this._sortOrder$.complete(); + } + + sort(sortOrder: SortOrder) { + this.page$.next(0); + this._sortOrder$.next(sortOrder); + } + + changeFilter(filter: string) { + this.page$.next(0); + this.filter$.next(filter); } changeLevel(name: string, level: string) { const log = new Log(name, level); - this.logsService.changeLevel(log).subscribe(() => { - this.logsService.findAll().subscribe((loggers) => this.loggers = loggers); - }); - } - - get filteredAndOrderedLoggers() { - let filtered = !this.filter - ? this.loggers - : this.loggers.filter(l => - l.name.toLowerCase().includes(this.filter.toLowerCase())); - return filtered.sort((a, b) => { - if (a[this.orderProp] < b[this.orderProp]) { - return this.reverse ? -1 : 1; - } else if (a[this.orderProp] > b[this.orderProp]) { - return this.reverse ? 1 : -1; - } - return 0; - }); + this.subscriptions.add(this.logsService.changeLevel(log).pipe( + switchMap(() => this.logsService.findAll()), + ).subscribe( + (loggers) => this._loggers$.next(loggers), + )); + } + + trackByLoggerName(index: number, logger: Log): string { + return logger.name; } } diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html new file mode 100644 index 000000000..c60f138ac --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html @@ -0,0 +1,33 @@ + + +

Memory

+ +
+
+ + {{ entry.key }} + ({{ entry.value.used / 1048576 | number: '1.0-0' }}M / {{ entry.value.max / 1048576 | number: '1.0-0' }}M) + + +
Committed : {{ entry.value.committed / 1048576 | number: '1.0-0' }}M
+ + {{ entry.key }} {{ entry.value.used / 1048576 | number: '1.0-0' }}M + + + {{ (entry.value.used * 100) / entry.value.max | number: '1.0-0' }}% + +
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts new file mode 100644 index 000000000..1fc0f2c9a --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { Component, Input } from '@angular/core'; + +import { JvmMetrics } from '../../metrics.model'; + +@Component({ + selector: 'jhi-jvm-memory', + templateUrl: './jvm-memory.component.html', +}) +export class JvmMemoryComponent { + /** + * object containing all jvm memory metrics + */ + @Input() jvmMemoryMetrics?: { [key: string]: JvmMetrics }; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html new file mode 100644 index 000000000..b17d20eb2 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html @@ -0,0 +1,64 @@ + + +

Threads

+ +Runnable {{ threadStats.threadDumpRunnable }} + + + {{ (threadStats.threadDumpRunnable * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Timed Waiting ({{ threadStats.threadDumpTimedWaiting }}) + + + {{ (threadStats.threadDumpTimedWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Waiting ({{ threadStats.threadDumpWaiting }}) + + + {{ (threadStats.threadDumpWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Blocked ({{ threadStats.threadDumpBlocked }}) + + + {{ (threadStats.threadDumpBlocked * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +
Total: {{ threadStats.threadDumpAll }}
+ + diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts new file mode 100644 index 000000000..659372ed6 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { Component, Input } from '@angular/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { Thread, ThreadState } from 'app/admin/metrics/metrics.model'; +import { MetricsModalThreadsComponent } from '../metrics-modal-threads/metrics-modal-threads.component'; + +@Component({ + selector: 'jhi-jvm-threads', + templateUrl: './jvm-threads.component.html', +}) +export class JvmThreadsComponent { + threadStats = { + threadDumpAll: 0, + threadDumpRunnable: 0, + threadDumpTimedWaiting: 0, + threadDumpWaiting: 0, + threadDumpBlocked: 0, + }; + + @Input() + set threads(threads: Thread[] | undefined) { + this._threads = threads; + + threads?.forEach(thread => { + if (thread.threadState === ThreadState.Runnable) { + this.threadStats.threadDumpRunnable += 1; + } else if (thread.threadState === ThreadState.Waiting) { + this.threadStats.threadDumpWaiting += 1; + } else if (thread.threadState === ThreadState.TimedWaiting) { + this.threadStats.threadDumpTimedWaiting += 1; + } else if (thread.threadState === ThreadState.Blocked) { + this.threadStats.threadDumpBlocked += 1; + } + }); + + this.threadStats.threadDumpAll = + this.threadStats.threadDumpRunnable + + this.threadStats.threadDumpWaiting + + this.threadStats.threadDumpTimedWaiting + + this.threadStats.threadDumpBlocked; + } + + get threads(): Thread[] | undefined { + return this._threads; + } + + private _threads: Thread[] | undefined; + + constructor(private modalService: NgbModal) {} + + open(): void { + const modalRef = this.modalService.open(MetricsModalThreadsComponent); + modalRef.componentInstance.threads = this.threads; + } +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html new file mode 100644 index 000000000..8424b9bb0 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html @@ -0,0 +1,51 @@ + + +

Cache statistics

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cache nameCache HitsCache MissesCache GetsCache PutsCache RemovalsCache EvictionsCache Hit %Cache Miss %
{{ entry.key }}{{ entry.value['cache.gets.hit'] }}{{ entry.value['cache.gets.miss'] }}{{ entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'] }}{{ entry.value['cache.puts'] }}{{ entry.value['cache.removals'] }}{{ entry.value['cache.evictions'] }} + {{ + filterNaN((100 * entry.value['cache.gets.hit']) / (entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'])) + | number: '1.0-4' + }} + + {{ + filterNaN((100 * entry.value['cache.gets.miss']) / (entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'])) + | number: '1.0-4' + }} +
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts new file mode 100644 index 000000000..eba92d6a6 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { CacheMetrics } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-cache', + templateUrl: './metrics-cache.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsCacheComponent { + /** + * object containing all cache related metrics + */ + @Input() cacheMetrics?: { [key: string]: CacheMetrics }; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html new file mode 100644 index 000000000..d1025b0b3 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html @@ -0,0 +1,66 @@ + + +

DataSource statistics (time in millisecond)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Connection Pool Usage (active: {{ datasourceMetrics.active.value }}, + min: {{ datasourceMetrics.min.value }}, max: {{ datasourceMetrics.max.value }}, idle: {{ datasourceMetrics.idle.value }}) + CountMeanMinp50p75p95p99Max
Acquire{{ datasourceMetrics.acquire.count }}{{ filterNaN(datasourceMetrics.acquire.mean) | number: '1.0-2' }}{{ datasourceMetrics.acquire['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.acquire.max) | number: '1.0-2' }}
Creation{{ datasourceMetrics.creation.count }}{{ filterNaN(datasourceMetrics.creation.mean) | number: '1.0-2' }}{{ datasourceMetrics.creation['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.creation.max) | number: '1.0-2' }}
Usage{{ datasourceMetrics.usage.count }}{{ filterNaN(datasourceMetrics.usage.mean) | number: '1.0-2' }}{{ datasourceMetrics.usage['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.usage.max) | number: '1.0-2' }}
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts new file mode 100644 index 000000000..dbf60d40d --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { Databases } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-datasource', + templateUrl: './metrics-datasource.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsDatasourceComponent { + /** + * object containing all datasource related metrics + */ + @Input() datasourceMetrics?: Databases; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html new file mode 100644 index 000000000..551c9fe8e --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html @@ -0,0 +1,33 @@ + + +

Endpoints requests (time in millisecond)

+ +
+ + + + + + + + + + + + + + + + + + + +
MethodEndpoint urlCountMean
{{ method.key }}{{ entry.key }}{{ method.value!.count }}{{ method.value!.mean | number: '1.0-3' }}
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts new file mode 100644 index 000000000..78f81fdef --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { Component, Input } from '@angular/core'; + +import { Services } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-endpoints-requests', + templateUrl: './metrics-endpoints-requests.component.html', +}) +export class MetricsEndpointsRequestsComponent { + /** + * object containing service related metrics + */ + @Input() endpointsRequestsMetrics?: Services; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html new file mode 100644 index 000000000..6a9fa39e7 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html @@ -0,0 +1,101 @@ + + +

Garbage collector statistics

+ +
+
+
+ + GC Live Data Size/GC Max Data Size ({{ garbageCollectorMetrics['jvm.gc.live.data.size'] / 1048576 | number: '1.0-0' }}M / + {{ garbageCollectorMetrics['jvm.gc.max.data.size'] / 1048576 | number: '1.0-0' }}M) + + + + + {{ + (100 * garbageCollectorMetrics['jvm.gc.live.data.size']) / garbageCollectorMetrics['jvm.gc.max.data.size'] | number: '1.0-2' + }}% + + +
+
+ +
+
+ + GC Memory Promoted/GC Memory Allocated ({{ garbageCollectorMetrics['jvm.gc.memory.promoted'] / 1048576 | number: '1.0-0' }}M / + {{ garbageCollectorMetrics['jvm.gc.memory.allocated'] / 1048576 | number: '1.0-0' }}M) + + + + + {{ + (100 * garbageCollectorMetrics['jvm.gc.memory.promoted']) / garbageCollectorMetrics['jvm.gc.memory.allocated'] + | number: '1.0-2' + }}% + + +
+
+ +
+
+
Classes loaded
+
{{ garbageCollectorMetrics.classesLoaded }}
+
+
+
Classes unloaded
+
{{ garbageCollectorMetrics.classesUnloaded }}
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountMeanMinp50p75p95p99Max
jvm.gc.pause{{ garbageCollectorMetrics['jvm.gc.pause'].count }}{{ garbageCollectorMetrics['jvm.gc.pause'].mean | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.0'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.5'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.75'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.95'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.99'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause'].max | number: '1.0-3' }}
+
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts new file mode 100644 index 000000000..cdc9dfa0e --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { Component, Input } from '@angular/core'; + +import { GarbageCollector } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-garbagecollector', + templateUrl: './metrics-garbagecollector.component.html', +}) +export class MetricsGarbageCollectorComponent { + /** + * object containing garbage collector related metrics + */ + @Input() garbageCollectorMetrics?: GarbageCollector; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html new file mode 100644 index 000000000..f27f59081 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html @@ -0,0 +1,91 @@ + + + + + + diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts new file mode 100644 index 000000000..d1a793687 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { Thread, ThreadState } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-thread-modal', + templateUrl: './metrics-modal-threads.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsModalThreadsComponent implements OnInit { + ThreadState = ThreadState; + threadStateFilter?: ThreadState; + threads?: Thread[]; + threadDumpAll = 0; + threadDumpBlocked = 0; + threadDumpRunnable = 0; + threadDumpTimedWaiting = 0; + threadDumpWaiting = 0; + + constructor(private activeModal: NgbActiveModal) {} + + ngOnInit(): void { + this.threads?.forEach(thread => { + if (thread.threadState === ThreadState.Runnable) { + this.threadDumpRunnable += 1; + } else if (thread.threadState === ThreadState.Waiting) { + this.threadDumpWaiting += 1; + } else if (thread.threadState === ThreadState.TimedWaiting) { + this.threadDumpTimedWaiting += 1; + } else if (thread.threadState === ThreadState.Blocked) { + this.threadDumpBlocked += 1; + } + }); + + this.threadDumpAll = this.threadDumpRunnable + this.threadDumpWaiting + this.threadDumpTimedWaiting + this.threadDumpBlocked; + } + + getBadgeClass(threadState: ThreadState): string { + if (threadState === ThreadState.Runnable) { + return 'badge-success'; + } else if (threadState === ThreadState.Waiting) { + return 'badge-info'; + } else if (threadState === ThreadState.TimedWaiting) { + return 'badge-warning'; + } else if (threadState === ThreadState.Blocked) { + return 'badge-danger'; + } + return ''; + } + + getThreads(): Thread[] { + return this.threads?.filter(thread => !this.threadStateFilter || thread.threadState === this.threadStateFilter) ?? []; + } + + dismiss(): void { + this.activeModal.dismiss(); + } +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html new file mode 100644 index 000000000..acb7f442a --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html @@ -0,0 +1,35 @@ + + +

HTTP requests (time in millisecond)

+ + + + + + + + + + + + + + + + + + +
CodeCountMeanMax
{{ entry.key }} + + {{ entry.value.count }} + + + {{ filterNaN(entry.value.mean) | number: '1.0-2' }} + {{ entry.value.max | number: '1.0-2' }}
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts new file mode 100644 index 000000000..044ed2eee --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { HttpServerRequests } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-request', + templateUrl: './metrics-request.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsRequestComponent { + /** + * object containing http request related metrics + */ + @Input() requestMetrics?: HttpServerRequests; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html new file mode 100644 index 000000000..6274a375f --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html @@ -0,0 +1,60 @@ + + +

System

+ + +
+
Uptime
+
{{ convertMillisecondsToDuration(systemMetrics['process.uptime']) }}
+
+ +
+
Start time
+
{{ systemMetrics['process.start.time'] | date: 'full' }}
+
+ +
+
Process CPU usage
+
{{ 100 * systemMetrics['process.cpu.usage'] | number: '1.0-2' }} %
+
+ + + {{ 100 * systemMetrics['process.cpu.usage'] | number: '1.0-2' }} % + + +
+
System CPU usage
+
{{ 100 * systemMetrics['system.cpu.usage'] | number: '1.0-2' }} %
+
+ + + {{ 100 * systemMetrics['system.cpu.usage'] | number: '1.0-2' }} % + + +
+
System CPU count
+
{{ systemMetrics['system.cpu.count'] }}
+
+ +
+
System 1m Load average
+
{{ systemMetrics['system.load.average.1m'] | number: '1.0-2' }}
+
+ +
+
Process files max
+
{{ systemMetrics['process.files.max'] | number: '1.0-0' }}
+
+ +
+
Process files open
+
{{ systemMetrics['process.files.open'] | number: '1.0-0' }}
+
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts new file mode 100644 index 000000000..235a99ba2 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { ProcessMetrics } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-system', + templateUrl: './metrics-system.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsSystemComponent { + /** + * object containing thread related metrics + */ + @Input() systemMetrics?: ProcessMetrics; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + convertMillisecondsToDuration(ms: number): string { + const times = { + year: 31557600000, + month: 2629746000, + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000, + }; + let timeString = ''; + for (const [key, value] of Object.entries(times)) { + if (Math.floor(ms / value) > 0) { + let plural = ''; + if (Math.floor(ms / value) > 1) { + plural = 's'; + } + timeString += `${Math.floor(ms / value).toString()} ${key.toString()}${plural} `; + ms = ms - value * Math.floor(ms / value); + } + } + return timeString; + } +} diff --git a/src/main/webapp/app/admin/metrics/metrics-modal.component.html b/src/main/webapp/app/admin/metrics/metrics-modal.component.html deleted file mode 100644 index e5dfb326b..000000000 --- a/src/main/webapp/app/admin/metrics/metrics-modal.component.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - diff --git a/src/main/webapp/app/admin/metrics/metrics-modal.component.ts b/src/main/webapp/app/admin/metrics/metrics-modal.component.ts deleted file mode 100644 index d824a5a2a..000000000 --- a/src/main/webapp/app/admin/metrics/metrics-modal.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'jhi-metrics-modal', - templateUrl: './metrics-modal.component.html', -}) -export class JhiMetricsMonitoringModalComponent implements OnInit { - - threadDumpFilter: any; - threadDump: any; - threadDumpAll = 0; - threadDumpBlocked = 0; - threadDumpRunnable = 0; - threadDumpTimedWaiting = 0; - threadDumpWaiting = 0; - - constructor( - public activeModal: NgbActiveModal, - ) { - } - - ngOnInit() { - this.threadDump.forEach((value) => { - if (value.threadState === 'RUNNABLE') { - this.threadDumpRunnable += 1; - } else if (value.threadState === 'WAITING') { - this.threadDumpWaiting += 1; - } else if (value.threadState === 'TIMED_WAITING') { - this.threadDumpTimedWaiting += 1; - } else if (value.threadState === 'BLOCKED') { - this.threadDumpBlocked += 1; - } - }); - this.threadDumpAll = this.threadDumpRunnable + this.threadDumpWaiting + - this.threadDumpTimedWaiting + this.threadDumpBlocked; - } - - getBadgeClass(threadState) { - if (threadState === 'RUNNABLE') { - return 'badge-success'; - } else if (threadState === 'WAITING') { - return 'badge-info'; - } else if (threadState === 'TIMED_WAITING') { - return 'badge-warning'; - } else if (threadState === 'BLOCKED') { - return 'badge-danger'; - } - } - - get threads(): any[] { - let state = this.threadDumpFilter && this.threadDumpFilter.threadState; - return this.threadDump.filter(t => !state || t.threadState === state); - } -} diff --git a/src/main/webapp/app/admin/metrics/metrics.component.html b/src/main/webapp/app/admin/metrics/metrics.component.html index 7c1779cce..e338fcf65 100644 --- a/src/main/webapp/app/admin/metrics/metrics.component.html +++ b/src/main/webapp/app/admin/metrics/metrics.component.html @@ -1,215 +1,51 @@

- + Application Metrics +

-

-
-
- -

({{metrics.gauges['jvm.memory.total.used'].value / 1000000 | number:'1.0-0'}}M / {{metrics.gauges['jvm.memory.total.max'].value / 1000000 | number:'1.0-0'}}M)

- - {{metrics.gauges['jvm.memory.total.used'].value * 100 / metrics.gauges['jvm.memory.total.max'].value | number:'1.0-0'}}% - -

({{metrics.gauges['jvm.memory.heap.used'].value / 1000000 | number:'1.0-0'}}M / {{metrics.gauges['jvm.memory.heap.max'].value / 1000000 | number:'1.0-0'}}M)

- - {{metrics.gauges['jvm.memory.heap.used'].value * 100 / metrics.gauges['jvm.memory.heap.max'].value | number:'1.0-0'}}% - -

({{metrics.gauges['jvm.memory.non-heap.used'].value / 1000000 | number:'1.0-0'}}M / {{metrics.gauges['jvm.memory.non-heap.committed'].value / 1000000 | number:'1.0-0'}}M)

- - {{metrics.gauges['jvm.memory.non-heap.used'].value * 100 / metrics.gauges['jvm.memory.non-heap.committed'].value | number:'1.0-0'}}% - -
-
- (Total: {{metrics.gauges['jvm.threads.count'].value}}) -

{{metrics.gauges['jvm.threads.runnable.count'].value}}

- - {{metrics.gauges['jvm.threads.runnable.count'].value * 100 / metrics.gauges['jvm.threads.count'].value | number:'1.0-0'}}% - -

({{metrics.gauges['jvm.threads.timed_waiting.count'].value}})

- - {{metrics.gauges['jvm.threads.timed_waiting.count'].value * 100 / metrics.gauges['jvm.threads.count'].value | number:'1.0-0'}}% - -

({{metrics.gauges['jvm.threads.waiting.count'].value}})

- - {{metrics.gauges['jvm.threads.waiting.count'].value * 100 / metrics.gauges['jvm.threads.count'].value | number:'1.0-0'}}% - -

({{metrics.gauges['jvm.threads.blocked.count'].value}})

- - {{metrics.gauges['jvm.threads.blocked.count'].value * 100 / metrics.gauges['jvm.threads.count'].value | number:'1.0-0'}}% - -
-
- -
-
-
{{metrics.gauges['jvm.garbage.PS-MarkSweep.count'].value}}
-
-
-
-
{{metrics.gauges['jvm.garbage.PS-MarkSweep.time'].value}}ms
-
-
-
-
{{metrics.gauges['jvm.garbage.PS-Scavenge.count'].value}}
-
-
-
-
{{metrics.gauges['jvm.garbage.PS-Scavenge.time'].value}}ms
-
-
-
-
+

JVM Metrics

+ +
+ + + + + +
+ + + +
Updating...
+ + + + -

-

- {{metrics.counters['com.codahale.metrics.servlet.InstrumentedFilter.activeRequests'].count | number:'1.0-0'}} - {{metrics.timers['com.codahale.metrics.servlet.InstrumentedFilter.requests'].count | number:'1.0-0'}} -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(1 min) (5 min) (15 min)
- - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.ok'].count}} - - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.ok'].mean_rate | number:'1.0-2'}} - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.ok'].m1_rate | number:'1.0-2'}} - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.ok'].m5_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.ok'].m15_rate | number:'1.0-2'}} -
- - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.notFound'].count}} - - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.notFound'].mean_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.notFound'].m1_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.notFound'].m5_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.notFound'].m15_rate | number:'1.0-2'}} -
- - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.serverError'].count}} - - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.serverError'].mean_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.serverError'].m1_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.serverError'].m5_rate | number:'1.0-2'}} - - {{metrics.meters['com.codahale.metrics.servlet.InstrumentedFilter.responseCodes.serverError'].m15_rate | number:'1.0-2'}} -
-
+ -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{entry.key}}{{entry.value.count}}{{entry.value.mean * 1000 | number:'1.0-0'}}{{entry.value.min * 1000 | number:'1.0-0'}}{{entry.value.p50 * 1000 | number:'1.0-0'}}{{entry.value.p75 * 1000 | number:'1.0-0'}}{{entry.value.p95 * 1000 | number:'1.0-0'}}{{entry.value.p99 * 1000 | number:'1.0-0'}}{{entry.value.max * 1000 | number:'1.0-0'}}
-
- -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
({{metrics.gauges['HikariPool-1.pool.ActiveConnections'].value}} / {{metrics.gauges['HikariPool-1.pool.TotalConnections'].value}})
-
- - {{metrics.gauges['HikariPool-1.pool.ActiveConnections'].value * 100 / metrics.gauges['HikariPool-1.pool.TotalConnections'].value | number:'1.0-0'}}% - -
-
{{metrics.histograms['HikariPool-1.pool.Usage'].count}}{{metrics.histograms['HikariPool-1.pool.Usage'].mean | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].min | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].p50 | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].p75 | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].p95 | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].p99 | number:'1.0-2'}}{{metrics.histograms['HikariPool-1.pool.Usage'].max | number:'1.0-2'}}
-
+
diff --git a/src/main/webapp/app/admin/metrics/metrics.component.ts b/src/main/webapp/app/admin/metrics/metrics.component.ts index 83d052ccd..2c18eb508 100644 --- a/src/main/webapp/app/admin/metrics/metrics.component.ts +++ b/src/main/webapp/app/admin/metrics/metrics.component.ts @@ -1,72 +1,39 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Component, OnInit, ChangeDetectorRef } from '@angular/core'; +import { combineLatest } from 'rxjs'; -import { JhiMetricsMonitoringModalComponent } from './metrics-modal.component'; import { JhiMetricsService } from './metrics.service'; -import { HttpResponse } from '@angular/common/http'; +import { Metrics, Thread } from './metrics.model'; @Component({ selector: 'jhi-metrics', templateUrl: './metrics.component.html', }) export class JhiMetricsMonitoringComponent implements OnInit { - metrics: any = {}; - cachesStats: any = {}; - servicesStats: any = {}; + metrics?: Metrics; + threads?: Thread[]; updatingMetrics = true; - JCACHE_KEY: string; - constructor( - private modalService: NgbModal, - private metricsService: JhiMetricsService, - ) { - this.JCACHE_KEY = 'jcache.statistics'; - } + constructor(private metricsService: JhiMetricsService, private changeDetector: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.refresh(); } - refresh() { + refresh(): void { this.updatingMetrics = true; - this.metricsService.getMetrics().subscribe((response: HttpResponse) => { - this.metrics = response.body; + combineLatest([this.metricsService.getMetrics(), this.metricsService.threadDump()]).subscribe(([metrics, threadDump]) => { + this.metrics = metrics; + this.threads = threadDump.threads; this.updatingMetrics = false; - this.servicesStats = {}; - this.cachesStats = {}; - Object.keys(this.metrics.timers).forEach((key) => { - const value = this.metrics.timers[key]; - if (key.indexOf('web.rest') !== -1 || key.indexOf('service') !== -1) { - this.servicesStats[key] = value; - } - }); - Object.keys(this.metrics.gauges).forEach((key) => { - if (key.indexOf('jcache.statistics') !== -1) { - const value = this.metrics.gauges[key].value; - // remove gets or puts - const index = key.lastIndexOf('.'); - const newKey = key.substr(0, index); - - // Keep the name of the domain - this.cachesStats[newKey] = { - 'name': this.JCACHE_KEY.length, - 'value': value, - }; - } - }); + this.changeDetector.markForCheck(); }); } - refreshThreadDumpData() { - this.metricsService.threadDump().subscribe((data) => { - const modalRef = this.modalService.open(JhiMetricsMonitoringModalComponent, {size: 'lg'}); - modalRef.componentInstance.threadDump = data; - modalRef.result.then((result) => { - // Left blank intentionally, nothing to do here - }, (reason) => { - // Left blank intentionally, nothing to do here - }); - }); + metricsKeyExists(key: keyof Metrics): boolean { + return Boolean(this.metrics?.[key]); } + metricsKeyExistsAndObjectNotEmpty(key: keyof Metrics): boolean { + return Boolean(this.metrics?.[key] && JSON.stringify(this.metrics[key]) !== '{}'); + } } diff --git a/src/main/webapp/app/admin/metrics/metrics.model.ts b/src/main/webapp/app/admin/metrics/metrics.model.ts new file mode 100644 index 000000000..6d88be1f3 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.model.ts @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +export interface Metrics { + jvm: { [key: string]: JvmMetrics }; + databases: Databases; + 'http.server.requests': HttpServerRequests; + cache: { [key: string]: CacheMetrics }; + garbageCollector: GarbageCollector; + services: Services; + processMetrics: ProcessMetrics; +} + +export interface JvmMetrics { + committed: number; + max: number; + used: number; +} + +export interface Databases { + min: Value; + idle: Value; + max: Value; + usage: MetricsWithPercentile; + pending: Value; + active: Value; + acquire: MetricsWithPercentile; + creation: MetricsWithPercentile; + connections: Value; +} + +export interface Value { + value: number; +} + +export interface MetricsWithPercentile { + '0.0': number; + '1.0': number; + max: number; + totalTime: number; + mean: number; + '0.5': number; + count: number; + '0.99': number; + '0.75': number; + '0.95': number; +} + +export interface HttpServerRequests { + all: { + count: number; + }; + percode: { [key: string]: MaxMeanCount }; +} + +export interface MaxMeanCount { + max: number; + mean: number; + count: number; +} + +export interface CacheMetrics { + 'cache.gets.miss': number; + 'cache.puts': number; + 'cache.gets.hit': number; + 'cache.removals': number; + 'cache.evictions': number; +} + +export interface GarbageCollector { + 'jvm.gc.max.data.size': number; + 'jvm.gc.pause': MetricsWithPercentile; + 'jvm.gc.memory.promoted': number; + 'jvm.gc.memory.allocated': number; + classesLoaded: number; + 'jvm.gc.live.data.size': number; + classesUnloaded: number; +} + +export interface Services { + [key: string]: { + [key in HttpMethod]?: MaxMeanCount; + }; +} + +export enum HttpMethod { + Post = 'POST', + Get = 'GET', + Put = 'PUT', + Patch = 'PATCH', + Delete = 'DELETE', +} + +export interface ProcessMetrics { + 'system.cpu.usage': number; + 'system.cpu.count': number; + 'system.load.average.1m'?: number; + 'process.cpu.usage': number; + 'process.files.max'?: number; + 'process.files.open'?: number; + 'process.start.time': number; + 'process.uptime': number; +} + +export interface ThreadDump { + threads: Thread[]; +} + +export interface Thread { + threadName: string; + threadId: number; + blockedTime: number; + blockedCount: number; + waitedTime: number; + waitedCount: number; + lockName: string | null; + lockOwnerId: number; + lockOwnerName: string | null; + daemon: boolean; + inNative: boolean; + suspended: boolean; + threadState: ThreadState; + priority: number; + stackTrace: StackTrace[]; + lockedMonitors: LockedMonitor[]; + lockedSynchronizers: string[]; + lockInfo: LockInfo | null; + // custom field for showing-hiding thread dump + showThreadDump?: boolean; +} + +export interface LockInfo { + className: string; + identityHashCode: number; +} + +export interface LockedMonitor { + className: string; + identityHashCode: number; + lockedStackDepth: number; + lockedStackFrame: StackTrace; +} + +export interface StackTrace { + classLoaderName: string | null; + moduleName: string | null; + moduleVersion: string | null; + methodName: string; + fileName: string; + lineNumber: number; + className: string; + nativeMethod: boolean; +} + +export enum ThreadState { + Runnable = 'RUNNABLE', + TimedWaiting = 'TIMED_WAITING', + Waiting = 'WAITING', + Blocked = 'BLOCKED', + New = 'NEW', + Terminated = 'TERMINATED', +} diff --git a/src/main/webapp/app/admin/metrics/metrics.module.ts b/src/main/webapp/app/admin/metrics/metrics.module.ts new file mode 100644 index 000000000..f5ec7e268 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.module.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { ManagementPortalSharedModule } from 'app/shared/shared.module'; +import { JhiMetricsMonitoringComponent } from './metrics.component'; +import { metricsRoute } from './metrics.route'; +import { JvmMemoryComponent } from './blocks/jvm-memory/jvm-memory.component'; +import { JvmThreadsComponent } from './blocks/jvm-threads/jvm-threads.component'; +import { MetricsCacheComponent } from './blocks/metrics-cache/metrics-cache.component'; +import { MetricsDatasourceComponent } from './blocks/metrics-datasource/metrics-datasource.component'; +import { MetricsEndpointsRequestsComponent } from './blocks/metrics-endpoints-requests/metrics-endpoints-requests.component'; +import { MetricsGarbageCollectorComponent } from './blocks/metrics-garbagecollector/metrics-garbagecollector.component'; +import { MetricsModalThreadsComponent } from './blocks/metrics-modal-threads/metrics-modal-threads.component'; +import { MetricsRequestComponent } from './blocks/metrics-request/metrics-request.component'; +import { MetricsSystemComponent } from './blocks/metrics-system/metrics-system.component'; + +@NgModule({ + imports: [ManagementPortalSharedModule, RouterModule.forChild([metricsRoute])], + declarations: [ + JhiMetricsMonitoringComponent, + JvmMemoryComponent, + JvmThreadsComponent, + MetricsCacheComponent, + MetricsDatasourceComponent, + MetricsEndpointsRequestsComponent, + MetricsGarbageCollectorComponent, + MetricsModalThreadsComponent, + MetricsRequestComponent, + MetricsSystemComponent, + ], +}) +export class MetricsModule {} diff --git a/src/main/webapp/app/admin/metrics/metrics.service.ts b/src/main/webapp/app/admin/metrics/metrics.service.ts index 932f08485..b4d95f8b4 100644 --- a/src/main/webapp/app/admin/metrics/metrics.service.ts +++ b/src/main/webapp/app/admin/metrics/metrics.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; +import { Metrics, ThreadDump } from "./metrics.model"; @Injectable({ providedIn: 'root' }) export class JhiMetricsService { @@ -8,11 +9,11 @@ export class JhiMetricsService { constructor(private http: HttpClient) { } - getMetrics(): Observable> { - return this.http.get('management/metrics', { observe: 'response'}) as Observable>; + getMetrics(): Observable { + return this.http.get('management/jhimetrics'); } - threadDump(): Observable { - return this.http.get('management/dump'); + threadDump(): Observable { + return this.http.get('management/threaddump'); } } diff --git a/src/main/webapp/app/admin/user-management/role.component.html b/src/main/webapp/app/admin/user-management/role.component.html index 8e0d1365d..61cb6793c 100644 --- a/src/main/webapp/app/admin/user-management/role.component.html +++ b/src/main/webapp/app/admin/user-management/role.component.html @@ -11,19 +11,22 @@

- + - + {{role.authorityName}}
{{role.projectName}}
+
+ {{role.organizationName}} +
- + @@ -31,33 +34,48 @@

-
+
- - - - - + + + + + - - - + + + + +
- - - - - -
+ + + + + + +
diff --git a/src/main/webapp/app/admin/user-management/role.component.ts b/src/main/webapp/app/admin/user-management/role.component.ts index 10ea82fdb..0f6907157 100644 --- a/src/main/webapp/app/admin/user-management/role.component.ts +++ b/src/main/webapp/app/admin/user-management/role.component.ts @@ -1,44 +1,112 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { HttpResponse } from '@angular/common/http'; -import { Subscription } from 'rxjs'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { AuthorityService, Project, ProjectService } from '../../shared'; +import { + Authority, + AuthorityService, + Organization, + OrganizationService, + Project, + ProjectService, + Scope +} from '../../shared'; import { AlertService } from '../../shared/util/alert.service'; import { EventManager } from '../../shared/util/event-manager.service'; import { Role } from './role.model'; +import { BehaviorSubject, combineLatest, Observable, Subscription } from "rxjs"; +import { distinctUntilChanged, map, skip, take } from "rxjs/operators"; @Component({ selector: 'jhi-user-role', templateUrl: './role.component.html', }) -export class RoleComponent implements OnInit { - @Input() roles: Role[]; - eventSubscriber: Subscription; - authorities: string[]; - projects: Project[]; +export class RoleComponent implements OnInit, OnDestroy { + roles$ = new BehaviorSubject([]); - selectedAuthority: any; - selectedProject: Project; + @Input() + get roles(): Role[] { return this.roles$.value } + set roles(newValue: Role[]) { this.roles$.next(newValue || []); } + + selectedAuthority: Authority = null; + selectedProject: Project = null; + selectedOrganization: Organization = null; + allowedAuthorityNames = new Set([ + 'ROLE_SYS_ADMIN', + 'ROLE_ORGANIZATION_ADMIN', + 'ROLE_PROJECT_ADMIN', + ]); + authorities$: Observable; + projects$: Observable; + organizations$: Observable; + + subscriptions = new Subscription(); constructor( - private authorityService: AuthorityService, - private projectService: ProjectService, + public authorityService: AuthorityService, + public projectService: ProjectService, + public organizationService: OrganizationService, private alertService: AlertService, private eventManager: EventManager ) { + this.authorities$ = combineLatest([ + authorityService.authorities$, + this.roles$, + ]).pipe( + map(([authorities, roles]) => + authorities.filter(a => this.allowedAuthorityNames.has(a.name) + && (a.scope !== Scope.GLOBAL || !roles.some(r => r.authorityName === a.name))) + ), + ); + this.projects$ = combineLatest([ + projectService.projects$, + this.roles$, + ]).pipe( + map(([projects, roles]) => { + if (projects) { + const mappedProjects = new Set(roles + .filter(r => r.authorityName === 'ROLE_PROJECT_ADMIN') + .map(r => r.projectId) + ) + return projects.filter(p => !mappedProjects.has(p.id)); + } else { + return []; + } + }), + ) + this.organizations$ = combineLatest([ + organizationService.organizations$, + this.roles$, + ]).pipe( + map(([organizations, roles]) => { + if (organizations) { + const mappedOrganizations = new Set(roles + .filter(r => r.authorityName === 'ROLE_ORGANIZATION_ADMIN') + .map(r => r.organizationId) + ); + return organizations.filter(o => !mappedOrganizations.has(o.id)) + } else { + return []; + } + } + ) + ); } ngOnInit() { - if (this.roles === null) { - this.roles = []; - } - this.authorityService.findAll().subscribe(res => { - this.authorities = res; - }); - this.projectService.query().subscribe((res: HttpResponse) => { - this.projects = res.body; - }); + this.subscriptions.add(this.registerRoleChanged()); + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } + + private registerRoleChanged(): Subscription { + return this.roles$.pipe( + distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), + skip(1), + ).subscribe(roles => { + this.eventManager.broadcast({name: 'roleListModification', content: roles}); + }) } trackId(index: number, item: Role) { @@ -46,29 +114,45 @@ export class RoleComponent implements OnInit { } addRole() { - const newRole = new Role(); - newRole.authorityName = this.selectedAuthority; - newRole.projectId = this.selectedProject.id; - newRole.projectName = this.selectedProject.projectName; - if (this.hasRole(newRole)) { + if (!this.selectedAuthority) { + return; + } + const newRole: Role = { authorityName: this.selectedAuthority.name }; + const scope = this.selectedAuthority.scope; + if (scope === Scope.ORGANIZATION) { + newRole.organizationId = this.selectedOrganization.id; + newRole.organizationName = this.selectedOrganization.name; + } else if (scope === Scope.PROJECT) { + newRole.projectId = this.selectedProject.id; + newRole.projectName = this.selectedProject.projectName; + } + const currentRoles = this.roles$.value; + if (currentRoles.some(this.matchRole(newRole))) { this.alertService.error('userManagement.role.error.alreadyExist', null, null); } else { - this.roles.push(newRole); + this.roles$.next([...currentRoles, newRole]); } - this.eventManager.broadcast({name: 'roleListModification', content: this.roles}); } - hasRole(role: Role): boolean { - return this.roles.some(v => v.projectId === role.projectId && - v.authorityName === role.authorityName); + removeRole(role: Role) { + const newRoles = [...this.roles$.value]; + newRoles.splice(newRoles.findIndex(this.matchRole(role)), 1); + this.roles$.next(newRoles); } - removeRole(role: Role) { - this.roles.splice(this.roles.findIndex(v => v.projectId === role.projectId && v.authorityName === role.authorityName), 1); - this.eventManager.broadcast({name: 'roleListModification', content: this.roles}); + private matchRole(role: Role): (Role) => boolean { + if (role.projectId) { + return v => v.authorityName === role.authorityName + && v.projectId === role.projectId; + } else if (role.organizationId) { + return v => v.authorityName === role.authorityName + && v.organizationId === role.organizationId; + } else { + return v => v.authorityName === role.authorityName; + } } - trackProjectById(index: number, item: Project) { + trackEntityById(index: number, item: Project) { return item.id; } } diff --git a/src/main/webapp/app/admin/user-management/role.model.ts b/src/main/webapp/app/admin/user-management/role.model.ts index 66da6ba2f..92a1da357 100644 --- a/src/main/webapp/app/admin/user-management/role.model.ts +++ b/src/main/webapp/app/admin/user-management/role.model.ts @@ -1,9 +1,8 @@ -export class Role { - constructor( - public id?: number, - public authorityName?: string, - public projectId?: number, - public projectName?: string, - ) { - } +export interface Role { + id?: number; + authorityName?: string; + projectId?: number; + projectName?: string; + organizationId?: number; + organizationName?: string; } diff --git a/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts index 58d2678fd..09a001b73 100644 --- a/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts +++ b/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts @@ -1,10 +1,12 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { User, UserService } from '../../shared'; import { EventManager } from '../../shared/util/event-manager.service'; import { UserModalService } from './user-modal.service'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable } from 'rxjs'; @Component({ selector: 'jhi-user-mgmt-delete-dialog', @@ -41,24 +43,16 @@ export class UserMgmtDeleteDialogComponent { selector: 'jhi-user-delete-dialog', template: '', }) -export class UserDeleteDialogComponent implements OnInit, OnDestroy { - - modalRef: NgbModalRef; - routeSub: any; +export class UserDeleteDialogComponent extends ObservablePopupComponent { constructor( - private route: ActivatedRoute, + route: ActivatedRoute, private userModalService: UserModalService, ) { + super(route); } - ngOnInit() { - this.routeSub = this.route.params.subscribe((params) => { - this.modalRef = this.userModalService.open(UserMgmtDeleteDialogComponent, params['login']); - }); - } - - ngOnDestroy() { - this.routeSub.unsubscribe(); + createModalRef(params: Params): Observable { + return this.userModalService.open(UserMgmtDeleteDialogComponent, params['login']); } } diff --git a/src/main/webapp/app/admin/user-management/user-management-dialog.component.html b/src/main/webapp/app/admin/user-management/user-management-dialog.component.html index 0184e902f..aae79a080 100644 --- a/src/main/webapp/app/admin/user-management/user-management-dialog.component.html +++ b/src/main/webapp/app/admin/user-management/user-management-dialog.component.html @@ -82,7 +82,7 @@
-
+
+ - - - - + - +

@@ -36,7 +30,6 @@

- @@ -54,7 +47,7 @@

[translate]="'userManagement.deactivated'"> @@ -62,12 +55,8 @@

{{role.authorityName}} - {{role.authorityName}} -
- - -
- {{role.projectName}} + {{role.authorityName}}: {{role.organizationName}} + {{role.authorityName}}: {{role.projectName}}
{{user.createdDate | date:'dd/MM/yy HH:mm'}} @@ -89,7 +78,7 @@

- diff --git a/src/main/webapp/app/admin/user-management/user-management.component.ts b/src/main/webapp/app/admin/user-management/user-management.component.ts index c176e663e..c82190bc7 100644 --- a/src/main/webapp/app/admin/user-management/user-management.component.ts +++ b/src/main/webapp/app/admin/user-management/user-management.component.ts @@ -6,18 +6,18 @@ import { ITEMS_PER_PAGE, Principal, User, UserService } from '../../shared'; import { AlertService } from '../../shared/util/alert.service'; import { EventManager } from '../../shared/util/event-manager.service'; import { parseLinks } from '../../shared/util/parse-links-util'; +import { Subject, Subscription } from "rxjs"; +import {debounceTime, distinctUntilChanged} from "rxjs/operators"; @Component({ selector: 'jhi-user-mgmt', templateUrl: './user-management.component.html', }) export class UserMgmtComponent implements OnInit, OnDestroy { - - currentAccount: any; users: User[]; error: any; success: any; - routeData: any; + subscriptions: Subscription = new Subscription(); links: any; totalItems: any; queryCount: any; @@ -31,63 +31,69 @@ export class UserMgmtComponent implements OnInit, OnDestroy { byLogin: string; byEmail: string; + filter: Subject = new Subject(); + constructor( - private userService: UserService, - private alertService: AlertService, - private principal: Principal, - private eventManager: EventManager, - private activatedRoute: ActivatedRoute, - private router: Router, + private userService: UserService, + private alertService: AlertService, + public principal: Principal, + private eventManager: EventManager, + private activatedRoute: ActivatedRoute, + private router: Router, ) { this.itemsPerPage = ITEMS_PER_PAGE; - this.routeData = this.activatedRoute.data.subscribe((data) => { + this.subscriptions.add(this.activatedRoute.data.subscribe((data) => { this.page = data['pagingParams'].page; this.previousPage = data['pagingParams'].page; this.reverse = data['pagingParams'].ascending; this.predicate = data['pagingParams'].predicate; - }); + })); + + this.subscriptions.add(this.filter.pipe(debounceTime(300), distinctUntilChanged()).subscribe(() => this.applyFilter())); } ngOnInit() { - this.principal.identity().then((account) => { - this.currentAccount = account; - this.loadAll(); - this.registerChangeInUsers(); - }); + this.loadAll(); + this.registerChangeInUsers(); } ngOnDestroy() { - this.routeData.unsubscribe(); + this.subscriptions.unsubscribe(); } registerChangeInUsers() { - this.eventManager.subscribe('userListModification', () => this.loadAll()); + this.subscriptions.add( + this.eventManager.subscribe('userListModification', () => this.loadAll()) + ); } - onChange(event: any) { - this.userService.query({ - page: this.page - 1, - size: this.itemsPerPage, - authority: this.byAuthority, - email: this.byEmail, - login: this.byLogin, - projectName: this.byProject, - sort: this.sort(), - }).subscribe( - (res: HttpResponse) => this.onSuccess(res.body, res.headers), - (res: HttpErrorResponse) => this.onError(res), + applyFilter() { + this.subscriptions.add( + this.userService.query({ + page: this.page - 1, + size: this.itemsPerPage, + authority: this.byAuthority, + email: this.byEmail, + login: this.byLogin, + projectName: this.byProject, + sort: this.sort(), + }).subscribe( + (res: HttpResponse) => this.onSuccess(res.body, res.headers), + (res: HttpErrorResponse) => this.onError(res), + ) ); - } loadAll() { - this.userService.query({ - page: this.page - 1, - size: this.itemsPerPage, - sort: this.sort(), - }).subscribe( - (res: HttpResponse) => this.onSuccess(res.body, res.headers), - (res: HttpErrorResponse) => this.onError(res), + this.subscriptions.add( + this.userService.query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort(), + }).subscribe( + (res: HttpResponse) => this.onSuccess(res.body, res.headers), + (res: HttpErrorResponse) => this.onError(res), + ) ); } diff --git a/src/main/webapp/app/admin/user-management/user-mgnt-send-activation.component.ts b/src/main/webapp/app/admin/user-management/user-mgnt-send-activation.component.ts index 691cd6959..16679de02 100644 --- a/src/main/webapp/app/admin/user-management/user-mgnt-send-activation.component.ts +++ b/src/main/webapp/app/admin/user-management/user-mgnt-send-activation.component.ts @@ -1,10 +1,12 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { User, UserService } from '../../shared'; import { EventManager } from '../../shared/util/event-manager.service'; import { UserModalService } from './user-modal.service'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable } from 'rxjs'; @Component({ selector: 'jhi-user-mgnt-send-activation-dialog', @@ -41,24 +43,15 @@ export class UserSendActivationLinkDialogComponent { selector: 'jhi-user-send-activation-dialog', template: '', }) -export class UserSendActivationLinkComponent implements OnInit, OnDestroy { - - modalRef: NgbModalRef; - routeSub: any; - +export class UserSendActivationLinkComponent extends ObservablePopupComponent { constructor( - private route: ActivatedRoute, + route: ActivatedRoute, private userModalService: UserModalService, ) { + super(route); } - ngOnInit() { - this.routeSub = this.route.params.subscribe((params) => { - this.modalRef = this.userModalService.open(UserSendActivationLinkDialogComponent, params['login']); - }); - } - - ngOnDestroy() { - this.routeSub.unsubscribe(); + createModalRef(params: Params): Observable { + return this.userModalService.open(UserSendActivationLinkDialogComponent, params['login']); } } diff --git a/src/main/webapp/app/admin/user-management/user-modal.service.ts b/src/main/webapp/app/admin/user-management/user-modal.service.ts index 9313cc54f..9f75805f8 100644 --- a/src/main/webapp/app/admin/user-management/user-modal.service.ts +++ b/src/main/webapp/app/admin/user-management/user-modal.service.ts @@ -4,7 +4,8 @@ import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { User, UserService } from '../../shared'; import { SYSTEM_ADMIN } from '../../shared/constants/common.constants'; -import { Role } from './role.model'; +import { Observable, of } from 'rxjs'; +import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class UserModalService { @@ -17,31 +18,28 @@ export class UserModalService { ) { } - open(component: any, login?: string, admin?: boolean): NgbModalRef { + open(component: any, login?: string, admin?: boolean): Observable { if (this.isOpen) { return; } this.isOpen = true; if (admin) { - const user = new User(); - user.authorities = [SYSTEM_ADMIN]; - const adminRole = new Role(); - adminRole.authorityName = SYSTEM_ADMIN; - user.roles = [adminRole]; - return this.userModalRef(component, user, true); + const user = { + authorities: [SYSTEM_ADMIN], + roles: [{ + authorityName: SYSTEM_ADMIN + }], + } + return of(this.userModalRef(component, user, true)); } if (login) { - this.userService.find(login) - .subscribe((user) => { - if (user.authorities.indexOf(SYSTEM_ADMIN) > -1) { - return this.userModalRef(component, user, true); - } - return this.userModalRef(component, user, false); - }); + return this.userService.find(login).pipe( + map((user) => this.userModalRef(component, user, user.authorities.indexOf(SYSTEM_ADMIN) > -1)), + ); } else { - return this.userModalRef(component, new User(), false); + return of(this.userModalRef(component, { authorities: [] }, false)); } } diff --git a/src/main/webapp/app/app.module.ts b/src/main/webapp/app/app.module.ts index 55b0c7178..7edb4ff80 100644 --- a/src/main/webapp/app/app.module.ts +++ b/src/main/webapp/app/app.module.ts @@ -13,7 +13,7 @@ import { ManagementPortalAccountModule } from './account/account.module'; import { ManagementPortalAdminModule } from './admin/admin.module'; import { PaginationConfig } from './blocks/config/uib-pagination.config'; import { ManagementPortalEntityModule } from './entities/entity.module'; -import { ManagementPortalHomeModule } from './home/home.module'; +import { ManagementPortalHomeModule } from './home'; import { ActiveMenuDirective, @@ -25,11 +25,14 @@ import { PageRibbonComponent, } from './layouts'; -import { LANGUAGES, ManagementPortalSharedModule } from './shared'; -import { AuthInterceptor } from './blocks/interceptor/auth.interceptor'; -import { AuthExpiredInterceptor } from './blocks/interceptor/auth-expired.interceptor'; +import { LANGUAGES, ManagementPortalSharedModule} from './shared'; import { ErrorHandlerInterceptor } from './blocks/interceptor/errorhandler.interceptor'; import { NotificationInterceptor } from './blocks/interceptor/notification.interceptor'; +import { APP_BASE_HREF, PlatformLocation } from "@angular/common"; + +export function getBaseHref(platformLocation: PlatformLocation): string { + return platformLocation.getBaseHrefFromDOM(); +} @NgModule({ imports: [ @@ -61,16 +64,6 @@ import { NotificationInterceptor } from './blocks/interceptor/notification.inter ], providers: [ PaginationConfig, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthInterceptor, - multi: true, - }, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthExpiredInterceptor, - multi: true, - }, { provide: HTTP_INTERCEPTORS, useClass: ErrorHandlerInterceptor, @@ -81,6 +74,11 @@ import { NotificationInterceptor } from './blocks/interceptor/notification.inter useClass: NotificationInterceptor, multi: true, }, + { + provide: APP_BASE_HREF, + useFactory: getBaseHref, + deps: [PlatformLocation] + } ], bootstrap: [JhiMainComponent], }) diff --git a/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts deleted file mode 100644 index f6a1c25d6..000000000 --- a/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; -import { - HttpHandler, - HttpRequest, - HttpInterceptor, - HttpEvent, -} from '@angular/common/http'; -import {AuthServerProvider, AuthService, Principal} from '../../shared'; - -@Injectable() -export class AuthExpiredInterceptor implements HttpInterceptor { - - constructor( - private auth: AuthService, - private authServerProvider: AuthServerProvider, - private principal: Principal, - ) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - tap({ - error: () => { - if (this.principal.isAuthenticated()) { - this.auth.authorize(true); - } else { - this.authServerProvider.logout(); - } - } - }) - ); - } -} diff --git a/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts deleted file mode 100644 index fb7692331..000000000 --- a/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Injectable } from '@angular/core'; -import {Observable} from 'rxjs'; -import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; -import {AuthServerProvider, TokenData} from '../../shared'; - -@Injectable() -export class AuthInterceptor implements HttpInterceptor { - - constructor( - private authServerProvider: AuthServerProvider, - ) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - const tokenString: string = this.authServerProvider.getToken(); - if (!!tokenString) { - const token: TokenData = JSON.parse(tokenString); - if (!!token && token.expires_at && token.expires_at > new Date().getTime()) { - const newReq = request.clone({ - setHeaders: { - Authorization: 'Bearer ' + token.access_token - } - }); - return next.handle(newReq); - } - } - return next.handle(request); - } -} diff --git a/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts index a63bb4493..497db0937 100644 --- a/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts +++ b/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Injector } from '@angular/core'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { @@ -10,23 +10,34 @@ import { } from '@angular/common/http'; import { EventManager } from '../../shared/util/event-manager.service'; +import { AuthService } from "../../shared"; @Injectable() export class ErrorHandlerInterceptor implements HttpInterceptor { - constructor(private eventManager: EventManager) {} + constructor(private eventManager: EventManager, private injector: Injector) {} intercept(request: HttpRequest, next: HttpHandler): Observable> { return next.handle(request).pipe( - tap({ - error: (err: HttpErrorResponse) => { - if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('/api/account'))))) { - this.eventManager.broadcast({ - name: 'managementPortalApp.httpError', - content: err - }); - } - } - })); + tap( + () => {}, + (err: HttpErrorResponse) => { + if (err.status === 401) { + this.injector.get(AuthService).resetAuthentication( + // no redirect needed when just checking whether authentication is present. + request.url !== 'api/account' + ); + return; + } + if (err.status === 409 && request.method === 'DELETE') { + // don't report error about this. + return; + } + this.eventManager.broadcast({ + name: 'managementPortalApp.httpError', + content: err + }); + }), + ); } } diff --git a/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts index d0ba332ba..03770a6e1 100644 --- a/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts +++ b/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts @@ -33,8 +33,7 @@ export class NotificationInterceptor implements HttpInterceptor { if (alert) { if (typeof alert === 'string') { if (this.alertService) { - const alertParam = alertParams; - this.alertService.success(alert, { param : alertParam }, null); + this.alertService.success(alert, { param : alertParams }, null); } } } diff --git a/src/main/webapp/app/core/util/operators.ts b/src/main/webapp/app/core/util/operators.ts new file mode 100644 index 000000000..2e00cea38 --- /dev/null +++ b/src/main/webapp/app/core/util/operators.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021. The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * See the file LICENSE in the root of this repository. + */ + +/* + * Function used to workaround https://github.com/microsoft/TypeScript/issues/16069 + * es2019 alternative `const filteredArr = myArr.flatMap((x) => x ? x : []);` + */ +export function isPresent(t: T | undefined | null | void): t is T { + return t !== undefined && t !== null; +} + +export const filterNaN = (input: number): number => isNaN(input) ? 0 : input; diff --git a/src/main/webapp/app/entities/entity.module.ts b/src/main/webapp/app/entities/entity.module.ts index e90fe6775..d35b328f1 100644 --- a/src/main/webapp/app/entities/entity.module.ts +++ b/src/main/webapp/app/entities/entity.module.ts @@ -8,6 +8,7 @@ import { ManagementPortalSourceDataModule } from './source-data/source-data.modu import { ManagementPortalSourceTypeModule } from './source-type/source-type.module'; import { ManagementPortalSourceModule } from './source/general-source.module'; import { ManagementPortalSubjectModule } from './subject/general.subject.module'; +import {ManagementPortalOrganizationModule} from "./organization/organization.module"; /* jhipster-needle-add-entity-module-import - JHipster will add entity modules imports here */ @@ -15,6 +16,7 @@ import { ManagementPortalSubjectModule } from './subject/general.subject.module' imports: [ ManagementPortalSourceModule, ManagementPortalSourceTypeModule, + ManagementPortalOrganizationModule, ManagementPortalProjectModule, ManagementPortalSourceDataModule, ManagementPortalRoleModule, diff --git a/src/main/webapp/app/entities/oauth-client/oauth-client-delete-dialog.component.ts b/src/main/webapp/app/entities/oauth-client/oauth-client-delete-dialog.component.ts index 957aab739..78de46565 100644 --- a/src/main/webapp/app/entities/oauth-client/oauth-client-delete-dialog.component.ts +++ b/src/main/webapp/app/entities/oauth-client/oauth-client-delete-dialog.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Params } from '@angular/router'; import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -8,16 +8,19 @@ import { OAuthClientPopupService } from './oauth-client-popup.service'; import { OAuthClient } from './oauth-client.model'; import { OAuthClientService } from './oauth-client.service'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable, Subscription } from 'rxjs'; @Component({ selector: 'jhi-oauth-client-delete-dialog', templateUrl: './oauth-client-delete-dialog.component.html', }) -export class OAuthClientDeleteDialogComponent implements OnInit { - +export class OAuthClientDeleteDialogComponent implements OnInit, OnDestroy { client: OAuthClient; protectedClient: boolean; + private subscriptions: Subscription = new Subscription(); + constructor( private oauthClientService: OAuthClientService, public activeModal: NgbActiveModal, @@ -29,18 +32,22 @@ export class OAuthClientDeleteDialogComponent implements OnInit { this.protectedClient = this.client.additionalInformation['protected'] === 'true'; } + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } + clear() { this.activeModal.dismiss('cancel'); } confirmDelete(clientId: string) { - this.oauthClientService.delete(clientId).subscribe(() => { + this.subscriptions.add(this.oauthClientService.delete(clientId).subscribe(() => { this.eventManager.broadcast({ name: 'oauthClientListModification', content: 'Deleted OAuth Client', }); this.activeModal.dismiss(true); - }); + })); } } @@ -48,25 +55,15 @@ export class OAuthClientDeleteDialogComponent implements OnInit { selector: 'jhi-oauth-client-delete-popup', template: '', }) -export class OAuthClientDeletePopupComponent implements OnInit, OnDestroy { - - modalRef: NgbModalRef; - routeSub: any; - +export class OAuthClientDeletePopupComponent extends ObservablePopupComponent { constructor( - private route: ActivatedRoute, + route: ActivatedRoute, private oauthClientPopupService: OAuthClientPopupService, ) { + super(route); } - ngOnInit() { - this.routeSub = this.route.params.subscribe((params) => { - this.modalRef = this.oauthClientPopupService - .open(OAuthClientDeleteDialogComponent, params['clientId']); - }); - } - - ngOnDestroy() { - this.routeSub.unsubscribe(); + createModalRef(params: Params): Observable { + return this.oauthClientPopupService.open(OAuthClientDeleteDialogComponent, params['clientId']); } } diff --git a/src/main/webapp/app/entities/oauth-client/oauth-client-dialog.component.ts b/src/main/webapp/app/entities/oauth-client/oauth-client-dialog.component.ts index 42cd7d4d3..5bd30e372 100644 --- a/src/main/webapp/app/entities/oauth-client/oauth-client-dialog.component.ts +++ b/src/main/webapp/app/entities/oauth-client/oauth-client-dialog.component.ts @@ -1,5 +1,5 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -10,6 +10,8 @@ import { OAuthClientPopupService } from './oauth-client-popup.service'; import { OAuthClient } from './oauth-client.model'; import { OAuthClientService } from './oauth-client.service'; import { HttpErrorResponse } from '@angular/common/http'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable } from 'rxjs'; @Component({ selector: 'jhi-oauth-client-dialog', @@ -122,16 +124,6 @@ export class OAuthClientDialogComponent implements OnInit { this.activeModal.dismiss(result); } - private onSaveError(error) { - try { - error.json(); - } catch (exception) { - error.message = error.text(); - } - this.isSaving = false; - this.onError(error); - } - private onError(error) { this.alertService.error(error.message, null, null); } @@ -152,25 +144,15 @@ export class OAuthClientDialogComponent implements OnInit { selector: 'jhi-oauth-client-popup', template: '', }) -export class OAuthClientPopupComponent implements OnInit, OnDestroy { - - modalRef: NgbModalRef; - routeSub: any; - +export class OAuthClientPopupComponent extends ObservablePopupComponent { constructor( - private route: ActivatedRoute, + route: ActivatedRoute, private oauthClientPopupService: OAuthClientPopupService, ) { + super(route); } - ngOnInit() { - this.routeSub = this.route.params.subscribe((params) => { - this.modalRef = this.oauthClientPopupService - .open(OAuthClientDialogComponent, params['clientId']); - }); - } - - ngOnDestroy() { - this.routeSub.unsubscribe(); + createModalRef(params: Params): Observable { + return this.oauthClientPopupService.open(OAuthClientDialogComponent, params['clientId']); } } diff --git a/src/main/webapp/app/entities/oauth-client/oauth-client-pair-info.service.ts b/src/main/webapp/app/entities/oauth-client/oauth-client-pair-info.service.ts index d07d69d62..95d1489bb 100644 --- a/src/main/webapp/app/entities/oauth-client/oauth-client-pair-info.service.ts +++ b/src/main/webapp/app/entities/oauth-client/oauth-client-pair-info.service.ts @@ -3,7 +3,7 @@ import { HttpClient, HttpResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Subject } from '../../shared/subject'; -import { OAuthClient } from './oauth-client.model'; +import { OAuthClient, PairInfo } from './oauth-client.model'; import { createRequestOption } from '../../shared/model/request.utils'; @Injectable({ providedIn: 'root' }) @@ -15,16 +15,16 @@ export class OAuthClientPairInfoService { constructor(private http: HttpClient) { } - get(client: OAuthClient, subject: Subject, persistent: boolean): Observable> { + get(client: OAuthClient, subject: Subject, persistent: boolean): Observable { const params = createRequestOption({ clientId: client.clientId, login: subject.login, persistent: persistent.toString(), }); - return this.http.get(this.pairUrl, {params, observe: 'response'}); + return this.http.get(this.pairUrl, {params}); } - delete(tokenName: string): Observable { - return this.http.delete(this.resourceUrl + '/' + tokenName); + delete(tokenName: string): Observable> { + return this.http.delete(this.resourceUrl + '/' + tokenName, { observe: 'response' }); } } diff --git a/src/main/webapp/app/entities/oauth-client/oauth-client-popup.service.ts b/src/main/webapp/app/entities/oauth-client/oauth-client-popup.service.ts index 600bfdd00..1ff343378 100644 --- a/src/main/webapp/app/entities/oauth-client/oauth-client-popup.service.ts +++ b/src/main/webapp/app/entities/oauth-client/oauth-client-popup.service.ts @@ -5,6 +5,8 @@ import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { OAuthClient } from './oauth-client.model'; import { OAuthClientService } from './oauth-client.service'; +import { Observable, of } from 'rxjs'; +import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class OAuthClientPopupService { @@ -18,18 +20,18 @@ export class OAuthClientPopupService { ) { } - open(component: any, clientId?: string): NgbModalRef { + open(component: any, clientId?: string): Observable { if (this.isOpen) { return; } this.isOpen = true; if (clientId) { - this.oauthClientService.find(clientId).subscribe((client) => { - this.oauthClientModalRef(component, client); - }); + return this.oauthClientService.find(clientId).pipe( + map((client) => this.oauthClientModalRef(component, client)), + ); } else { - return this.oauthClientModalRef(component, new OAuthClient()); + return of(this.oauthClientModalRef(component, new OAuthClient())); } } diff --git a/src/main/webapp/app/entities/oauth-client/oauth-client.model.ts b/src/main/webapp/app/entities/oauth-client/oauth-client.model.ts index c768ac600..931e61fc7 100644 --- a/src/main/webapp/app/entities/oauth-client/oauth-client.model.ts +++ b/src/main/webapp/app/entities/oauth-client/oauth-client.model.ts @@ -38,3 +38,13 @@ export class OAuthClient { this.registeredRedirectUri = registeredRedirectUri ? registeredRedirectUri : []; } } + +export interface PairInfo { + tokenName: string; + tokenUrl: string; + baseUrl: string; + timeout: number; + timesOutAt: string; + timeOutDate?: string; + timeoutString?: string; +} diff --git a/src/main/webapp/app/entities/organization/index.ts b/src/main/webapp/app/entities/organization/index.ts new file mode 100644 index 000000000..cf23e4297 --- /dev/null +++ b/src/main/webapp/app/entities/organization/index.ts @@ -0,0 +1,6 @@ +export * from './organization-popup.service'; +export * from './organization-dialog.component'; +export * from './organization-delete-dialog.component'; +export * from './organization-detail.component'; +export * from './organization.component'; +export * from './organization.route'; diff --git a/src/main/webapp/app/entities/organization/organization-delete-dialog.component.html b/src/main/webapp/app/entities/organization/organization-delete-dialog.component.html new file mode 100644 index 000000000..c9eaa0bd2 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-delete-dialog.component.html @@ -0,0 +1,21 @@ +
+ + + +
diff --git a/src/main/webapp/app/entities/organization/organization-delete-dialog.component.ts b/src/main/webapp/app/entities/organization/organization-delete-dialog.component.ts new file mode 100644 index 000000000..d3c26c5c6 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-delete-dialog.component.ts @@ -0,0 +1,52 @@ +import { Component } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; + +import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; + +import { OrganizationPopupService } from './organization-popup.service'; + +import { Organization, OrganizationService } from '../../shared'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'jhi-organization-delete-dialog', + templateUrl: './organization-delete-dialog.component.html', +}) +export class OrganizationDeleteDialogComponent { + + organization: Organization; + + constructor( + private organizationService: OrganizationService, + public activeModal: NgbActiveModal, + ) { + } + + clear() { + this.activeModal.dismiss('cancel'); + } + + confirmDelete(organizationName: string) { + this.organizationService.delete(organizationName).subscribe(() => { + this.activeModal.dismiss(true); + }); + } +} + +@Component({ + selector: 'jhi-organization-delete-popup', + template: '', +}) +export class OrganizationDeletePopupComponent extends ObservablePopupComponent { + constructor( + route: ActivatedRoute, + private organizationPopupService: OrganizationPopupService, + ) { + super(route); + } + + createModalRef(params: Params): Observable { + return this.organizationPopupService.open(OrganizationDeleteDialogComponent, params['organizationName']); + } +} diff --git a/src/main/webapp/app/entities/organization/organization-detail.component.html b/src/main/webapp/app/entities/organization/organization-detail.component.html new file mode 100644 index 000000000..aef3e52d4 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-detail.component.html @@ -0,0 +1,54 @@ +
+ +

+ + : + {{organization.name}} + + +

+
+
+
+ +

{{organization.name}}

+
+
+ +

{{organization.location}}

+
+
+

+ {{organization.description}} +

+
+ + + +
+ + + +
+
+
diff --git a/src/main/webapp/app/entities/organization/organization-detail.component.scss b/src/main/webapp/app/entities/organization/organization-detail.component.scss new file mode 100644 index 000000000..44a6cf0fb --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-detail.component.scss @@ -0,0 +1,27 @@ + +.organization-detail__organization-info { + padding: 8px 16px; + + > div { + display: flex; + } +} +.organization-detail__organization-info-fields { + > div { + margin-right: 16px; + + > span { + font-weight: bold; font-size: 12px; color: #bebebe; + } + } +} +.organization-detail__description { + padding: 8px 8px; + border-left: 2px solid #dadada; + color: #888; + white-space: pre-line; +} + +#organization-content-wrapper { + padding: 16px 0; +} diff --git a/src/main/webapp/app/entities/organization/organization-detail.component.spec.ts b/src/main/webapp/app/entities/organization/organization-detail.component.spec.ts new file mode 100644 index 000000000..0206bb98d --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-detail.component.spec.ts @@ -0,0 +1,60 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EventManager } from '../../shared/util/event-manager.service'; +import { ManagementPortalTestModule } from '../../shared/util/test/test.module'; +import { MockActivatedRoute } from '../../shared/util/test/mock-route.service'; +import { ProjectService } from '../../shared/project'; +import { OrganizationDetailComponent } from './organization-detail.component'; +import { first } from 'rxjs/operators'; + +describe('Component Tests', () => { + + describe('Organization Detail Component', () => { + let comp: OrganizationDetailComponent; + let fixture: ComponentFixture; + let service: ProjectService; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ManagementPortalTestModule], + declarations: [OrganizationDetailComponent], + providers: [ + DatePipe, + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({organizationName: 'testOrganization'}) + }, + ProjectService, + EventManager + ] + }).overrideTemplate(OrganizationDetailComponent, '').compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrganizationDetailComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(ProjectService); + }); + + describe('OnInit', () => { + it('Should call load all on init', waitForAsync(async () => { + // GIVEN + + spyOn(service, 'find').and.returnValue(of({id: 10, organization: {name: 'test'}})); + + // WHEN + comp.ngOnInit(); + + // THEN + const org = await comp.organization$.pipe(first()).toPromise(); + expect(org).toEqual(jasmine.objectContaining({id: 10, organization: {name: 'test'}})); + + expect(service.find).toHaveBeenCalledWith('testOrganization'); + + })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/organization/organization-detail.component.ts b/src/main/webapp/app/entities/organization/organization-detail.component.ts new file mode 100644 index 000000000..362b98f83 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-detail.component.ts @@ -0,0 +1,68 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { combineLatest, Observable } from 'rxjs'; +import { Organization, OrganizationService, Principal } from '../../shared'; +import { EventManager } from '../../shared/util/event-manager.service'; +import { distinctUntilChanged, filter, map, pluck, shareReplay, switchMap } from 'rxjs/operators'; + +@Component({ + selector: 'jhi-organization-detail', + templateUrl: './organization-detail.component.html', + styleUrls: ['organization-detail.component.scss'], +}) +export class OrganizationDetailComponent implements OnInit { + organization$: Observable; + userRoles$: Observable<{ organizationAdmin: boolean }> + + showProjects: boolean; + showPermissions: boolean; + + constructor( + private eventManager: EventManager, + private organizationService: OrganizationService, + private route: ActivatedRoute, + public principal: Principal, + ) { + } + + ngOnInit() { + this.organization$ = this.observeOrganization(); + this.userRoles$ = this.observeUserRoles(this.organization$); + this.viewProjects(); + } + + private observeOrganization(): Observable { + return this.route.params.pipe( + pluck('organizationName'), + filter(orgName => !!orgName), // ensure that organization name is set + distinctUntilChanged(), // no need to trigger duplicate requests + switchMap((orgName) => this.organizationService.find(orgName)), // get organization + shareReplay(1), + ); + } + + private observeUserRoles(organization$: Observable): Observable<{ organizationAdmin: boolean }> { + return combineLatest([ + organization$, + this.principal.account$, + ]).pipe( + map(([organization , account]) => ({ + organizationAdmin: organization && this.principal.accountHasAnyAuthority(account, ['ROLE_SYS_ADMIN', 'ROLE_ORGANIZATION_ADMIN:' + organization.name]), + })), + ); + } + + previousState() { + window.history.back(); + } + + viewProjects() { + this.showProjects = true; + this.showPermissions = false; + } + + viewPermissions() { + this.showProjects = false; + this.showPermissions = true; + } +} diff --git a/src/main/webapp/app/entities/organization/organization-dialog.component.html b/src/main/webapp/app/entities/organization/organization-dialog.component.html new file mode 100644 index 000000000..b7f2a0fca --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-dialog.component.html @@ -0,0 +1,83 @@ +
+ + + + +
diff --git a/src/main/webapp/app/entities/organization/organization-dialog.component.scss b/src/main/webapp/app/entities/organization/organization-dialog.component.scss new file mode 100644 index 000000000..4cb755036 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-dialog.component.scss @@ -0,0 +1,25 @@ +.selected-source-types > .badge { + margin: 2px; + cursor: pointer; +} + +.dropdown-menu.show { + display: block; +} + +.organization-dialog__existing-groups:not(:empty) { + padding: 8px; + margin-bottom: 8px; +} +.organization-dialog__existing-groups > .badge { + margin: 2px; + cursor: pointer; +} +.organization-dialog__new-group { + display: flex; + align-items: flex-end; +} +.organization-dialog__new-group > *:first-child { + flex-grow: 1; + margin-right: 16px; +} diff --git a/src/main/webapp/app/entities/organization/organization-dialog.component.ts b/src/main/webapp/app/entities/organization/organization-dialog.component.ts new file mode 100644 index 000000000..8b92ea294 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-dialog.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Params, Router } from '@angular/router'; + +import { NgbActiveModal, NgbModalRef, } from '@ng-bootstrap/ng-bootstrap'; + +import { AlertService } from '../../shared/util/alert.service'; +import { EventManager } from '../../shared/util/event-manager.service'; +import { SourceTypeService } from '../source-type'; +import { OrganizationPopupService } from './organization-popup.service'; + +import { copyOrganization, Organization, OrganizationService, ProjectService } from '../../shared'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; +import { Observable, Subscription } from 'rxjs'; + +@Component({ + selector: 'jhi-organization-dialog', + templateUrl: './organization-dialog.component.html', + styleUrls: ['organization-dialog.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class OrganizationDialogComponent implements OnDestroy { + readonly authorities: any[]; + readonly options: string[]; + + organization: Organization; + isSaving: boolean; + organizationIdAsPrettyValue: boolean; + + private subscriptions: Subscription = new Subscription(); + + constructor( + public activeModal: NgbActiveModal, + private alertService: AlertService, + private organizationService: OrganizationService, + private sourceTypeService: SourceTypeService, + private eventManager: EventManager, + private router: Router, + private projectService: ProjectService, + ) { + this.isSaving = false; + this.authorities = ['ROLE_USER', 'ROLE_SYS_ADMIN', 'ROLE_PROJECT_ADMIN']; + this.options = ['Work-package', 'Phase', 'External-organization-url', 'External-organization-id', 'Privacy-policy-url']; + this.organizationIdAsPrettyValue = true; + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } + + clear() { + this.activeModal.dismiss(); + } + + save() { + this.isSaving = true; + if (this.organization.id !== undefined) { + this.subscriptions.add(this.organizationService.update(this.organization).subscribe( + (res: Organization) => this.onSaveSuccess(res), + () => this.onSaveError(), + )); + } else { + this.subscriptions.add(this.organizationService.create(this.organization).subscribe( + (res: Organization) => this.onSaveSuccess(res), + () => this.onSaveError(), + )); + } + } + + private onSaveSuccess(result: Organization) { + if (history.state?.parentComponent === 'organization-detail') { + this.router.navigate(['/organization', result.name]); + } + this.isSaving = false; + this.organization = copyOrganization(result); + this.activeModal.dismiss(result); + } + + private onSaveError() { + this.isSaving = false; + } +} + +@Component({ + selector: 'jhi-organization-popup', + template: '', +}) +export class OrganizationPopupComponent extends ObservablePopupComponent { + constructor( + route: ActivatedRoute, + private organizationPopupService: OrganizationPopupService, + ) { + super(route); + } + + createModalRef(params: Params): Observable { + return this.organizationPopupService.open(OrganizationDialogComponent, params['organizationName']); + } +} diff --git a/src/main/webapp/app/entities/organization/organization-popup.service.ts b/src/main/webapp/app/entities/organization/organization-popup.service.ts new file mode 100644 index 000000000..269043f9d --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization-popup.service.ts @@ -0,0 +1,50 @@ +import { DatePipe } from '@angular/common'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; + +import { copyOrganization, Organization, OrganizationService } from '../../shared'; +import { Observable, of } from 'rxjs'; +import { first, map, take } from 'rxjs/operators'; + +@Injectable({ providedIn: 'root' }) +export class OrganizationPopupService { + private isOpen = false; + + constructor( + private datePipe: DatePipe, + private modalService: NgbModal, + private router: Router, + private organizationService: OrganizationService, + ) { + } + + open(component: any, organizationName?: string): Observable { + if (this.isOpen) { + return; + } + this.isOpen = true; + + if (organizationName) { + return this.organizationService.find(organizationName).pipe( + first(), + map((organization) => this.organizationModalRef(component, organization)), + ) + } else { + return of(this.organizationModalRef(component, {})); + } + } + + organizationModalRef(component: any, organization: Organization): NgbModalRef { + const modalRef = this.modalService.open(component, {size: 'lg', backdrop: 'static'}); + modalRef.componentInstance.organization = copyOrganization(organization); + modalRef.result.then(() => { + this.router.navigate([{outlets: {popup: null}}], {replaceUrl: true}); + this.isOpen = false; + }, () => { + this.router.navigate([{outlets: {popup: null}}], {replaceUrl: true}); + this.isOpen = false; + }); + return modalRef; + } +} diff --git a/src/main/webapp/app/entities/organization/organization.component.html b/src/main/webapp/app/entities/organization/organization.component.html new file mode 100644 index 000000000..b61362c50 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization.component.html @@ -0,0 +1,45 @@ +
+

+ + +

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
{{organization.id}}{{organization.name}}{{organization.description}}{{organization.location}} +
+ +
+
+
+
diff --git a/src/main/webapp/app/entities/organization/organization.component.ts b/src/main/webapp/app/entities/organization/organization.component.ts new file mode 100644 index 000000000..98b1e643a --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization.component.ts @@ -0,0 +1,71 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { Organization, OrganizationService } from '../../shared'; +import { + regularSortOrder, + SortOrder, + SortOrderImpl +} from '../../shared/util/sort-util'; + +@Component({ + selector: 'jhi-organization', + templateUrl: './organization.component.html', +}) +export class OrganizationComponent implements OnInit, OnDestroy { + organizations$: Observable; + private _sortOrder$ = new BehaviorSubject({predicate: 'name', ascending: true}); + sortOrder$: Observable; + subscriptions: Subscription = new Subscription(); + + constructor( + public organizationService: OrganizationService, + private activatedRoute: ActivatedRoute, + private router: Router, + ) { + this.sortOrder$ = this._sortOrder$.pipe(regularSortOrder()); + } + + ngOnInit() { + this.subscriptions.add(this.registerChangeInParams()); + this.subscriptions.add(this.registerChangeInSortOrder()); + + this.organizations$ = combineLatest([ + this.organizationService.organizations$, + this.sortOrder$, + ]).pipe( + map(([organizations, order]) => order.sort(organizations)), + ); + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } + + sort(order: SortOrder) { + console.log('sort', order); + this._sortOrder$.next(order); + } + + private registerChangeInParams(): Subscription { + return this.activatedRoute.data.subscribe(data => { + this._sortOrder$.next(data['pagingParams']); + }); + } + + private registerChangeInSortOrder(): Subscription { + return this.sortOrder$.subscribe( + order => this.router.navigate(['/organization'], { + queryParams: { + sort: order.predicate + ',' + (order.ascending ? 'asc' : 'desc'), + }, + }), + ); + } + + trackName(index: number, item: Organization) { + return item.name; + } +} diff --git a/src/main/webapp/app/entities/organization/organization.module.ts b/src/main/webapp/app/entities/organization/organization.module.ts new file mode 100644 index 000000000..d6e37e642 --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization.module.ts @@ -0,0 +1,54 @@ +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { ManagementPortalSharedModule } from '../../shared'; +import { ManagementPortalSharedSourceModule } from '../../shared/source/source.module'; +import { + OrganizationComponent, + OrganizationDeleteDialogComponent, + OrganizationDeletePopupComponent, + OrganizationDetailComponent, + OrganizationDialogComponent, + OrganizationPopupComponent, + organizationPopupRoute, + organizationRoute, +} from './'; +import {ManagementPortalSharedGroupModule} from "../../shared/group/group.module"; +import {ManagementPortalProjectModule} from "../project/project.module"; +import {ManagementPortalSharedSubjectModule} from "../../shared/subject/subject.module"; +import {ManagementPortalSharedPermissionModule} from "../../shared/permission/permissions.module"; + +const ENTITY_STATES = [ + ...organizationRoute, + ...organizationPopupRoute, +]; + +@NgModule({ + imports: [ + ManagementPortalSharedModule, + ManagementPortalProjectModule, + ManagementPortalSharedSourceModule, + ManagementPortalSharedSubjectModule, + ManagementPortalSharedGroupModule, + RouterModule.forRoot(ENTITY_STATES, {useHash: true}), + ManagementPortalSharedPermissionModule, + ], + declarations: [ + OrganizationComponent, + OrganizationDetailComponent, + OrganizationDialogComponent, + OrganizationDeleteDialogComponent, + OrganizationPopupComponent, + OrganizationDeletePopupComponent, + ], + entryComponents: [ + OrganizationComponent, + OrganizationDialogComponent, + OrganizationPopupComponent, + OrganizationDeleteDialogComponent, + OrganizationDeletePopupComponent, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class ManagementPortalOrganizationModule { +} diff --git a/src/main/webapp/app/entities/organization/organization.route.ts b/src/main/webapp/app/entities/organization/organization.route.ts new file mode 100644 index 000000000..bd960547b --- /dev/null +++ b/src/main/webapp/app/entities/organization/organization.route.ts @@ -0,0 +1,68 @@ +import { Routes } from '@angular/router'; + +import { UserRouteAccessService } from '../../shared'; +import {ORGANIZATION_ADMIN, PROJECT_ADMIN, SYSTEM_ADMIN} from '../../shared/constants/common.constants'; +import { OrganizationComponent } from './organization.component'; +import { OrganizationDeletePopupComponent } from './organization-delete-dialog.component'; +import { OrganizationDetailComponent } from './organization-detail.component'; +import { OrganizationPopupComponent } from './organization-dialog.component'; + +import { ResolvePagingParams } from '../../shared/commons'; + +export const organizationRoute: Routes = [ + { + path: 'organization', + runGuardsAndResolvers: 'paramsOrQueryParamsChange', + resolve: { + 'pagingParams': ResolvePagingParams, + }, + component: OrganizationComponent, + data: { + authorities: [SYSTEM_ADMIN], + pageTitle: 'managementPortalApp.organization.home.title', + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'organization/:organizationName', + component: OrganizationDetailComponent, + data: { + authorities: [SYSTEM_ADMIN, ORGANIZATION_ADMIN, PROJECT_ADMIN], + pageTitle: 'managementPortalApp.organization.home.title', + }, + canActivate: [UserRouteAccessService], + }, +]; + +export const organizationPopupRoute: Routes = [ + { + path: 'organization-new', + component: OrganizationPopupComponent, + data: { + authorities: [SYSTEM_ADMIN], + pageTitle: 'managementPortalApp.organization.home.title', + }, + canActivate: [UserRouteAccessService], + outlet: 'popup', + }, + { + path: 'organization/:organizationName/edit', + component: OrganizationPopupComponent, + data: { + authorities: [SYSTEM_ADMIN, ORGANIZATION_ADMIN], + pageTitle: 'managementPortalApp.organization.home.title', + }, + canActivate: [UserRouteAccessService], + outlet: 'popup', + }, + // { + // path: 'organization/:organizationName/delete', + // component: OrganizationDeletePopupComponent, + // data: { + // authorities: [SYSTEM_ADMIN], + // pageTitle: 'managementPortalApp.organization.home.title', + // }, + // canActivate: [UserRouteAccessService], + // outlet: 'popup', + // }, +]; diff --git a/src/main/webapp/app/entities/project/project-delete-dialog.component.ts b/src/main/webapp/app/entities/project/project-delete-dialog.component.ts index bc489e4e9..b5896050a 100644 --- a/src/main/webapp/app/entities/project/project-delete-dialog.component.ts +++ b/src/main/webapp/app/entities/project/project-delete-dialog.component.ts @@ -1,5 +1,5 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -7,6 +7,8 @@ import { ProjectPopupService } from './project-popup.service'; import { Project, ProjectService } from '../../shared'; import { EventManager } from '../../shared/util/event-manager.service'; +import { Observable } from 'rxjs'; +import { ObservablePopupComponent } from '../../shared/util/observable-popup.component'; @Component({ selector: 'jhi-project-delete-dialog', @@ -42,25 +44,15 @@ export class ProjectDeleteDialogComponent { selector: 'jhi-project-delete-popup', template: '', }) -export class ProjectDeletePopupComponent implements OnInit, OnDestroy { - - modalRef: NgbModalRef; - routeSub: any; - +export class ProjectDeletePopupComponent extends ObservablePopupComponent { constructor( - private route: ActivatedRoute, + route: ActivatedRoute, private projectPopupService: ProjectPopupService, ) { + super(route); } - ngOnInit() { - this.routeSub = this.route.params.subscribe((params) => { - this.modalRef = this.projectPopupService - .open(ProjectDeleteDialogComponent, params['projectName']); - }); - } - - ngOnDestroy() { - this.routeSub.unsubscribe(); + createModalRef(params: Params): Observable { + return this.projectPopupService.open(ProjectDeleteDialogComponent, null, params['projectName']); } } diff --git a/src/main/webapp/app/entities/project/project-detail.component.html b/src/main/webapp/app/entities/project/project-detail.component.html index 10cae045f..71dcd1d74 100644 --- a/src/main/webapp/app/entities/project/project-detail.component.html +++ b/src/main/webapp/app/entities/project/project-detail.component.html @@ -1,96 +1,108 @@ -
-